<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    CVE-2020-14756 漏洞利用以及分析

    Andrew2021-02-15 01:48:10

    0x01利用思路

    weblogicT3協議反序列化漏洞一直是一個比較熱門也比較好用的漏洞,weblogic針對該漏洞的解決方案就是不斷填充黑名單,在高版本jdk下配合jep290機制實現黑名單,在低版本下配合resolveClass進行防御,所以安全人員對于T3反序列化的利用也是一直在尋找黑名單之外的利用鏈。

    CVE-2020-14756 這個漏洞的利用比較巧妙,通過利用weblogic coherence組件中的類,繞過了黑名單機制的檢測,重新能夠利用黑名單中的類,造成代碼執行。

    0x02漏洞分析

    weblogiccoherence.jar中,存在著一個比較特殊的接口com.tangosol.io.ExternalizableLite,他繼承了Serializable接口。
    圖片

    readExternalwriteExternal方法
    圖片

    ExternalizableLite接口的對象可以在com.tangosol.util.ExternalizableHelper里被序列化。
    圖片

    這里的nType是在writeObject寫入的,是可控的
    圖片

    readExternalizableLite方法的具體內容為:

    這里會加載傳入的對象,對象需要是ExternalizableLite的實現類
    圖片

    這里直接調用class.forName還原對象
    圖片
    之后,會繼續調用對象的readExternal方法,這樣一來,后續的流程就繞過了ObjectInputStream對于對象的還原,而weblogic的黑名單檢測也主要是針對ObjectInputStream的,所以,現在只需要找到后續的利用鏈就可以造成代碼執行。

    漏洞發現者使用了com.tangosol.util.aggregator.TopNAggregator.PartialResult這個類。這里會利用ExternalizableHelper還原m_comparator參數,是一個Comparator類型的對象。
    圖片

    然后調用了instantiateInternalMap方法,傳入m_comparator
    圖片
    首先實例化SortedBag.WrapperComparator,賦值f_comparator,然后返回TreeMap對象
    圖片

    接著,調用add方法,在add方法里調用super.add,即SortedBag.add,繼續調用put方法。

    圖片
    put方法里,調用了compare方法
    圖片
    而這里又會調用WrapperComparatorcompare方法

    圖片
    這個f_comparator就是之前已經賦值過的。
    圖片
    所以,最終的利用就在f_comparator這里,f_comparator從前面可以知道,需要是一個Comparator類型,這里使用的是 MvelExtractor 這是之前黑名單里的一個類,在CVE-2020-2555中有使用,不過現在我們不受黑名單的限制,MvelExtractor 沒有compare方法。于是調用父類AbstractExtractorcompare方法。
    圖片
    然后又會調用子類MvelExtractorextract方法。

    序列化入口一

    到現在我們的入口是TopNAggregator$PartialResult,他的readExternal(DataInput in)不是標準的readExternal(ObjectInput in),序列化的過程中是不會自動調用到該方法的,所以還需要找一個入口,這里作者發現了AttributeHolder

    這里不但會將ObjectInput轉為DataInput,還會主動調用ExternalizableHelper.readObject。所以我們只需要m_oValueTopNAggregator$PartialResult即可完成利用。
    圖片

    調用棧
    圖片

    序列化入口二

    另外一個入口是com.tangosol.net.security.PermissionInfo,我們看他的readExternal方法,將輸入流傳入readCollection方法里,PermissionInfoExternalizableHelper的子類,所以這里PermissionInfo沒有readCollection方法,直接調用其父類ExternalizableHelper的方法。
    圖片
    判斷輸入流類型之后,調用了readObject
    在調用readCollection的時候,將ObjectInput轉為了DataInput
    圖片
    走到這里,就和之前的流程一模一樣了。
    圖片
    調用棧
    圖片

    0x03 12.1.3版本問題

    經測試,12.1.3 利用存在如下問題

    圖片
    從前面的分析可以知道,類的加載是在loadClass方法里,利用class.forName去加載類。
    圖片
    這里的loader就很關鍵了,決定了哪些類可以加載,哪些類沒發加載,這里的loader是調用getContextClassLoader獲得的一個線程上下文類加載器。
    圖片

    這里的線程上下文類加載器是默認的 AppClassLoader,在loaders里發現JarLoader加載了的coherence組件的依賴只有coherence.jarcoherence-web.jar,而MvelExtractorcoherence-rest.jar里,所以沒有辦法加載。
    圖片
    圖片

    以下是一些嘗試(未成功):
    于是我這里先是考慮了另一個在黑名單的類,ReflectionExtractor,這個類在coherence.jar包下,不過在構造利用這個反射執行鏈的時候,需要反序列化Runtime.class對象,而Runtime.class對象不是ExternalizableLite的實現類,根據nType,在序列化的時候會調用readSerializeable方法
    圖片

    該方法還是會走ObjectInputStream的反序列化流程,即使是通過修改nType讓他走readExternalizable,后面還是會有類型轉換報錯。
    圖片

    所以這樣是不行的,12.1.3版本很多類都利用不了,比如RemoteConstructorUniversalExtractorLockVersionExtractor這些類在 12.1.3 版本中都沒有,已知的利用鏈在 12.1.3 來說是沒有辦法進行利用的。

    0x04官方修復之梅開二度

    (補丁只能針對實現了jep290jdk
    根據補丁來看:
    圖片

    對輸入流的類型進行了判斷,如果是ObjectInputStream,那么會去調用checkObjectInputFilter方法,方法如下:

    圖片

    這里會獲取filter,在ExternalizableHelper的靜態代碼塊里初始化了filter
    首先會獲取是否存在ObjectInputFilter,來判斷jdk環境中是否存在jep290
    圖片

    然后通過getObjectInputFilter/getInternalObjectInputFilter方法去獲取serialFilter,之后,調用checkInput,對當前序列化的類進行檢測。

    不過,對于沒有實現jep290jdk版本而言,這個修補是沒有作用的,因為低版本jdk不存在ObjectInputFilter,所以說filter參數就為null,也就是說checkObjectInputFilter方法直接返回true
    圖片

    既然為true,那么還是能進行類的實例化。
    圖片

    原創: ob1t0 補天平臺
    原創鏈接:https://mp.weixin.qq.com/s/QT3K__1EMXC0uqB...

    漏洞序列化
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    最近兩個月我一直在做拒絕服務漏洞相關的時間,并收獲了Spring和Weblogic的兩個CVE但DoS漏洞終歸是雞肋洞,并沒有太大的意義,比如之前有人說我只會水垃圾洞而已,所以在以后可能打算做其他方向早上和pyn3rd師傅聊天
    淺談Java反序列化漏洞
    2022-05-17 17:48:01
    Java序列化與反序列化Java 提供了一種對象序列化的機制,該機制中,一個對象可以被表示為一個字節序列,該字節序列包括該對象的數據、有關對象的類型的信息和存儲在對象中數據的類型。反序列化就是打開字節流并重構對象。對象序列化不僅要將基本數據類型轉換成字節表示,有時還要恢復數據。
    序列化漏洞匯總
    2022-01-07 22:17:34
    漏洞出現在WLS Security組件,允許遠程攻擊者執行任意命令。攻擊者通過向TCP端口7001發送T3協議流量,其中包含精心構造的序列化Java對象利用此漏洞。然后將其序列化,提交給未做安全檢測的Java應用。Java應用在進行反序列化操作時,則會觸發TransformedMap的變換函數,執行預設的命令。
    序列化的核心思維旨在,將A變成B,最后再從B還原回A。 總之,在一些條件苛刻或者變化無常的環境與需求中,產生了這種靈活的可逆性的B的中間體。 理解不安全反序列化的最好方法是了解不同的編程語言如何實現序列化和反序列化。這里的序列化與反序列化指的是程序語言中自帶的實施與實現。而非自創或者自定義的序列化與反序列化機制(比如:N進制形式hashmap樹型等其他數據結構里的序列化中間體)。
    漏洞影響版本 Jboss 漏洞搭建 在阿里云端,用docker 搭建測試環境jboos使用的漏洞庫是 vulhub ,進入漏洞庫選擇jboos里面有三個選項選擇第一個cve.輸入 docker-compose up -d 啟動 本地測試,在瀏覽器輸入訪問 /invoker/readonly,若顯示HTTP Status 500,則說有反序列化漏洞。使用工具測試驗證漏洞是否存在,工具下載地址: ... 執行whoami命令
    前置知識分析Transformer接口及其實現類。transform()傳入對象,進行反射調用。構造調用鏈調用鏈構造原則:找調用關系要找不同名的方法,如果找到同名,再通過find usages得到的還是一樣的結果。找到InvokerTransformer類中的transform(),右鍵,點 Find Usages,找函數調用關系,最好找不同名的方法,調用了transform()。因為transform()調用transform()不能換到別的方法里,沒有意義。如果有一個類的readObject()調用了get(),那我們就可能找到了調用鏈。最終選擇TransformedMap這個類,因為TransformedMap類中有好幾處都調用了transform()。
    使用 SerializationBinder 無法完全修復反序列化漏洞隱患。經過深入研究總結了兩種不安全 SerializationBinder 限定的繞過方式,下面分享給大家。
    近日Oracle通報了一個反序列化漏洞CVE-2022-21445,未經身份認證的遠程攻擊者可利用該漏洞實現反序列化操作導致任意代碼執行。任何基于ADF Faces框架開發的程序都受到此漏洞的影響,包括Oracle的多個產品。
    Fastjson Develop Team發布安全公告,修復了一個存在于Fastjson1.2.80 及之前版本中的反序列化漏洞漏洞編號:暫無,漏洞威脅等級:高危。
    JDK7u21的核心點是我們在cc1中也出現過的AnnotationInvocationHandler,在cc1中我們用到了他會觸發this.memberValues.get(var4);這個點,而在JDK7u21中利用到了他里面的equalsImpl。先來看一下equalsImpl。
    Andrew
    暫無描述
      亚洲 欧美 自拍 唯美 另类