whip1ash

JBoss JMXInvokerServlet 反序列化漏洞分析 - 从0开始学习Java反序列化 (4)

2018-11-19

0x01 无用之用 是为大用

人皆知有用之用,而莫知无用之用也。
–《庄子·人世间》

前两篇详细的学习了一些Java的基础知识,详细分析了Common-Collections的一个攻击链(TODO: 有机会把Common-Collections所有的攻击链分析一遍),看到这里不禁就要思考了,这个东西在实战中怎么用?

由于Common-Collections是一个jre中的包,所以影响的范围非常广,今儿先看一下如何在JBoss中利用这个漏洞。

0x02 JBoss是什么?

简单的说,JBoss和WebLogic一样,是Web应用服务器。由于学安全一般都是从PHP入门,所以一开始就有两个错误的认识。一个是Apache/Nginx是服务器软件,另一个是URL跟文件路径一定是一个一一对应的关系,比如访问http://www.xxx.com/index.php,那么在根目录下一定有一个index.php文件,而Java不一样了,Java通过servlet来提供Web服务(这样理解比较浅薄),所以刚开始做审计的时候,一脸懵逼,找不到URL对应的代码逻辑在哪里!后来有一些简单的写法,比如RequestMap,全程搜索URL定位RequestMap(蠢得一批)......哈哈,说远了~

说回第一个,Apache/Nginx是服务器软件没有错,但是这两个东西只能够提供静态页面的访问,比如HTML。动态页面需要另外一个软件提供相应的支持,比如在PHP中是fast-cgi(fast-cgi将请求再发给php-cgi)。而在Java中,最熟悉的就是Tomcat,支持Servlet,jsp。JBoss是一个Web应用服务器,能够提供静态页面和动态页面的服务(等于Apache+Tomcat),使用Java编写。这点跟PHP又不太一样,PHP是用C编写的。这种服务器软件介于代码和操作系统之间,所以就是所谓的中间件。

可以看一下这两篇文件

0x03 受影响的版本

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

影响范围还是非常大的

0x04 复现

这里同样使用vulhub,感谢ph师傅,提供了这么好用的平台。
同样,修改docker-compose.yml,添加8787端口,该端口为

1
2
3
4
5
6
7
8
version: '2'
services:
jboss:
image: vulhub/jboss:as-6.1.0
ports:
- "9990:9990"
- "8080:8080"
- "8787:8787"

启动就好了。
复现就不详细说了,网上的资料特别多,一搜一大把。
最简单的方式就是使用现成的工具,比如这个
或者使用ysoserial,像这样
也可以使用RMI,使用RMI的话就复杂了,没有太大意义。

0x05 分析

0x01 开启远程调试

去掉/jboss-6.1.0.Final/bin/run.conf 文件中#JAVA_OPTS="$JAVA_OPTS -Xrunjdwp:transport=dt_socket,address=8787,server=y,suspend=n"#即可。

-w883

docker restart jboss重启docker。

这个docker里居然连netstat都没有,没事,配置一下idea的Remote Debugger(不会配置的同学可以看这里),点击调试按钮,发现连接上了就行。

-w1644

0x02 定位invoke/JMXInvokerServlet

网上有很多复现的方法,但是并没有找到分析的文章,所以只能自己定位相关的代码在哪里。
org.apache.commons.collections.functors.InvokerTransformer中的transform()下断点。这个类在common/lib/commons-collections.jar中。如果点不开jar包的话就将当前目录添加到Libraries中。

-w1235

发包,击中断点!
这里有一个小坑点,击中断点后,一定要让调试器继续执行(Resume),而不是终止(Stop),那样会导致调试进程阻塞(猜的)。

可以看一下调用栈,很简单。

从调用栈点击org.jboss.invacation.http.servlet点不开,因为这个类不在我们的依赖里,那怎么找这个类呢,idea可以很方便的帮我们找到。
-w1443
点开这个路径,可以看见是在这个路径下的jboss-6.1.0.Final/server/default/deploy/http-invoker.sar/invoker.war/WEB-INF/web.xml。这正是我们要找的http-invoker.sar。

可以很方便的找到这个类jboss-6.1.0.Final/server/default/deploy/http-invoker.sar/invoker.war/WEB-INF/classes/org/jboss/invocation/http/servlet/InvokerServlet.class

这里我发现没有办法把断点给打进这个class中,虽然很明显是在这里调用了这个类,但是无法击中断点,尝试把class文件反编译成java,放到该路径下,并且把class这个路径给设置为源代码路径,虽然可以击中断点,但是字节码和源码不匹配,java是用jad反编译过来的。求教!Orz!

0x03 分析

这个代码太简单了,processRequest中直接把我们POST的数据给readObject了,又由于common-collections是jdk的类,所以直接反序列化,RCE!

-w1399

0x06 后记

0x01 补丁

下了一份JBoss 7.0,但是7.0好像改动挺大的,没有找到JMXInvokerServlet。

0x02 关于JMXInvokerServlet(危害程度)

这个接口好像默认是打开的(网上的资料不是特别全)。但是以后遇见JBoss可以试试,万一遇到了呢~

0x03 废话

这篇文章真水!

扫描二维码,分享此文章