Oracle Coherence&WebLogic反序列化遠程代碼執行分析

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

標題:CVE-2020-2555: Oracle Coherence&WebLogic反序列化遠程代碼執行分析

報告編號:B6-2020-030901

更新日期:2020-03-09

0x01 漏洞背景

2020年3月6日,Oracle Coherence 反序列化遠程代碼執行漏洞(CVE-2020-2555)的細節被公開,Oracle Coherence為Oracle融合中間件中的產品,在WebLogic 12c及以上版本中默認集成到WebLogic安裝包中,攻擊者通過t3協議發送構造的序列化數據,能過造成命令執行的效果

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

0x02 影響版本

  • Oracle Coherence 3.7.1.17
  • Oracle Coherence 12.1.3.0.0
  • Oracle Coherence 12.2.1.3.0
  • Oracle Coherence 12.2.1.4.0

0x03 漏洞分析

測試版本:

  1. jdk: 8u191
  2. weblogic: 12.2.1.4.0
<code>Gadget chain:
ObjectInputStream.readObject()
BadAttributeValueExpException.readObject()
LimitFilter.toString()
ChainedExtractor.extract()
ReflectionExtractor.extract()
Method.invoke()
Class.getMethod()
ReflectionExtractor.extract()
Method.invoke()
Runtime.getRuntime()
ReflectionExtractor.extract()
Method.invoke()
Runtime.exec()
/<code>

官方修補了LimitFilter.toString()方法,修補前的該方法如下

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

主要關注我標記了的地方,如果m_comparator屬性是ValueExtractor的實例,那麼就會去調用extract方法,並且傳入m_oAnchorTop屬性,這裡的屬性都可控,這裡我們就需要明確最終的目的,造成命令執行,比較理想的就是能夠調用Method.invoke(),通過反射調用任意方法,通過尋找,發現了com.tangosol.util.extractor.ReflectionExtractor類的extract方法中,存在利用點,並且該類可被序列化

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

我們看到他的extract方法,調用了method.invoke,兩個參數都為序列化中的可控變量

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

直接通過構造方法進行賦值

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

不過我們知道,單憑這一個method.invoke是沒法調用到Runtime.getRuntime().exec()的,需要再去尋找一箇中間點去反覆調用這個方法,這裡就十分的類似Commons Collections的gadgets,那麼這個中間點就是com.tangosol.util.extractor.ChainedExtractor方法,他的extract方法

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

每執行一次method.invoke的結果都會return,作為下一次執行的參數。不過要注意第一次循環的時候,需要手動傳入oTarget參數,也就是LimitFilter.toString()傳入extract的m_oAnchorTop參數,如果我們要達到命令執行的目的,就需要賦值為Runtime.class 這樣就能夠將一整個反射給連接起來了,通過反射來造成java.lang.Runtime.getRuntime().exec的效果

那麼回到最開始,我們還沒有說怎麼去調用LimitFilter.toString()方法,看到BadAttributeValueExpException重寫的readObject方法,這裡的readObject的valObj變量是我們可控的,在進行反序列化時,java會調用ObjectInputStream類的readObject()方法。如果被反序列化的類重寫了readObject方法,那麼該類在進行反序列化時,Java會優先調用重寫的readObject方法

類似的gadgets也出現在CommonsCollections5裡,

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

這樣,一條完整的gadget chain就被連接起來。

0x04 漏洞證明

通過t3協議將反序列化數據發送給weblogic server

Oracle Coherence&WebLogic反序列化遠程代碼執行分析

0x05 修復建議

升級補丁,參考oracle官網發佈的補丁https://www.oracle.com/security-alerts/cpujan2020.html 如果不依賴T3協議進行JVM通信,禁用T3協議。

進入WebLogic控制檯,在base_domain配置頁面中,進入安全選項卡頁面,點擊篩選器,配置篩選器。 在連接篩選器中輸入:weblogic.security.net.ConnectionFilterImpl,在連接篩選器規則框中輸入 7001 deny t3 t3s 保存生效(需重啟)

0x06 時間線

2020-03-06 漏洞細節被公開

2020-03-06 360-CERT 發佈預警

2020-03-09 360-CERT 發佈分析

0x07 參考鏈接

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


分享到:


相關文章: