中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

發布時間:2021-12-20 09:20:25 來源:億速云 閱讀:142 作者:柒染 欄目:大數據

這篇文章將為大家詳細講解有關怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析,文章內容質量較高,因此小編分享給大家做個參考,希望大家閱讀完這篇文章后對相關知識有一定的了解。

0x01 漏洞簡述

2020年06月08日,360CERT監測到 IBM官方發布了 WebSphere遠程代碼執行 的風險通告,該漏洞編號為 CVE-2020-4450,漏洞等級:嚴重,漏洞評分:9.8分

此漏洞由IIOP協議上的反序列化造成,未經身份認證的攻擊者可以通過IIOP協議遠程攻擊WebSphere Application Server,在目標服務端執行任意代碼,獲取系統權限,進而接管服務器

對此,360CERT建議廣大用戶及時安裝最新補丁,做好資產自查以及預防工作,以免遭受黑客攻擊。

0x02 風險等級

360CERT對該漏洞的評定結果如下

評定方式等級
威脅等級嚴重
影響面廣泛
360CERT評分9.8分

0x03 影響版本

  • WebSphere Application Server: 9.0.0.0 to 9.0.5.4

  • WebSphere Application Server: 8.5.0.0 to 8.5.5.17

  • WebSphere Application Server: 8.0.0.0 to 8.0.0.15

  • WebSphere Application Server: 7.0.0.0 to 7.0.0.45

0x04 漏洞詳情

iiop觸發反序列化

按照zdi給出的分析,iiop的攔截是在com.ibm.ws.Transaction.JTS.TxServerInterceptor#receive_request,那么下斷點進行遠程調試,由于websphere自己實現了一套iiop,所以想要走到iiop觸發反序列化的點還需要構造滿足條件的iiop客戶端,這里需要走到demarshalContext方法,前提是滿足validOtsContexttrue,也就是需要serviceContext不為null
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

假如我們已經構造了serviceContext不為null,繼續往下看,將serviceContext.context_data傳入demarshalContext方法。
調用createCDRInputStream創建CDRInputStream,實際上生成的是EncoderInputStreamCDRInputStream的子類,之后調用EncoderInputStream#read_any方法。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

之后的調用有些繁瑣,就不列出來了,調用棧為:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

serviceContext賦值

由于需要serviceContext不為null,才能走到demarshalContext方法體里面,在com.ibm.rmi.iiop.Connection#setConnectionContexts方法中,該方法如下:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
setConnectionContexts方法可以對ServiceContext屬性進行設置,但是我們需要從iiop生成的默認上下文中獲取存儲著的當前Connection信息。

參考@iswin師傅的文章,可以知道,在com.ibm.rmi.iiop.GIOPImpl里,存在一個getConnection方法,可以獲取當前上下文的Connection實例對象,

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

不過該方法需要傳遞當前ior參數,而GIOPImpl的對象在orb里,
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

這些都能通過反射從defaultContext中獲取。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

惡意數據流構造

看一下數據流是怎么被解包的,具體在demarshalContext方法里,也就是構造完ServeicContext下一步要執行的。

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

與之對應的,marshalContext方法里有相應的數據包生成代碼,所以只需要將關鍵代碼單獨掏出來,再把PropagationContext對象構造一下,就能生成gadgets對象的數據流。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
構造的關鍵代碼為:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

gadgets

既然iiop已經通了,那么我們就根據zdi給出的gadgets進行構造,首先需要明確的是,反序列化的入口是org.apache.wsif.providers.ejb.WSIFPort_EJB(因為websphere自身類加載器的問題,導致現有的gadgets都無法利用,所以我們只能基于新的挖掘的類來構造gadgets)。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
這里我們利用的是handle.getEJBObject方法,handle是一個Handle類型,在實現了Handle接口的類中,能夠進行利用的是com.ibm.ejs.container.EntityHandle這個類,事實上,我們在對handle進行賦值的時候,比較復雜,需要反射多個對象。

我們來看一下他的getEJBObject方法。
這里有幾處需要注意的:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

lookup加載本地factory

先來看第一處,也就是lookup方法,這里的homeJNDIName是我們在反序列化流程中可以控制的。于是,在能夠出網的情況下,可以指向我們的rmi服務。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
這里首先會調用registry.lookup,獲取我們在rmibind的對象,由于jdk版本過高的原因,所以導致com.sun.jndi.ldap.object.trustURLCodebase選項默認被設置為false,也就是說,我們不能利用jndi去遠程服務器上利用URLClassLoader動態加載加載類,只能實例化本地的Factory,這里利用的方式是加載本地類,具體細節參考:Exploiting JNDI Injections in Java。

簡單來說,正常情況下,jndi的利用會在RegistryImpl_Stub.lookup之后返回一個ReferenceWrapper的客戶端代理類,ReferenceWrapper提供了三個參數,className,factory,factoryLocation,如果本地加載不到className,那么就會去factoryLocation上加載factory,大致流程為:

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

而現在不能遠程去加載factoryLocation,那么我們尋求一個本地factory來實例化,并利用該factorygetObjectInstance方法,根據zdi提供的漏洞細節,滿足條件的factoryorg.apache.wsif.naming.WSIFServiceObjectFactory

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

前邊的調用棧是這樣的,

com.sun.jndi.rmi.registry.RegistryContext#lookupcom.sun.jndi.rmi.registry.RegistryContext#decodeObjectjavax.naming.spi.NamingManager#getObjectInstance

rmi服務端可以在reference對象里對factory進行設置,當然這個factory需要滿足一些條件,當調用WSIFServiceObjectFactory.getObjectInstance,我們看一下這個方法。這里wsdlLoc,serviceNS等值都可以在rmi端通過Reference進行設置。

怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

這里會對ref進行判斷,也就是Reference對象的第一個參數,也是可控的。我們需要走到下面的判斷里,也就是讓refWSIFServiceStubRef,原因是這樣的,需要回過來看到前面,
我們需要指定返回代理的類型是EJBHome。這里有兩個地方需要指定接口的類型,一個是narrow第二個參數homeClass,一個是在Reference指定className,用來控制返回的代理類型。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

WSIF web服務

這里的getObjectInstance調用將從遠程URL初始化WSIF服務,該URL指向可由攻擊者控制的遠程XML定義,在遠程xml里,我們可以將方法進行映射,這里只說個概念,后面再仔細說。

指定生成的stub的接口類型

refWSIFServiceStubRef類型的時候,可以通過className來指定生成stub的接口類型,這樣就能生成實現EJHome接口的代理,這里前面已經提到過了,具體在rmi服務端通過Reference進行設置。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

創建動態代理

這里會在getStub里創建代理類。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
根據提供的接口,最終返回WSIFClientProxy代理類。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

el表達式注入

接著,在this.findFindByPrimaryKey獲取homeClass接口的findByPrimaryKey方法。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
之后,就會調用動態代理類的invke方法,傳入findFindByPrimaryKeythis.key,也就是方法的參數。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
WSIFClientProxy.invoke的方法里,會調用WSIFPort實現類的createOperation方法。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
這個createOperation方法就能將方法進行映射,這里我們可以將findFindByPrimaryKey方法映射為本地存在的方法,比如javax.el.ELProcessoreval方法,這里的映射就主要體現在之前提到的WSIF web服務里,需要將映射內容體現在我們自定義的遠程xml文件里。主要語法可以參考:WSDL Java Extension_(https://ws.apache.org/wsif/providers/wsdl_extensions/java_extension.html)_,具體的調用就在自定義rmi服務上進行設置,之后的調用棧如下:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析
最終在ELProcessor#eval方法里執行el表達式。

漏洞利用

利用成功的截圖如下:
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

版本修復

在官網下載補丁_(https://www.ibm.com/support/pages/node/6220276)_進行分析,發現對反序列化入口WSIFPort_EJB進行了修改,在readObject方法里,將原本的handle.getEJBObject方法給取消了,這樣,也就把這個鏈的入口給殺死了。
怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析

0x05 時間線

2020-06-04  IBM發布預警

2020-06-08  360CERT發布預警

2020-07-21  ZDI發布分析報告

2020-08-05  360CERT發布分析報告

關于怎么進行WebSphere遠程代碼執行漏洞CVE-2020-4450分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

宜宾市| 铜梁县| 洮南市| 茶陵县| 济南市| 慈利县| 渑池县| 天长市| 玛纳斯县| 东乡族自治县| 扎鲁特旗| 兴文县| 莱芜市| SHOW| 青州市| 玉屏| 宝清县| 甘孜县| 清苑县| 泌阳县| 新和县| 资讯| 莒南县| 枝江市| 江永县| 涪陵区| 湖南省| 永城市| 天等县| 南召县| 林口县| 文化| 温泉县| 黑水县| 鸡东县| 土默特右旗| 涟水县| 民乐县| 海城市| 津南区| 武城县|