作者:Lemon@平安銀河安全實驗室
公眾號:WebLogic 反序列化漏洞(CVE-2019-2890)分析

漏洞簡介

2019年10月16日,WebLogic官方發布了安全補丁公告,修復了包含CVE-2019-2890等高危漏洞。Weblogic在利用T3協議進行遠程資源加載調用時,默認會進行黑名單過濾以保證反序列化安全。漏洞CVE-2019-2890繞過了Weblogic的反序列化黑名單,使攻擊者可以通過T3協議對存在漏洞的Weblogic組件實施遠程攻擊,但該漏洞利用條件較高,官方也歸類為需要身份認證。

影響版本

WebLogic Server 10.3.6.0

WebLogic Server 12.1.3.0

WebLogic Server 12.2.1.3

漏洞分析

漏洞代碼位于weblogic.jar中weblogic.wsee.jaxws.persistence.PersistentContext.class文件,它的readObject函數調用了readSubject函數,readSubject函數中使用了ObjectInputStream.readObject來反序列化對象。

查看對應的writeObject的邏輯,只要我們給對應的localObjectOutputStream.writeObject()序列化一個惡意對象,則PersistentContext對象被反序列化時,它的readObject函數被調用,readSubject函數中對惡意對象進行反序列化。因此通過T3發送精心偽造的PersistentContext對象,則可成功繞過黑名單檢查。

漏洞復現

為了讓writeObject函數中的localObjectOutputStream.writeObject()序列化一個惡意對象,我們直接對PersistentContext類進行修改。

打開idea新建一個項目,引入需要的Jar文件。在項目中新建一個package,名為weblogic.wsee.jaxws.persistence,在這個包下創建PersistentContext.class文件,復制原來的內容進行修改。

我們在PersistentContext.class文件中新增一個getObject()函數,用于獲取惡意對象。然后把localObjectOutputStream.writeObject()函數的參數替換。

然后在項目中創建一個Poc.class文件,新建PersistentContext對象對其進行序列化操作,序列化后存儲到poc文件中。

此時我們使用T3發送payload發現靶機日志提示報錯:

根據報錯提示定位到代碼,發現readSubject函數中有個解密過程:

此時我們再次檢查writeSubject函數,猜測序列化時加密沒有成功,導致反序列化時解密報錯:

跟進加密函數:

由于我們idea建立的項目中沒有SerializedSystemIni.dat文件,直接返回null,因此加密沒有成功,導致反序列化失敗。

因此我們需要修改writeSubject()函數,但由于getEncryptionService屬性為private,需再新建EncryptionUtil.class文件,把getEncryptionService()函數屬性改成public:

并且把SerializedSystemIni.dat文件復制到我們idea項目中。由于SerializedSystemIni.dat是密鑰文件,各不相同且無法猜解,這里也就是這個漏洞需要身份認證的原因。

此時再測試發送payload,可愛的計算器成功彈出。

安全建議

1、禁用 T3 協議:如果您不依賴 T3 協議進行JVM通信,可通過暫時阻斷 T3 協議緩解此漏洞帶來的影響。

2、排查弱口令

3、升級補丁

相關鏈接

https://www.oracle.com/security-alerts/cpuoct2019.html


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1069/