0x00 前言
Orange在今年的BlackHat演講中介紹了在Pwn2Own 2021上使用的Microsoft Exchange攻擊鏈,他分享的內(nèi)容給了我很大的啟發(fā)。
本文僅在技術(shù)研究的角度記錄我在研究ProxyShell中的細(xì)節(jié),分析利用思路。
0x01 簡介
本文將要介紹以下內(nèi)容:
調(diào)試環(huán)境搭建
漏洞分析
利用思路
0x02 調(diào)試環(huán)境搭建
1.禁用Visual Studio中的調(diào)試優(yōu)化
設(shè)置環(huán)境變量COMPLUS_ZapDisable=1
重啟系統(tǒng)
2.查看Exchange中對應(yīng)的進(jìn)程
執(zhí)行命令:
可以獲得Exchange的所有進(jìn)程和對應(yīng)的pid,如下圖
3.使用dnSpy進(jìn)行調(diào)試
打開相關(guān)的dll文件并在待調(diào)試的位置下斷點(diǎn),選擇附加進(jìn)程開始調(diào)試
如果不確定待調(diào)試的Exchange進(jìn)程,可以選擇所有w3wp.exe
0x03 漏洞調(diào)試
使用dnSpy打開文件C:\Program Files\Microsoft\Exchange Server\V15\FrontEnd\HttpProxy\bin\Microsoft.Exchange.FrontEndHttpProxy.dll
依次定位到Microsoft.Exchange.Clients.Owa.Core -> Microsoft.Exchange.HttpProxy
關(guān)于SSRF漏洞(CVE-2021-34473)的漏洞原理可以參考如下文章:
https://peterjson.medium.com/reproducing-the-proxyshell-pwn2own-exploit-49743a4ea9a1
0x04 漏洞分析
1.判斷漏洞是否存在
這里使用Orange原文給出的方法:
訪問:https:///autodiscover/autodiscover.json?@foo.com/mapi/nspi/?&Email=autodiscover/autodiscover.json%3f@foo.com
如果漏洞存在,返回如下結(jié)果:
如下圖
權(quán)限為System
url地址中的“/mapi/nspi”為Exchange服務(wù)器訪問的最終地址
url地址中的“?&Email=autodiscover/autodiscover.json%3f@foo.com”作為參數(shù),這是為了滿足漏洞觸發(fā)的條件。此處還可以通過設(shè)置Cookie的內(nèi)容為“Email=Autodiscover/autodiscover.json%3f@foo.com”實(shí)現(xiàn)相同的效果,源碼如下圖
2.通過SSRF漏洞調(diào)用Exchange Web Service(EWS)
Exchange Web Service(EWS)對應(yīng)郵箱用戶的郵件內(nèi)容,關(guān)于EWS的使用可以參考之前的文章《Exchange Web Service(EWS)開發(fā)指南2——SOAP XML message》,通過發(fā)送XML請求,能夠獲得對應(yīng)用戶的郵件內(nèi)容。
由于SSRF默認(rèn)的權(quán)限為System,所以我們需要找到能夠模擬任意郵箱用戶的方法,才能夠讀取對應(yīng)用戶的郵件內(nèi)容。
經(jīng)過一段時(shí)間的調(diào)試,我沒有找到通過參數(shù)指定EWS認(rèn)證用戶的方法,但是這里我們可以使用Exchange提權(quán)漏洞(CVE-2018-8581)中的技巧,通過在Header中使用SerializedSecurityContext,指定SID可以實(shí)現(xiàn)身份偽裝,從而以指定用戶身份進(jìn)行EWS調(diào)用操作
代碼地址:
https://github.com/thezdi/PoC/blob/master/CVE-2018-8581/serverHTTP_relayNTLM.py#L48-L64
Header格式如下:
為了獲得用戶的SID,我們可以使用Exchange SSRF漏洞(CVE-2021-26855)中的技巧,通過訪問/autodiscover/autodiscover.xml獲得legacyDn,作為參數(shù)繼續(xù)訪問/mapi/emsmdb,就能夠獲得用戶對應(yīng)的sid
至此,整個(gè)利用鏈完成,流程如下:
1、訪問/autodiscover/autodiscover.xml獲得legacyDn
2、訪問/mapi/emsmdb獲得用戶對應(yīng)的sid
3、在Header中使用SerializedSecurityContext,指定用戶身份進(jìn)行EWS調(diào)用操作
3.枚舉郵箱用戶列表
我在之前的文章《滲透技巧——獲得Exchange GlobalAddressList的方法》提到過:“Exchange GlobalAddressList(全局地址列表)包含Exchange組織中所有郵箱用戶的郵件地址,只要獲得Exchange組織內(nèi)任一郵箱用戶的憑據(jù),就能夠通過GlobalAddressList導(dǎo)出其他郵箱用戶的郵件地址?!?/p>
這里也是可以進(jìn)行利用的,我們只需要使用FindPeople操作,做一個(gè)遍歷并進(jìn)行結(jié)果去重即可
實(shí)現(xiàn)細(xì)節(jié)可以參考之前開源的腳本:https://github.com/3gstudent/Homework-of-Python/blob/master/ewsManage.py
4.默認(rèn)郵箱用戶
為了讀取Exchange GlobalAddressList(全局地址列表),我們需要獲得Exchange組織內(nèi)任一郵箱用戶的憑據(jù),對應(yīng)到這個(gè)漏洞,我們僅僅需要郵箱用戶名稱
Exchange中默認(rèn)存在以下四個(gè)用戶可供使用:
SystemMailbox{bb558c35-97f1-4cb9-8ff7-d53741dc928c}
SystemMailbox{e0dc1c29-89c3-4034-b678-e6c29d823ed9}
SystemMailbox{D0E409A0-AF9B-4720-92FE-AAC869B0D201}(Exchange 2016 CU8 and later)
SystemMailbox{2CE34405-31BE-455D-89D7-A7C7DA7A0DAA}(Exchange 2016 CU8 and later)
參考資料:
https://docs.microsoft.com/en-us/exchange/architecture/mailbox-servers/recreate-arbitration-mailboxes?view=exchserver-2019
0x05 小結(jié)
CVE-2021-34473作為ProxyShell攻擊鏈的基礎(chǔ),驗(yàn)證簡單,危害巨大。站在防御的角度,建議用戶盡快更新補(bǔ)丁。