天天看點

weblogic漏洞分析之CVE-2021-2394

Oracle官方釋出了2021年7月份安全更新通告,通告中披露了WebLogic元件存在高危漏洞,攻擊者可以在未授權的情況下通過IIOP、T3協定對存在漏洞的WebLogic Server元件進行攻擊。成功利用該漏洞的攻擊者可以接管WebLogic Server。

這是一個二次反序列化漏洞,是CVE-2020-14756和CVE-2020-14825的調用鍊相結合組成一條新的調用鍊來繞過weblogic黑名單清單。

Oracle WebLogic Server 10.3.6.0.0

Oracle WebLogic Server 12.1.3.0.0

Oracle WebLogic Server 12.2.1.3.0

Oracle WebLogic Server 12.2.1.4.0

Oracle WebLogic Server 14.1.1.0.0

為了更好的了解漏洞,我将介紹漏洞中涉及的每一個類的作用,再将所有類串起來形成調用鍊

Coherence 元件中存在一個 <code>com.tangosol.io.ExternalizableLite</code>,它繼承了 <code>java.io.Serializable</code>,另外聲明了 <code>readExternal</code> 和 <code>writeExternal</code> 這兩個方法。

weblogic漏洞分析之CVE-2021-2394

<code>ExternalizableHelper</code>類可以将實作上面<code>ExternalizableLite</code>接口的類進行序列化和反序列化操作,在反序列化操作中,會調用<code>ExternalizableHelper#readObject</code>

weblogic漏洞分析之CVE-2021-2394

如上圖,在<code>ExternalizableHelper#readObject</code>中,會調用<code>readObjectInternal</code>方法,此方法會根據要還原類的類型,選擇對應的方法進行解析,對于實作 <code>com.tangosol.io.ExternalizableLite</code> 接口的對象,會進入到 <code>readExternalizableLite</code> 方法:

weblogic漏洞分析之CVE-2021-2394

在<code>readExternalizableLite</code> 方法中,會根據類名加載類,然後并且執行個體化出這個類的對象,然後調用它的 <code>readExternal()</code> 方法。

weblogic漏洞分析之CVE-2021-2394

此類中<code>getDatabaseMetaData</code>方法會調用<code>this.connect</code>

weblogic漏洞分析之CVE-2021-2394

而<code>this.connect</code>則調用了<code>InitialContext#lookup</code>,如果<code>this.getDataSourceName()</code>為惡意uri,則可以産生JNDI注入

weblogic漏洞分析之CVE-2021-2394

此類中有一個<code>getAttributeValueFromObject</code>方法,在<code>getAttributeValueFromObject</code>方法中,可以調用<code>invoke</code>來執行任意方法,前提是三個參數可控getMethod、anObject、parameters

weblogic漏洞分析之CVE-2021-2394

此類的<code>compare</code>方法會調用<code>this.extract</code>

weblogic漏洞分析之CVE-2021-2394

此類是整個漏洞繞過上一個更新檔的關鍵類,它實作了<code>ExternalizableLite</code>接口,并且父類是<code>AbstractExtractor</code>

weblogic漏洞分析之CVE-2021-2394

在此類中有兩個比較重要的方法,首先來看第一個<code>extract</code>方法,此方法會調用<code>attributeAccessor</code>的<code>getAttributeValueFromObject</code>方法

weblogic漏洞分析之CVE-2021-2394

第二個是<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

此方法調用了<code>SerializationHelper#readAttributeAccessor</code>來從序列化資料中還原<code>this.attributeAccessor</code>的值

跟進<code>readAttributeAccessor</code>方法,可以看到是自己<code>new</code>了一個<code>MethodAttributeAccessor</code>對象,這裡就是繞過更新檔的關鍵

weblogic漏洞分析之CVE-2021-2394

<code>TopNAggregator$PartialResult</code>是一個靜态内部類,也實作了<code>ExternalizableLite</code>接口,裡面有個<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

在<code>readExternal</code>方法中也是調用的<code>ExternalizableHelper</code>進行還原每一個元素,170行還原了<code>m_comparator</code>後,到172行調用了<code>instantiateInternalMap</code>方法并且傳入了還原的<code>m_comparator</code>,跟進<code>instantiateInternalMap</code>

weblogic漏洞分析之CVE-2021-2394

這裡首先<code>new</code>了一個<code>SortedBag.WrapperComparator</code>,傳入<code>comparator</code>,跟進<code>WrapperComparator</code>可以看到把<code>comparator</code>的值賦予給了<code>this.f_comparator</code>

weblogic漏洞分析之CVE-2021-2394

之後把<code>new</code>出來的<code>SortedBag.WrapperComparator</code>對象傳入了<code>TreeMap</code>構造方法,跟進<code>TreeMap</code>構造方法

weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>構造方法隻是對<code>comparator</code>的一個指派,把剛剛的<code>SortedBag.WrapperComparator</code>對象傳遞給了<code>this.comparator</code>

weblogic漏洞分析之CVE-2021-2394

回到<code>TopNAggregator$PartialResult</code>類,最終的把<code>TreeMap</code>對象指派給了<code>this.m_map</code>,接下來看176行的this.add

weblogic漏洞分析之CVE-2021-2394

跟進<code>add</code>方法看到調用了父類的<code>add</code>

weblogic漏洞分析之CVE-2021-2394

跟進其父類<code>SortedBag</code>類的<code>add</code>,在父類<code>add</code>方法中,調用了<code>map.put</code>,而這裡的<code>map</code>就是上面的<code>TreeMap</code>對象

weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>類中,其<code>put</code>方法會調用<code>compare</code>

weblogic漏洞分析之CVE-2021-2394

在<code>compare</code>中調用了<code>comparator.compare</code>,此處的<code>comparator</code>是在上個内部類中賦予的值<code>SortedBag.WrapperComparator</code>類

weblogic漏洞分析之CVE-2021-2394

此類的<code>compare</code>方法會調用<code>this.f_comparator.compare</code>

weblogic漏洞分析之CVE-2021-2394

這個是整個漏洞的入口,在此類中實作了<code>readExternal</code>方法,在還原<code>this.m_oValue</code>值時候會調用<code>ExternalizableHelper.readObject</code>

weblogic漏洞分析之CVE-2021-2394

先上gadget:

POC用Timeline Sec團隊的:

在<code>objectIntputStream.readObject();</code>處下斷點

weblogic漏洞分析之CVE-2021-2394

跟進到<code>AttributeHolder#readExternal</code>,這裡使用了<code>ExternalizableHelper</code>從序列化資料中還原<code>this.m_oValue</code>

weblogic漏洞分析之CVE-2021-2394

跟進<code>ExternalizableHelper#readObject</code>,調用了<code>readObjectInternal</code>

weblogic漏洞分析之CVE-2021-2394

在<code>readObjectInternal</code>中,判斷<code>nType</code>的值,進入<code>readExternalizableLite</code>來處理

weblogic漏洞分析之CVE-2021-2394

在<code>readExternalizableLite</code>中,先執行個體化了<code>TopNAggregator$PartialResult</code>類,然後調用了它的<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

跟進到<code>TopNAggregator$PartialResult</code>的<code>readExternal</code>方法,開始依次還原幾個變量,先看還原第一個<code>m_comparator</code>

weblogic漏洞分析之CVE-2021-2394

跟進<code>ExternalizableHelper#readObject</code>到<code>readExternalizableLite</code>方法,執行個體化出了<code>FilterExtractor</code>對象,調用其<code>readExternal</code>方法

weblogic漏洞分析之CVE-2021-2394

跟進<code>FilterExtractor#readExternal</code>方法,發現調用了<code>SerializationHelper.readAttributeAccessor</code>方法來還原<code>this.attributeAccessor</code>的值

weblogic漏洞分析之CVE-2021-2394

跟進<code>SerializationHelper.readAttributeAccessor</code>後,可以看到會 <code>new</code> 一個 <code>MethodAttributeAccessor</code> 對象,然後從 <code>DataInput</code> 中還原它的 <code>setAttributeName</code>,<code>setGetMethodName</code> 以及 <code>setSetMethodName</code> 屬性,最後進行傳回。

weblogic漏洞分析之CVE-2021-2394

回到<code>TopNAggregator$PartialResult</code>的<code>readExternal</code>方法中,此時<code>this.m_comparator</code>已經變成了<code>FilterExtractor</code>對象

weblogic漏洞分析之CVE-2021-2394

接着調用到172行的<code>instantiateInternalMap</code>方法,傳入了<code>this.m_comparator</code>

weblogic漏洞分析之CVE-2021-2394

在<code>instantiateInternalMap</code>方法中,首先<code>new</code>了一個<code>SortedBag.WrapperComparator</code>,傳入<code>comparator</code>,跟進<code>WrapperComparator</code>可以看到把<code>comparator</code>的值賦予給了<code>this.f_comparator</code>

weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394

跟進<code>add</code>方法看到調用了父類的<code>add</code>,可以看到<code>value</code>的值已經變成了<code>JdbcRowSetImpl</code>

weblogic漏洞分析之CVE-2021-2394
weblogic漏洞分析之CVE-2021-2394

在<code>TreeMap</code>類中,其<code>put</code>方法會調用<code>compare</code>,此時傳入的<code>key</code>就是<code>JdbcRowSetImpl</code>對象

weblogic漏洞分析之CVE-2021-2394

在<code>compare</code>中調用了<code>comparator.compare</code>,此處的<code>comparator</code>是在上面<code>TreeMap</code>中賦予的<code>SortedBag.WrapperComparator</code>類

weblogic漏洞分析之CVE-2021-2394

接着進入<code>SortedBag.WrapperComparator#compare</code>中,可以看到調用了<code>FilterExtractor#compare</code>,其中o1、o2的值為<code>JdbcRowSetImpl</code>

weblogic漏洞分析之CVE-2021-2394

跟進<code>FilterExtractor#compare</code>中,調用了<code>this.extract</code>

weblogic漏洞分析之CVE-2021-2394

轉到<code>this.extract</code>,調用了<code>MethodAttributeAccessor#getAttributeValueFromObject</code>

weblogic漏洞分析之CVE-2021-2394

檢視<code>MethodAttributeAccessor#getAttributeValueFromObject</code>

weblogic漏洞分析之CVE-2021-2394

利用<code>invoke</code>調用了<code>JdbcRowSetImpl#getDatabaseMetaData</code>

weblogic漏洞分析之CVE-2021-2394

最終進行了<code>lookup</code>,其<code>this.getDataSourceName()</code>就是我們輸入的LDAP位址

weblogic漏洞分析之CVE-2021-2394

彈出電腦

weblogic漏洞分析之CVE-2021-2394

https://xz.aliyun.com/t/10052#toc-12

https://github.com/lz2y/CVE-2021-2394