预备知识
SSRF简介
SSRF(Server-Side Request Forgery,服务端请求伪造),是攻击者让服务端发起构造的指定请求链接造成的漏洞。
由于存在防火墙的防护,导致攻击者无法直接入侵内网;这时攻击者可以以服务器为跳板发起一些网络请求,从而攻击内网的应用及获取内网数据。
大都是由于服务端提供了从其他服务器获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等。但又没有对目标地址做严格过滤与限制,导致攻击者可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。
最常见的例子:攻击者传入一个未经验证的URL,后端代码直接请求这个URL,就会造成SSRF漏洞。
SSRF的类型
1)显示对攻击者的响应(basic):在服务器获取攻击者要求的URL后,把响应发送回攻击者。
2)不显示响应(blind):在服务器获取攻击者要求的URL后,不会把响应内容发送给攻击者,需要通过查看服务器日志判断是否存在服务端请求伪造漏洞。
拓展攻击面
结合gopher协议(信息查找系统)、攻击内网FTP、Telnet、Redis、FastCGI、Memcache,也可以进行get、post请求。
实验环境
操作系统:
CentOS:SSRF漏洞环境 + 模拟内网Redis服务;ip:10.1.1.100
Kali Linux:Redis服务 + 漏洞利用;ip:10.1.1.200
辅助工具:Mozilla Firefox、burpsuite
环境部署
1.在CentOS机器中,检测端口开放情况:# netstat -tunlp
保证Apache、MySQL、PHP都开启。
- 下载源码放到网站根目录/var/www/html下:
`cd /var/www/html
下载:# wget http://tools.hetianlab.com/tools/T039.zip
解压:# unzip T039.zip`
3.Kali机器用浏览器访问 http://10.1.1.100/ssrf.html检测环境是否搭建成功:
实验步骤
CentOS机器开启Redis服务,kali机器写定时任务到CentOS机器中。
- Redis服务安装时默认绑定IP为127.0.0.1,此处不需要设置,查看Redis配置文件redis.conf:
#find / -name redis.conf
#vi /root/redis-5.0.4/redis.conf
5.另外开启一个终端,测试启动:
# cd /usr/redis/
# ./redis-cli ping
启动成功。
6.在kali机器写一个redis反弹shell的bash脚本:
# vi shell.sh
保存退出;
Redis的第0个数据库中添加key为1,名为root的定时任务,value字段最后会多一个n是因为echo重定向最后会自带一个换行符,位置为CentOS机器的/var/spool/cron/,10.1.1.200为获取反弹shell的本地IP地址,666为反弹shell的监听端口,可随意设置。
通过gopher协议攻击Redis,如果内网中的Redis存在未授权访问漏洞,当Redis服务以root权限运行时,利用gopher协议攻击内网中的Redis,通过写入定时任务可以实现反弹shell。
- Kali机器另外开启一个终端,使用socat进行端口转发,获取Redis攻击的TCP数据包:
# socat -v tcp-listen:2333,fork tcp-connect:127.0.0.1:6379
将本地的2333端口转发到Redis服务器的6379端口,访问本地的2333端口其实是访问Redis服务器的6379端口。
2.另启一个终端执行脚本:#bash shell.sh 127.0.0.1 2333
3.查看捕获到的数据
4.利用脚本将数据转换成适配于gopher协议的URL,转换规则:
1)如果第一个字符是 > 或者 < ,则丢弃该行字符串,表示请求和返回的时间;
2)如果前三个字符是 +OK,则丢弃该行字符串,表示返回的字符串;
3)将\r字符替换成 %0d%0a;
4)将空白行替换成 %0a。
- 先将socat获取的数据保存为socat.log文件,然后执行脚本进行数据转换:
保存文件。
# python tran2gopher.py socat.log
7.攻击CentOS机器的Redis服务:
在‘有回显的SSRF’处输入gopher://127.0.0.1:6379/_+数据转换的内容:
点击‘TEST IT’后查看监听结果:
成功获取反弹shell。
在浏览器的‘SEE THE RESULT’处也可以看到定时任务写入成功:
漏洞修复
1.限制协议为HTTP、HTTPS;
2.禁止30x跳转;
3.设置URL白名单或限制内网IP。