0x01 漏洞概述

Oracle官方在1月補丁中修復了CVE-2020-2555漏洞,該漏洞位于Oracle Coherence組件中。該組件是業內領先的用于解決集群應用程序數據的緩存的解決方案,其默認集成在Weblogic12c及以上版本中。
該漏洞提出了一條新的反序列化gadget,未經身份驗證的攻擊者通過精心構造的T3請求觸發可以反序列化gadget,最終造成遠程命令執行的效果。
0x02 漏洞分析
ZDI已經給出了一部分的[分析][1],根據ZDI發出的diff圖,不難看出補丁是將extract的利用全部移除了,具體的代碼可以在com.tangosol.util.filter.LimitFilter#toString中找到:

所以只要跟蹤extract()的執行流,就能理解漏洞產生的原理。其實總體來說該漏洞應該分為兩部分來分析:
- 反射調用鏈
- 反序列化觸發點
2.1 反射調用鏈
首先先來具體看一下com.tangosol.util.filter.LimitFilter#toString的邏輯:

紅線所標注的就是漏洞觸發的關鍵點,這里的m_comparator、m_oAnchorTop、m_oAnchorBottom是我們能通過LimitFilter的構造函數進行構造的。當m_comparator是繼承于ValueExtractor接口的類時,會嘗試調用m_comparator.extract()方法,并將結果放入StringBuffer中。
我們接著來看一下ValueExtractor的實現類:

其中ReflectionExtractor和ChainedExtractor值得我們關注。通過名字不難想到這兩個類一個是用于完成反射相關操作的,一個是用于執行鏈式操作的。
在ReflectionExtractor#extract中,可以很明顯的看到存在反射調用的流程:

簡單來說就是獲取oTarget的Method,并反射調用該對象的具體方法。具體方法由this.getMethodName()來控制:


同樣,這個值也是可以通過ReflectionExtractor的構造函數來去指定的。現在我們可以指定任意一個方法通過反射調用該方法。但是想要執行代碼的話并不是單次反射就能完成的,我們還需要找到一個方法將多條反射調用串起來(就如CommonCollections的利用鏈相同)。ChainedExtractor就完成了這個工作:

這里的ValueExtractor數組是通過this.getExtractors()獲得的,同樣也可以通過ChainedExtractor構造函數進行指定:



也就是說現在我們只需要構造多條ReflectionExtractor,將其置于ValueExtractor數組中,就可以觸發鏈式反射調用流程。這一點和CommonCollections的利用鏈也非常像,最終的執行流可以大致簡化為:

2.2 反序列化觸發點
上面我們分析了具體的反射調用流程,這一切都是建立在LimitFilter#toString觸發時所發生的,為了利用反射調用流程,我們還需要找到一個能夠在反序列化時觸發toString方法的觸發點。ZDI這篇文章中說到了一個觸發點——BadAttributeValueExpException#readObject:

所以只需要設置BadAttributeValueExpException的成員變量val為LimitFilter就可以完成觸發。
0x03 漏洞利用
通過上面的分析,我們來梳理一下整體的構造流程:
- 構造能串聯起來完成命令執行的多條
ReflectionExtractor反射調用 - 利用
ChainedExtractor將多條ReflectionExtractor串聯起來 - 將
ChainedExtractor設置為LimitFilter的成員變量m_comparator的值 - 為了完成鏈式反射調用鏈,將
LimitFilter的成員變量m_oAnchorTop設置為相應的值(如Runtime.class) - 將構造完成的
LimitFilter設置為BadAttributeValueExpException的成員變量val的值 - 序列化
BadAttributeValueExpException - 構造包含序列化數據的T3請求,發送請求完成攻擊
攻擊效果:

0x04 其他利用方式
拋磚引玉的說一個其他的利用方式。由于我并不是非常喜歡這樣串聯利用鏈的方式(因為不好理解),所以簡單的看了下其他的Extractor,看看有沒有更加簡單的利用方式。這里找到另外一個非常好理解的利用方式。前面的流程都是一樣的,唯一不同的是可以不利用ReflectionExtractor加ChainedExtractor這樣的組合,同樣能完成命令執行。
漏洞產生的原因也從鏈式反射調用改為表達式注入。相信一說到表達式注入各位就已經知道是用的什么鏈了,這里就不再過多贅述,就放一張利用效果圖:

Reference
本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1141/
暫無評論