溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

發(fā)布時間:2021-12-24 21:38:42 來源:億速云 閱讀:151 作者:柒染 欄目:安全技術

這篇文章給大家介紹怎么進行Office Open XML wwlib模塊解析混淆漏洞分析,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

一、前言

CVE-2017-11826 據說是 360 在 2017 年 9 月底發(fā)現的一個關于 XML 格式解析的一個漏洞,之后微軟在 10 月份發(fā)布了關于 CVE-2017-11826 的補丁。該漏洞的成因是由于在解析閉合元素時,沒有對元素的完整性做出判斷,導致將當前元素的嵌套關系加上 1。這樣的話 wwlib 模塊在處理閉合標簽時,會錯誤的使用父級元素 w:name 屬性 +44 的地址進行虛函數調用,攻擊者通過修改 w:name 屬性,就可以進行任意地址調用。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

受影響的 Office 版本。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

二、調試環(huán)境

操作系統:Windows 7 + VMware

調試工具:x64dbg

漏洞樣本:POC

補丁地址:https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11826

三、調試分析

從 GitHub 上下載關于 CVE-2017-11826 漏洞的文件夾,解壓后發(fā)現包括解壓過的 docx 文件、README 文件、俄文文檔,俄文文檔沒有仔細看,好像是關于漏洞利用的。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

包含漏洞的 XML 文件為 document.xml,文件在 `word` 路徑下。打開 document.xml 文件,分析后發(fā)現 <w:font> 標簽使用了 </o:idmap> 標簽進行閉合,而 <w:font> 標簽的 w:name 屬性有點奇怪,可能是用于控制某一個地址的值。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

將解壓過的 docx文檔重新壓縮,之后使用注冊表附加調試器準備調試。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

附加完成之后打開含有漏洞的文檔,運行后觸發(fā)異常,其中 call [ecx+4] 指令是利用虛函數表調用虛函數,而 ecx 為虛函數表指針,通過 wwlib.41249DA0 函數返回。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

查看堆棧調用,發(fā)現用于處理 XML 格式的 msxml 模塊,msxml 模塊通過間接調用 wwlib 模塊去協助解析 XML 格式。暫且將 wwlib.3161309E 函數定為漏洞函數。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

對漏洞函數下記錄斷點后查看日志內容,發(fā)現漏洞函數被調用了 6 次,結合 document.xml 文件中的標簽元素分析漏洞函數很有可能是用于解析元素標簽的,至于解析的是什么,目前還不清楚。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

選取最后一次調用漏洞函數的 esp 下條件斷點,分析漏洞函數處理流程。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

函數斷下后從傳入的參數可以發(fā)現,esi 可能是儲存標簽信息的數據結構。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

單步進入該函數,在如圖所示的位置會取出元素的嵌套關系,此時 <o:idmap> 標簽已經插到了 <w:font> 標簽的后面(以 ":" 符號為分隔符)。而 <w:font> 標簽在未閉合的情況插入了 <o:idmap> 標簽,說明嵌套關系已經被錯誤的解析。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

調試到 0x31613084 地址時發(fā)現會調用 wwlib.31249DA0 函數,經過分析后發(fā)現該函數的返回值和異常處的虛函數表調用有關,所以進入這個函數看看。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

通過分析發(fā)現該函數對 ecx 和 edx 做了一些簡單的計算,算法為[[ecx]+8]*edx + [[ecx]+C] + [ecx],計算結果為 0x0751D140;而 ecx 是由 esi 傳入,edx 又等于[[esi]],所以算法變?yōu)閇[esi]+8]*([[esi]]-2) + [[esi]+C] + [esi],由傳入的 esi 控制,經過后面的分析可以得出[[esi]]其實就是當前元素的嵌套等級。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

調用完 wwlib.31249DA0 后會將[[0x0751D140+44]+44]地址的值作為虛函數表指針進行虛函數調用,進而觸發(fā)異常。如圖所示可以看出[0x0751D140+44]地址被覆蓋成了 <w:font> 元素的 w:name 屬性,所以攻擊者通過修改 <w:font> 標簽的 w:name 屬性就可以做到調用任意地址。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

接下來更改樣本中的 document.xml 文件,手動添加 </w:font> 閉合標簽,看看是否會觸發(fā)異常。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

在漏洞函數處斷下,這時的嵌套等級為 5。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

之后通過 wwlib.31249DA0 計算虛函數調用地址為 0x075098F4。由于嵌套等級為 5,所以計算出的結果為 F4(4C*(5 - 2) + 10),之前的為 140(4C*(6 - 2) + 10)。由于嵌套等級由 5 變?yōu)?6,導致計算結果出現偏差。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

虛函數調用后程序并沒有觸發(fā)異常。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

四、分析 msxml 模塊處理步驟

為了快速了解 msxml 模塊的處理流程,對調用堆棧中的所有 msxml 模塊函數下記錄斷點,查看日志。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

從日志中可以發(fā)現漏洞函數的調用都是通過 sub_78887830 函數中的 call [ebx+200] 的指令實現的,但是倒數第二個漏洞函數的調用卻沒有經過 call [ebx+200] 而是直接跳到了 MSO 模塊。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

