CVE-2015-1641及利用樣本分析

Gcow安全團隊發表於2020-11-29
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物件:

 

圖片1 rtfobj

 

手動提取出來2號物件存為一RTF文件,Windbg附加Word 2007並開啟該文件,崩潰點如下:

 

圖片2 崩潰點

 

之後將0號與2號物件提取出來存為一RTF文件:

 

 

設斷bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd50){}.else{gc}"

 

圖片4 斷點

 

待執行call wwlib!DllGetClassObject+0x50fe前檢視棧中引數如下:

 

圖片5 棧中引數

 

透過rtfobj.py -s 2將2號物件存為一Word文件,檢視其word目錄下document.xml

 

圖片6 smartTag標籤

 

可以看到smartTag標籤屬性值與棧中引數對應關係。

 

根據微軟文件,displacedByCustomXml屬性指定替換標籤應為customXml:

 

圖片7 MicroSoft Docs

 

繼續跟進分析,計算寫入地址:

 

圖片8 計算寫入地址

 

計算公式為[[Parameter 1]+0x8]*[Parameter 2]+[[Parameter 1]+0xC]+[Parameter 1],具體引數值見圖5。直接步過該函式,可以看到其結果與公式結果無異:

 

圖片9 Result

 

跟進,檢視其memcpy傳遞引數:

 

圖片10 呼叫memcpy

 

圖片11 memcpy傳遞引數

 

向0x7c38bd74地址處寫入0xffffe696,該值用於第二次計算Dst Address。

 

重新設斷bp wwlib!DllGetClassObject+0x50e6 ".if(ecx=7c38bd68){}.else{gc}",斷下之後跟進到其計算Dst Address函式:

 

圖片12 第二次計算Dst Address

 

可以看到[[Parameter 1]+0xC]為之前寫入值。第二次寫入覆蓋MSVCR71.DLL虛擬函式表中函式呼叫地址:

 

圖片13 MSVCR71.DLL vftable

 

第三次寫入:

 

圖片14 第三次寫入

 

該值用於第四次計算Dst Address:

 

圖片15 第四次計算Dst Address

 

第四次寫入:

 

圖片16 第四次寫入

0x02.2 劫持執行流

繼續向下執行,崩潰點如下:

 

圖片17 MSVCR71崩潰點

 

重新載入RTF文件,於0x7c376fc4處設斷:

 

圖片18 崩潰點前指令

 

圖片19 劫持執行流

 

由上圖可知第二次記憶體寫入——覆蓋MSVCR71.DLL虛擬函式表中函式呼叫地址,第四次記憶體寫入——覆蓋傳遞引數。

 

將1號物件加入後存為RTF文件,重新載入分析,bp 0x7c376fc8設斷:

 

圖片20 堆噴

 

可以看到堆噴佈局如上,該佈局由1號物件\word\activeX目錄中activeX1.bin完成:

 

圖片21 activeX1.bin

 

根據其佈局,不斷執行ret,到0x7c3651EB處開始ROP鏈:

 

圖片22 0x7c3651EB

 

執行VirtualProtect以繞過DEP保護:

 

圖片23 更改記憶體屬性

 

然後開始執行activeX1.bin內Shellcode部分:

 

圖片24 Shellcode

0x02.3 Shellcode of activeX1.bin

遍歷當前程式中開啟檔案控制程式碼,查詢其Size符合如下條件的檔案:

 

圖片25 查詢檔案

 

對映到記憶體中:

 

 

透過檔案頭與FEFEFEFE FEFEFEFE FFFFFFFF判斷是否為樣本檔案及Shellcode起始位置:

 

圖片27 判斷

 

複製Shellcode到VirtualAlloc開闢空間內,之後跳轉到第二部分Shellcode執行。

0x02.4 Shellcode of RTF

解密後續Shellcode:

 

圖片28 解密

 

由ANY.RUN可見其後續行為(有興趣的讀者請自行下載樣本分析):

 

