03.07 CVE-2020-2555:WebLogic RCE漏洞分析

CVE-2020-2555:WebLogic RCE漏洞分析

0x00 前言

不安全的反序列化漏洞已經逐漸成為攻擊者/研究人員在面對Java Web應用時尋找的目標。這些漏洞通常能得到可靠的遠程代碼執行(RCE)效果,並且修復起來比較困難。在本文中,我們將分析CVE-2020-2555(ZDI-20-128)漏洞,該漏洞由來自VNPT ISC的Jang提交。這個漏洞級別較高(CVSS評分9.8),存在於Oracle Coherence庫中,從而影響使用該庫的Oracle WebLogic服務器等常見產品。官方在1月份修復了包括該漏洞在內的300多個漏洞。

0x01 補丁分析

漏洞根源存在於某個Java方法中,攻擊者可以調用該方法,並且能控制相關參數。在Java中,當重新創建對象圖時,類的readob ject()或readExternal()會被自動調用。因此,這兩個方法(以及在方法內部可達的其他方法)可以被視為反序列化gadget的根源點。

CVE-2020-2555的補丁引入了非常有趣的一處修改,涉及LimitFilter類的toString()方法:

CVE-2020-2555:WebLogic RCE漏洞分析

補丁在toString()中刪除了對extract()方法的所有調用語句,下文中將重點分析extract()方法的重要性。這種修改操作非常有趣,因為我們可以通過各種標準的JRE類(如BadAttributeValueExpException)的readob ject()方法,成功訪問toString()方法。

CVE-2020-2555:WebLogic RCE漏洞分析

如上圖所示,經過序列化的BadAttributeValueExpException類實例可以用來調用任意類的toString()方法。這種技術可以用來訪問受此補丁影響的LimitFilter類的toString()方法。

關於使用toString()作為入口點的gadget,大家可以參考ysoserial項目的CommonsCollections5 gadget.

0x02 尋找sink點

Sink點指的是具有各種副作用的Java方法調用,這類副作用包括:

1、通過調用FileOutputStream.write()實現任意文件創建;

2、通過調用Runtime.exec()實現任意命令執行;

3、通過調用Method.invoke()實現任意方法調用。

對於該漏洞,我們主要關注的是Method.invoke(),該調用能通過反射來調用任意Java方法。瞭解該信息後,我們開始查找具備extract()方法的所有實例(根據前文分析,該方法正是補丁分析後我們得出的根源點),並且最終會調用Method.invoke()。在Coherence庫中,似乎只有一個可序列化類(實現Serializable或者Externalizable接口)實例滿足條件。

CVE-2020-2555:WebLogic RCE漏洞分析

觀察ReflectionExtractor類後,我們可以進一步確認前面的猜測:

CVE-2020-2555:WebLogic RCE漏洞分析

ReflectionExtractor提供了一種較為危險的操作原語,可以讓攻擊者調用任意方法,並且攻擊者可以控制具體方法及相關參數。

0x03 實現RCE

通常情況下,攻擊者需要調用多個方法才能實現RCE。比如,在常見的Apache Commons Collections gadget中,攻擊者需要使用ChainedTransformer將任意方法調用串接起來,從而實現RCE。與此類似,Coherence庫中也提供了這樣一個類(ChainedExtractor),可以讓我們串接extract()調用:

CVE-2020-2555:WebLogic RCE漏洞分析

將以上信息結合起來,我們可以使用如下調用鏈,最終實現遠程代碼執行:

CVE-2020-2555:WebLogic RCE漏洞分析

因此,如果有目標環境使用了Coherence庫,並且攻擊者可以投遞惡意序列化對象,那麼攻擊者就能實現遠程代碼執行。為了演示攻擊環境,這裡我們以WebLogic的T3協議作為目標,具體操作過程可參考此處視頻。

0x04 總結

自從Chris Frohoff和Gabriel Lawrence在AppSecCali提出Java反序列化相關概念後,研究人員就一直在尋找反序列化漏洞,以實現可靠的代碼執行。在針對SCADA應用的Pwn2Own Miami活動中,我們已經收到了多個這類報告,這也是我們在相關報告中特別關注反序列化問題的原因之一。



分享到:


相關文章: