1 2 3 4 5 | 1. 本文一共 1920 個字 58 張圖 預計閱讀時間 12 分鐘
2. 本文作者erfze 屬於Gcow安全團隊複眼小組 未經過許可禁止轉載
3. 本篇文章從CVE - 2015 - 1641 漏洞的分析入手 詳細的闡述漏洞的成因再分析Patchwork APT組織使用的該漏洞的樣本
4. 本篇文章一棟 十分適合漏洞安全研究人員 以及威脅分析人員進行學習交流
5. 若文章中存在說得不清楚或者錯誤的地方 歡迎師傅到公眾號後臺留言中指出 感激不盡
|
0x01 漏洞描述
漏洞成因:型別混淆漏洞。Word在處理displacedByCustomXml
屬性時未對customXml
標籤物件進行有效性驗證,可以透過傳入其他標籤物件,由型別混淆進而達到任意記憶體寫。故可以藉由精心構造的標籤物件及對應屬性值實現RCE。
影響版本:Microsoft Word 2007 SP3, Office 2010 SP2, Word 2010 SP2, Word 2013 SP1, Word 2013 RT SP1, Word for Mac 2011, Office Compatibility Pack SP3, Word Automation Services on SharePoint Server 2010 SP2 & 2013 SP1, Office Web Apps Server 2010 SP2 & 2013 SP1
0x02 漏洞分析
樣本資訊及分析環境如下:
MD5:A69F778D1F511268019B1080F5E3B98B
OS版本:Windows 7 SP1(x86)
Word版本:2007
WWLIB.DLL版本:12.0.4518.1014
0x02.1 型別混淆—>任意地址寫
透過rtfobj檢視該文件的OLE物件:
手動提取出來2號物件存為一RTF文件,Windbg附加Word 2007並開啟該文件,崩潰點如下:
之後將0號與2號物件提取出來存為一RTF文件:
設斷bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd50){}.else{gc}"
:
待執行call wwlib!DllGetClassObject+0x50fe
前檢視棧中引數如下:
透過rtfobj.py -s 2
將2號物件存為一Word文件,檢視其word
目錄下document.xml
:
可以看到smartTag標籤屬性值與棧中引數對應關係。
根據微軟文件,displacedByCustomXml
屬性指定替換標籤應為customXml:
繼續跟進分析,計算寫入地址:
計算公式為[[Parameter 1]+0x8]*[Parameter 2]+[[Parameter 1]+0xC]+[Parameter 1],具體引數值見圖5。直接步過該函式,可以看到其結果與公式結果無異:
跟進,檢視其memcpy
傳遞引數:
向0x7c38bd74地址處寫入0xffffe696,該值用於第二次計算Dst Address。
重新設斷bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd68){}.else{gc}"
,斷下之後跟進到其計算Dst Address函式:
可以看到[[Parameter 1]+0xC]為之前寫入值。第二次寫入覆蓋MSVCR71.DLL虛擬函式表中函式呼叫地址:
第三次寫入:
該值用於第四次計算Dst Address:
第四次寫入:
0x02.2 劫持執行流
繼續向下執行,崩潰點如下:
重新載入RTF文件,於0x7c376fc4處設斷:
由上圖可知第二次記憶體寫入——覆蓋MSVCR71.DLL虛擬函式表中函式呼叫地址,第四次記憶體寫入——覆蓋傳遞引數。
將1號物件加入後存為RTF文件,重新載入分析,bp 0x7c376fc8
設斷:
可以看到堆噴佈局如上,該佈局由1號物件\word\activeX
目錄中activeX1.bin
完成:
根據其佈局,不斷執行ret
,到0x7c3651EB
處開始ROP鏈:
執行VirtualProtect以繞過DEP保護:
然後開始執行activeX1.bin
內Shellcode部分:
0x02.3 Shellcode of activeX1.bin
遍歷當前程式中開啟檔案控制程式碼,查詢其Size符合如下條件的檔案:
對映到記憶體中:
透過檔案頭與FEFEFEFE FEFEFEFE FFFFFFFF
判斷是否為樣本檔案及Shellcode起始位置:
複製Shellcode到VirtualAlloc開闢空間內,之後跳轉到第二部分Shellcode執行。
0x02.4 Shellcode of RTF
解密後續Shellcode:
由ANY.RUN可見其後續行為(有興趣的讀者請自行下載樣本分析):
附
正常情況下,Word在解析customXml標籤時會開闢一新空間:
而在解析smartTag時:
故藉此可以控制目標寫入地址。
0x03 Patchwork組織某利用樣本分析
0x03.1 RTF文件分析
MD5:2C22EA1CED258346351EAD09B1DC6074
檢視OLE物件:
0號物件用以載入OTKLOADR.DLL以引入MSVCR71.DLL繞過ASLR;
1號物件用以完成堆噴及Shellcode佈局;
2號物件用以觸發CVE-2015-1641漏洞,觸發點位於styles.xml
中:
載入RTF文件,bp 0x7c376fc8
設斷,執行ROP鏈後呼叫VirtualProtect更改記憶體屬性,跳轉到Shellcode:
透過jmp
+call
+pop
給傳參,解密後續Shellcode:
解密邏輯如下:
開闢記憶體空間,複製加密Shellcode並解密:
透過call
指令為函式傳遞引數:
後續仍有數次解密Shellcode過程,不再一 一列出。於C:\Users\xxx\AppData\Roaming\Microsoft\Templates
目錄下建立檔案:
寫入檔案內容:
之後於相同目錄下建立~$Normal.dat
並寫入內容:
該檔案具有隱藏屬性:
於HKEY_CURRENT_USER
下建立登錄檔項:
設定登錄檔鍵值:
刪除登錄檔禁用項:
後續將由wscript.exe
執行C:\Users\xxx\AppData\Roaming\Microsoft\Templates\Normal.domx
,該檔案實際為VBE格式:
可藉由scrdec18工具解密:
0x03.2 Normal.domx分析
該檔案本質為VBE格式,可由wscript.exe
正常載入。分析時需透過工具解密出VBS指令碼。
讀取~$Normal.dat
第一部分內容並解密,寫入%USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.Word\PLAs_NEW_ORBAT.doc
:
該文件用於迷惑受害者:
之後釋放三個PE檔案並設定隱藏屬性:
執行MicroScMgmt.exe
並刪除自身以及~$Normal.dat
:
0x03.3 MicroScMgmt.exe分析
檢視匯入表:
該檔案為帶有數字簽名的白檔案:
其用於載入惡意DLL——jli.dll
。
0x03.4 jli.dll分析
MD5:051573B9173DE6886E0575F81778EA03
檢視其匯出函式:
該檔案帶有無效簽名:
其與Patchwork組織之前使用過的BADNEWS木馬存在相似性,此處暫不展開分析。完整攻擊鏈如下:
0x04 參閱連結
CVE-2015-1641 Word 利用樣本分析(https://paper.seebug.org/351/)
Microsoft Docs——displacedByCustomXml(https://docs.microsoft.com/en-us/previous-versions/office/developer/office-2010/cc847826(v=office.14)?redirectedfrom=MSDN)
手把手教你如何構造office漏洞EXP(第四期)(https://www.anquanke.com/post/id/85031)