圖片29 ANY.RUN

正常情況下,Word在解析customXml標籤時會開闢一新空間:

 

圖片30 開闢空間

 

圖片31 customXml標籤處理流程

 

而在解析smartTag時:

 

圖片32 smartTag標籤處理流程

 

故藉此可以控制目標寫入地址。

0x03 Patchwork組織某利用樣本分析

0x03.1 RTF文件分析

MD5:2C22EA1CED258346351EAD09B1DC6074

 

檢視OLE物件:

 

圖片33 OLE物件

 

0號物件用以載入OTKLOADR.DLL以引入MSVCR71.DLL繞過ASLR;

 

1號物件用以完成堆噴及Shellcode佈局;

 

2號物件用以觸發CVE-2015-1641漏洞,觸發點位於styles.xml中:

 

圖片34 styles.xml

 

載入RTF文件,bp 0x7c376fc8設斷,執行ROP鏈後呼叫VirtualProtect更改記憶體屬性,跳轉到Shellcode:

 

圖片35 VirtualProtect

 

透過jmp+call+pop給傳參,解密後續Shellcode:

 

圖片36 傳遞引數

 

解密邏輯如下:

 

圖片37 解密

 

開闢記憶體空間,複製加密Shellcode並解密:

 

圖片38 開闢記憶體、複製、解密

 

透過call指令為函式傳遞引數:

 

圖片39 傳參

 

後續仍有數次解密Shellcode過程,不再一 一列出。於C:\Users\xxx\AppData\Roaming\Microsoft\Templates目錄下建立檔案:

 

圖片40 Normal.domx

 

寫入檔案內容:
圖片41 WriteFile

 

之後於相同目錄下建立~$Normal.dat並寫入內容:

 

 

圖片43 WriteFile

 

該檔案具有隱藏屬性:

 

圖片44 隱藏檔案

 

HKEY_CURRENT_USER下建立登錄檔項:

 

圖片45 RegCreateKey

 

設定登錄檔鍵值:

 

圖片46 RegSetValue

 

刪除登錄檔禁用項:

 

圖片47 RegDeleteKey

 

後續將由wscript.exe執行C:\Users\xxx\AppData\Roaming\Microsoft\Templates\Normal.domx,該檔案實際為VBE格式:

 

圖片48 Normal.domx

 

可藉由scrdec18工具解密:

 

圖片49 Normal.vbs

0x03.2 Normal.domx分析

該檔案本質為VBE格式,可由wscript.exe正常載入。分析時需透過工具解密出VBS指令碼。

 

讀取~$Normal.dat第一部分內容並解密,寫入%USERPROFILE%\AppData\Local\Microsoft\Windows\Temporary Internet Files\Content.Word\PLAs_NEW_ORBAT.doc

 

圖片50 釋放PLAs_NEW_ORBAT.doc

 

該文件用於迷惑受害者:

 

圖片51 PLAs_NEW_ORBAT.doc

 

之後釋放三個PE檔案並設定隱藏屬性:

 

圖片52 釋放PE檔案

 

執行MicroScMgmt.exe並刪除自身以及~$Normal.dat

 

圖片53 執行MicroScMgmt.exe

0x03.3 MicroScMgmt.exe分析

檢視匯入表:

 

圖片54 MicroScMgmt.exe匯入表

 

該檔案為帶有數字簽名的白檔案:

 

圖片55 數字簽名

 

其用於載入惡意DLL——jli.dll

0x03.4 jli.dll分析

MD5:051573B9173DE6886E0575F81778EA03

 

檢視其匯出函式:

 

圖片56 匯出函式

 

該檔案帶有無效簽名:

 

圖片57 無效簽名

 

其與Patchwork組織之前使用過的BADNEWS木馬存在相似性,此處暫不展開分析。完整攻擊鏈如下:

 

圖片58 攻擊鏈

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)

相關文章