作者:Lucifaer
原文鏈接:https://lucifaer.com/2020/03/10/Oracle%20Coherence%20%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E6%BC%8F%E6%B4%9E%E5%88%86%E6%9E%90%EF%BC%88CVE-2020-2555%EF%BC%89/?from=timeline&isappinstalled=0

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_comparatorm_oAnchorTopm_oAnchorBottom是我們能通過LimitFilter的構造函數進行構造的。當m_comparator是繼承于ValueExtractor接口的類時,會嘗試調用m_comparator.extract()方法,并將結果放入StringBuffer中。

我們接著來看一下ValueExtractor的實現類:

其中ReflectionExtractorChainedExtractor值得我們關注。通過名字不難想到這兩個類一個是用于完成反射相關操作的,一個是用于執行鏈式操作的。

ReflectionExtractor#extract中,可以很明顯的看到存在反射調用的流程:

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

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

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

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

2.2 反序列化觸發點

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

所以只需要設置BadAttributeValueExpException的成員變量valLimitFilter就可以完成觸發。

0x03 漏洞利用

通過上面的分析,我們來梳理一下整體的構造流程:

  1. 構造能串聯起來完成命令執行的多條ReflectionExtractor反射調用
  2. 利用ChainedExtractor將多條ReflectionExtractor串聯起來
  3. ChainedExtractor設置為LimitFilter的成員變量m_comparator的值
  4. 為了完成鏈式反射調用鏈,將LimitFilter的成員變量m_oAnchorTop設置為相應的值(如Runtime.class
  5. 將構造完成的LimitFilter設置為BadAttributeValueExpException的成員變量val的值
  6. 序列化BadAttributeValueExpException
  7. 構造包含序列化數據的T3請求,發送請求完成攻擊

攻擊效果:

0x04 其他利用方式

拋磚引玉的說一個其他的利用方式。由于我并不是非常喜歡這樣串聯利用鏈的方式(因為不好理解),所以簡單的看了下其他的Extractor,看看有沒有更加簡單的利用方式。這里找到另外一個非常好理解的利用方式。前面的流程都是一樣的,唯一不同的是可以不利用ReflectionExtractorChainedExtractor這樣的組合,同樣能完成命令執行。

漏洞產生的原因也從鏈式反射調用改為表達式注入。相信一說到表達式注入各位就已經知道是用的什么鏈了,這里就不再過多贅述,就放一張利用效果圖:

Reference

  1. https://www.thezdi.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server

  2. https://www.oracle.com/security-alerts/cpujan2020.html

  3. https://www.thezdi.com/blog/2020/3/5/cve-2020-2555-rce-through-a-deserialization-bug-in-oracles-weblogic-server


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