對倒數第二個漏洞函數下斷點。斷下后分析堆棧調用,發(fā)現 msxml.78887830 函數中的 call [ecx+20] 的指令也會調用漏洞函數。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

這樣的話函數調用流程圖就能分析出來了,函數調用流程如下圖所示:

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

下面根據 msxml.78887830 函數的最后一次調用,簡單分析 call [ebx+200] 下的函數鏈調用。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

在 msxml.78887830 函數開頭會將元素標簽對象儲存在 ebx 中,元素標簽對象儲存當前解析元素的信息,主要是元素的嵌套關系,嵌套等級等。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

向下調試后發(fā)現 msxml.788872F7 函數會獲取 <w:font> 元素的 w:name 屬性字符的指針。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

而下面的 msxml.78887335 函數會獲取 o:idmap 元素字符的指針

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

獲取完 o:idmap 元素字符的指針后,調用 msxml.788872F7 函數解析 o:idmap 元素,在內存窗口可以看出字符指針已經指向了 incer 的位置,說明已經把 idmap 標簽解析出來了。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

之后調用 msxml.788873F0 計算元素的嵌套等級,可以看出元素的嵌套等級計算出為 6,但此時元素的嵌套等級依舊是 5,還沒有更新為 6。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

在將 [ebx+1e8] 賦值給 eax 之后,發(fā)生了跳轉,從而跳過了 call [ecx+20] 的調用轉而進行 call [ebx+200] 的調用。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

調用的函數為 mso.32751CAA,其實 MSO 模塊的函數調用沒有太大的作用,只是給后面 wwlib 模塊的做間接處理。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

到達 0x32751D5C 的位置后執(zhí)行 call [ecx+20] 指令調用 sub_3277FAC0 函數,此時 esi = [esi+60]。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

接著 sub_3277FAC0 函數中會執(zhí)行 call [eax+10] 指令調用 wwlib.3127D3FB。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

進入 wwlib.3127D3FB 函數之后繼續(xù)向下調試,此時 [[esi+b14]] 的地址中儲存著元素的嵌套關系。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

之后調用完 wwlib.3127E6B3 函數后會進行一個判斷,如果 ebx 等于 0x80004001 就跳轉。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

跳轉完成之后調用漏洞函數,下面的流程剛剛已經分析過了。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

根據上面調試分析的結果對其中幾個位置下記錄斷點。查看日志可以發(fā)現 msxml.78887830 函數會逐一對元素進行解析,當解析到 <idmap> 標簽時嵌套關系為 5。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

但是在異常處嵌套關系為 6,對最后一次調用 msxml.78887830 函數下斷點,查看嵌套關系是何時變?yōu)?6 的。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

重新運行后斷下,此時嵌套關系為 5。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

當調試到 wwlib.3127D3FB 函數中的 0x3128E3AD 位置時,嵌套等級變?yōu)榱?6,說明 wwlib.312C6142 函數更新了嵌套等級。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

接著分析一下 w:name 屬性是何時被復制的。通過對漏洞異常處的分析發(fā)現 w:name 屬性儲存在元素對象中,通過對元素對象儲存 w:name 位置下寫入斷點發(fā)現在 WWLIB.sub_3127D3FB 函數中會調用 wwlib.3127E773 函數復制 w:name 到元素對象當中,之后漏洞函數中會把 w:name 屬性取出來進行虛函數表調用。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

需要注意的是再上面的分析中該跳轉并沒有實現,也就是說這里在復制完 w:name 屬性之后直接返回了。而判斷跳轉的值是由 wwlib.3127E6B3 返回的,進入該函數,分析后發(fā)現在函數末尾處會將 0x80004001 賦值給 eax,在這之前會以 0x3149BFA3 作為基址,以 eax * 4 做為偏移地址進行調用,而 eax 是通過 [ebp-1c] 傳進來的,對該位置下記錄斷點后查看日志。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

根據日志可以發(fā)現當 [ebp+1c] 的值為 0xFFFF 時才會調用漏洞函數。而且解析 <w:font> 標簽前調用一次,解析 <o:idmap> 標簽后調用一次。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

之后把 <o:idmap> 標簽刪除,再對比日志信息。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

可以發(fā)現只有在 <w:font> 標簽解析前才會將此值設置為 0xFFFF,所以這一個值可能是用于判斷元素是否閉合。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

最后總結得出 msxml.78887830 處理標簽元素的流程。當 msxml.78887830 函數解析到 <w:font> 標簽時,會誤以為標簽已經閉合(跳轉值:0xFFFF),從而將 <o:idmap> 標簽插入到 <w:font> 標簽后,接著會把 <w:font> 標簽的 w:name 屬性(假如有的話)添加到對象之中,同時更新元素的嵌套關系(嵌套關系變?yōu)?6),導致最后使用 call [ecx+4] 進行虛函數表調用時虛表指針被錯誤的覆蓋成了    w:name 屬性中的數據觸發(fā)了異常。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

一些關鍵的數據及函數調用。

怎么進行Office Open XML wwlib模塊解析混淆漏洞分析

關于怎么進行Office Open XML wwlib模塊解析混淆漏洞分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。

向AI問一下細節(jié)

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI