前几天360发了一则Apache Dubbo的漏洞预警,@hu3sky师傅让我帮他看看这个漏洞复现的问题。Burp打二进制的反序列化数据有一点bug,这里记录一下解决的过程。
环境搭建
1 | git clone https://github.com/apache/dubbo-samples.git |
修改/dubbo-samples/java/dubbo-samples-http/pom.xml
1
2
3
4
5
6<properties>
<source.level>1.8</source.level>
<target.level>1.8</target.level>
<!--修改版本为2.7.3-->
<dubbo.version>2.7.3</dubbo.version>
...
再加一个dependency,作为gadget:1
2
3
4
5
6<!-- https://mvnrepository.com/artifact/commons-collections/commons-collections -->
<dependency>
<groupId>commons-collections</groupId>
<artifactId>commons-collections</artifactId>
<version>3.2</version>
</dependency>
然后 mvn clean package
接着 mvn -Djava.net.preferIPv4Stack=true -Dexec.mainClass=org.apache.dubbo.samples.http.HttpProvider exec:java
或者扔进idea里,配一个-Djava.net.preferIPv4Stack=true
参数
还要配一个zookeeper:
zookeeper-3.4.14.ta
执行bin/zkServer.sh
,如果提示no such file zoo.cfg
,在conf
目录下把zoo-sample.cfg
改成zoo.cfg
,然后继续执行即可。
漏洞复现
踩了一堆坑,yso生成的反序列化数据,直接贴进burp是有蜜汁bug的,最后的解决办法有两种:
- 在Repeat里用Paste from file (@hu3sky师傅成功了,我没成功)
- 最后翻awesome-burp-extensions找到了Java-Deserialization-Scanner这个burp插件解决的,安利一波:
漏洞分析
在dispatch文件处理http路由分发,/org/apache/dubbo/remoting/http/servlet/DispatcherServlet.java
跟进handle
函数:/org/apache/dubbo/rpc/protocol/http/HttpProtocol.java
判断是否为post请求,然后继续处理Request:/org/springframework/remoting/httpinvoker/HttpInvokerServiceExporter.class
将request的post输入传入:
最后在/org/springframework/remoting/rmi/RemoteInvocationSerializingExporter.class, 调用readObject()
调用栈:
最后
一个sample环境的反序列化,要结合其他组件才能利用,个人感觉危害面不是很大。
新版的修复策略,在处理路由的handle
函数,使用了另外一个组件,且在处理非json数据的时候会抛出异常。