CVE-2018-2628 Weblogic反序列化POC重構詳解
01 背景
—
其實核心部分就是JRMP(Java Remote Methodprotocol),在這個PoC中會序列化一個RemoteObjectInvocationHandler,它會利用UnicastRef建立到遠端的tcp連接獲取RMI registry,載入回來再利用readObject解析,從而造成反序列化遠程代碼執行。
02 PoC重構
—
由於互聯網上公開的poc,是通過伺服器向rmi遠程伺服器獲取命令執行代碼從而執行命令並通過t3協議的回報告訴我們是否存在漏洞。但是這樣的poc有很明顯存在不能控制許可權的問題。rmi遠程伺服器的命令執行代碼我們不可控,並且會暴露我們有漏洞的資產,所以我們必須把poc重構成無風險的,也就是將rmi遠程伺服器改成自己的。
但是我們也知道,java會將對象序列化成位元組碼,如何在位元組碼中找到我們需要修改的ip和埠成為了一個問題。以下是我們的解決方法以及可以提供反序列化漏洞的一些研究方案。
我們可以通過 SerializationDumper(https://github.com/NickstaDB/SerializationDumper)將位元組碼的strut解析成我們更容易理解的格式。
將其hex解碼後複製到010Editor里
結合之前SerializationDumper解析的位元組碼的格式我們可以大膽猜測 104.251.228.50前的000E為ip長度,000E轉成10進位就是14,所以我們可以知道該欄位為ip長度,相應的IP之後的為埠號7001。
通過查閱oracle的標準文檔(https://docs.oracle.com/javase/10/docs/specs/serialization/index.html)我們可以了解到java反序列化位元組碼為對象的流程以及位元組碼的一些struct構造。我們可以由SerializationDumper的源碼看出位元組碼事實上是二進位結構體嵌套結構體的產物。
我們在這裡只需要把poc的rmi遠程伺服器指向我們自己的伺服器即可。
由於存在嵌套關係,所以外層長度也需要修改為修改後的長度。
剩下的就是在遠程伺服器上啟用ysoserial.exploit.JRMPListener,JRMPListener會將含有惡意代碼的payload響應至請求方,也就是從在漏洞的weblogicserver。
03 後記
—
本文主要提供了對java序列化後位元組碼的一種研究方案,便於大部分人理解序列化和反序列化的原理,也便於後續漏洞的分析,有問題和想法的同學歡迎和我們共同探討交流。
TAG:逢魔安全實驗室 |