在今年3月份,微軟公布了多個Microsoft Exchange的高危漏洞,通過組合利用這些漏洞可以在未經身份驗證的情況下遠程獲取伺服器權限。這套組合拳被稱為ProxyLogon。安全研究員Orange Tsai於2020年底發現該系列漏洞並命名。ProxyLogon是Exchange歷史上最具影響力的漏洞之一,有上千臺Exchange伺服器被植入了webshell後門。
0x01 漏洞描述CVE-2021-26855是一個SSRF漏洞,利用該漏洞可以繞過Exchange的身份驗證,CVE-2021-27065是一個文件寫入漏洞。二者結合可以在未登錄的狀態下寫入webshell。
0x02 影響範圍Exchange Server 2019 < 15.02.0792.010
Exchange Server 2019 < 15.02.0721.013
Exchange Server 2016 < 15.01.2106.013
Exchange Server 2013 < 15.00.1497.012
0x03 調試環境及工具
版本
作業系統
Windows Server 2012
應用名稱
Microsoft Exchange Server 2016
.NET反編譯調試器
DnSpy
.NET反編譯對比器
Telerik
0x04 CVE-2021-26855 SSRF漏洞1. 補丁查看
通過對比補丁內容,快速定位漏洞位置。
Exchange版本號查看:
打開 ExchangeManagement Shell,並執行命令:
Get-ExchangeServer | fl name,edition,admindisplayversion
版本對應關係可以在微軟官網中查看:
搜索對應版本的補丁(Exchange 2016 RTM的補丁未找到,所以直接用 Exchange CU11 的補丁分析):
https://www.catalog.update.microsoft.com/Search.aspx?q=exchange%202016%20cu11
下載補丁KB5000871,使用winrar解壓cab文件,解壓後是一個msp文件,使用7-zip 對msp格式的文件內容進行提取。
使用Telerik對補丁內容做對比,內容有差異的dll文件如下,漏洞存在於Microsoft.Exchange.FrontEndHttpProxy.dll中:
使用Reflector對dll文件反編譯並導出源碼,方便對關鍵字進行搜索。
2. 漏洞調試
使用dnSpy對Microsoft.Exchange.FrontEndHttpProxy.dll 文件進行反編譯,定位到class BEResourceRequestHandler,下斷點。
點擊 【調試】–>【附加到進程】 MSExchangeECPAppPool,使用ProcessExplorer查看對應的進程ID。
使用進程ID進行過濾(註:必須以管理員權限運行dnSpy,否則無法獲取進程信息)。
在BackEndCookieEntryParse 的TryParse()函數下斷點,bp發請求,觸發斷點。
首先會根據uri來判斷請求的協議類型,如果請求協議為ecp,即請求uri為/ecp/。跟蹤進入CanHandle()函數,驗證cookie及uri的合法性。
獲取cookie中X-BEResource的值
判斷uri 是否合法
uri以 js,css,html,flt,xap等後綴結尾的文件(沒有驗證文件是否存在)都是合法的。拼接後 /ecp/xx.(js|css)等都是有效uri。
接著對X-BEResource的值進行處理
獲取到X-BEResource的值
並使用『~』分割得到數組array
其中array[0] 為fqdn;array[1] 為version
接著進行版本比較
如果版本的值小於 E15MinVersion,進入if判斷語句,並將類成員變量ProxyToDownLevel賦值為True,之後會調用身份認證函數EcpProxyRequestHandler.AddDownLevelProxyHeaders進行身份認證,如果沒有通過認證,則返回401錯誤。同理如果version大於E15MinVersion則跳過if判斷從而繞過身份認證。
經過一系列的解析
可以看到host的值是win2012,這個值我們可控,最後經過一系列的拼接得到AbsoluteUri的值:https://host/autodiscover/autodiscover.xml。(autodiscover.xml 文件中包含有LegacyDN 的值)
進入CreateServerRequest函數,訪問uri,
進入PrepareServerRequest函數,會進行授權認證判斷,
接著進入AddProtocolSpecificHeadersToServerRequest,
由於ProxyToDownLevel被置為false不會進入if語句,從而導致可以直接繞過認證,進而在未授權的狀態下獲取autodiscover.xml文件內容。
0x05 CVE-2021-27065 任意文件寫入漏洞
在Exchange伺服器上依次打開【管理中心】 -【伺服器】-【虛擬目錄】-【OAB虛擬目錄】。
由於外部URL的內容可控,所以可在URL寫入一句話木馬(其中URL必須以http開頭,以保持外部URL參數的合法性)。
之後可以通過重置虛擬目錄,來把配置內容寫入指定的路徑。
註:路徑必須是UNC路徑格式:\\host\ShareFolder\aaa.xml
修改路徑為:\\win2012.test.local\C$\test.aspx
可以看到OAB VirtualDirectory的配置信息已經被寫入C:/test.aspx文件中。
上述操作請求內容如下:
POST /ecp/DDI/DDIService.svc/SetObject?schema=OABVirtualDirectory&msExchEcpCanary=pM2NWg8xu0euTUqTjiLwzquHekjm6dgIw6lt6YfDyflndCz1iGsGnnhEivzKafJL9vhOxpqYuAU.
請求中有一個關鍵參數msExchEcpCanary,如果沒有這個參數,服務端返回500錯誤。這個參數的值可以利用CVE-2021-26855 SSRF漏洞通過多次請求獲取。
0x06 漏洞利用過程
整個過程都是在未登錄的狀態下,利用SSRF漏洞訪問內部資源,Cookie中的 X-BEResource欄位內容為要訪問的資源連結。利用過程如圖:
1. 獲取server name,/ecp/xx.js,cookie中 mail.skyeye.com 為目標exchange的域名
2. 通過SSRF漏洞讀取autodiscover.xml文件,獲取LegacyDN的值;
3. 利用Legacy DN獲取SID;
4. 利用SID獲取Session、msExchEcpCanary;
5. 寫入shell。
cookie中的X-BEResource欄位內容為利用SSRF漏洞訪問的內網資源連結。
指定保存路徑
webshell路徑為:
https://[ip]/owa/auth/dkYAIm7ELFjJ3KVzXb1Q.aspx0x07 檢測修複方案針對上述漏洞,微軟發布了一款工具,用於幫助用戶檢測Exchange是否被黑客利用相關漏洞入侵。連結如下:
https://github.com/microsoft/CSS-Exchange/tree/main/Security
腳本
描述
EOMT.ps1
通過 URL 重寫配置緩解 CVE-2021-26855漏洞
ExchangeMitigations.ps1
該腳本包含4個緩解措施,以幫助解決以下漏洞:cve-2021-26855、cve-2021-26857、cve-2021-27065、cve-2021-26858
http-vuln-cve2021-26855.nse
nmap掃描腳本,檢測指定URL是否存在CVE-2021-26855漏洞
Test-ProxyLogon.ps1
該腳本檢查CVE-2021-26855、26858、26857和27065漏洞是否存在被利用的跡象
安裝微軟提供的漏洞補丁,相關漏洞補丁如下:
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-26855
https://msrc.microsoft.com/update-guide/vulnerability/CVE-2021-27065
0x08 參考連結
https://www.freebuf.com/articles/web/265539.html
https://www.praetorian.com/blog/reproducing-proxylogon-exploit/
https://docs.microsoft.com/en-us/exchange/architecture/architecture?view=exchserver-2019#client-access-protocol-architecture
https://secvery.com/5433.html
https://www.4hou.com/posts/q66D
https://www.anquanke.com/post/id/234607
職位要求:
網絡協議漏洞、常見客戶端軟體漏洞的分析;
漏洞利用代碼及工具的分析,特徵提取及驗證;
支持產品對特定漏洞或安全事件的應急響應;
能編寫腳本對樣本或漏洞做自動化檢測;
職位要求:
熟練掌握Linux/Unix或windows平臺的各種開發技能;
精通至少一種以下語言,C/C++/Java/Python/Golang/PHP等;
熟悉常用算法和數據結構,熟悉網絡編程、多線程編程技術;
熟悉TCP/IP等網絡協議;
了解常見安全漏洞及原理優先;
有安全檢測相關模塊設計與開發優先;
具有良好的團隊合作精神和積極主動的溝通意識;
本科或以上學歷,計算機相關專業。
職位描述:
安全產品系統相關模塊設計與編碼研發;
保障系統的穩定性和項目質量。
有意者可以直接私信公眾號~~