您好,登錄后才能下訂單哦!
這篇文章給大家介紹怎么進行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 版本。
操作系統: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 文件、俄文文檔,俄文文檔沒有仔細看,好像是關于漏洞利用的。
包含漏洞的 XML 文件為 document.xml,文件在 `word` 路徑下。打開 document.xml 文件,分析后發(fā)現 <w:font> 標簽使用了 </o:idmap> 標簽進行閉合,而 <w:font> 標簽的 w:name 屬性有點奇怪,可能是用于控制某一個地址的值。
將解壓過的 docx文檔重新壓縮,之后使用注冊表附加調試器準備調試。
附加完成之后打開含有漏洞的文檔,運行后觸發(fā)異常,其中 call [ecx+4] 指令是利用虛函數表調用虛函數,而 ecx 為虛函數表指針,通過 wwlib.41249DA0 函數返回。
查看堆棧調用,發(fā)現用于處理 XML 格式的 msxml 模塊,msxml 模塊通過間接調用 wwlib 模塊去協助解析 XML 格式。暫且將 wwlib.3161309E 函數定為漏洞函數。
對漏洞函數下記錄斷點后查看日志內容,發(fā)現漏洞函數被調用了 6 次,結合 document.xml 文件中的標簽元素分析漏洞函數很有可能是用于解析元素標簽的,至于解析的是什么,目前還不清楚。
選取最后一次調用漏洞函數的 esp 下條件斷點,分析漏洞函數處理流程。
函數斷下后從傳入的參數可以發(fā)現,esi 可能是儲存標簽信息的數據結構。
單步進入該函數,在如圖所示的位置會取出元素的嵌套關系,此時 <o:idmap> 標簽已經插到了 <w:font> 標簽的后面(以 ":" 符號為分隔符)。而 <w:font> 標簽在未閉合的情況插入了 <o:idmap> 標簽,說明嵌套關系已經被錯誤的解析。
調試到 0x31613084 地址時發(fā)現會調用 wwlib.31249DA0 函數,經過分析后發(fā)現該函數的返回值和異常處的虛函數表調用有關,所以進入這個函數看看。
通過分析發(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]]其實就是當前元素的嵌套等級。
調用完 wwlib.31249DA0 后會將[[0x0751D140+44]+44]地址的值作為虛函數表指針進行虛函數調用,進而觸發(fā)異常。如圖所示可以看出[0x0751D140+44]地址被覆蓋成了 <w:font> 元素的 w:name 屬性,所以攻擊者通過修改 <w:font> 標簽的 w:name 屬性就可以做到調用任意地址。
接下來更改樣本中的 document.xml 文件,手動添加 </w:font> 閉合標簽,看看是否會觸發(fā)異常。
在漏洞函數處斷下,這時的嵌套等級為 5。
之后通過 wwlib.31249DA0 計算虛函數調用地址為 0x075098F4。由于嵌套等級為 5,所以計算出的結果為 F4(4C*(5 - 2) + 10),之前的為 140(4C*(6 - 2) + 10)。由于嵌套等級由 5 變?yōu)?6,導致計算結果出現偏差。
虛函數調用后程序并沒有觸發(fā)異常。
為了快速了解 msxml 模塊的處理流程,對調用堆棧中的所有 msxml 模塊函數下記錄斷點,查看日志。
從日志中可以發(fā)現漏洞函數的調用都是通過 sub_78887830 函數中的 call [ebx+200] 的指令實現的,但是倒數第二個漏洞函數的調用卻沒有經過 call [ebx+200] 而是直接跳到了 MSO 模塊。
對倒數第二個漏洞函數下斷點。斷下后分析堆棧調用,發(fā)現 msxml.78887830 函數中的 call [ecx+20] 的指令也會調用漏洞函數。
這樣的話函數調用流程圖就能分析出來了,函數調用流程如下圖所示:
下面根據 msxml.78887830 函數的最后一次調用,簡單分析 call [ebx+200] 下的函數鏈調用。
在 msxml.78887830 函數開頭會將元素標簽對象儲存在 ebx 中,元素標簽對象儲存當前解析元素的信息,主要是元素的嵌套關系,嵌套等級等。
向下調試后發(fā)現 msxml.788872F7 函數會獲取 <w:font> 元素的 w:name 屬性字符的指針。
而下面的 msxml.78887335 函數會獲取 o:idmap 元素字符的指針
獲取完 o:idmap 元素字符的指針后,調用 msxml.788872F7 函數解析 o:idmap 元素,在內存窗口可以看出字符指針已經指向了 incer 的位置,說明已經把 idmap 標簽解析出來了。
之后調用 msxml.788873F0 計算元素的嵌套等級,可以看出元素的嵌套等級計算出為 6,但此時元素的嵌套等級依舊是 5,還沒有更新為 6。
在將 [ebx+1e8] 賦值給 eax 之后,發(fā)生了跳轉,從而跳過了 call [ecx+20] 的調用轉而進行 call [ebx+200] 的調用。
調用的函數為 mso.32751CAA,其實 MSO 模塊的函數調用沒有太大的作用,只是給后面 wwlib 模塊的做間接處理。
到達 0x32751D5C 的位置后執(zhí)行 call [ecx+20] 指令調用 sub_3277FAC0 函數,此時 esi = [esi+60]。
接著 sub_3277FAC0 函數中會執(zhí)行 call [eax+10] 指令調用 wwlib.3127D3FB。
進入 wwlib.3127D3FB 函數之后繼續(xù)向下調試,此時 [[esi+b14]] 的地址中儲存著元素的嵌套關系。
之后調用完 wwlib.3127E6B3 函數后會進行一個判斷,如果 ebx 等于 0x80004001 就跳轉。
跳轉完成之后調用漏洞函數,下面的流程剛剛已經分析過了。
根據上面調試分析的結果對其中幾個位置下記錄斷點。查看日志可以發(fā)現 msxml.78887830 函數會逐一對元素進行解析,當解析到 <idmap> 標簽時嵌套關系為 5。
但是在異常處嵌套關系為 6,對最后一次調用 msxml.78887830 函數下斷點,查看嵌套關系是何時變?yōu)?6 的。
重新運行后斷下,此時嵌套關系為 5。
當調試到 wwlib.3127D3FB 函數中的 0x3128E3AD 位置時,嵌套等級變?yōu)榱?6,說明 wwlib.312C6142 函數更新了嵌套等級。
接著分析一下 w:name 屬性是何時被復制的。通過對漏洞異常處的分析發(fā)現 w:name 屬性儲存在元素對象中,通過對元素對象儲存 w:name 位置下寫入斷點發(fā)現在 WWLIB.sub_3127D3FB 函數中會調用 wwlib.3127E773 函數復制 w:name 到元素對象當中,之后漏洞函數中會把 w:name 屬性取出來進行虛函數表調用。
需要注意的是再上面的分析中該跳轉并沒有實現,也就是說這里在復制完 w:name 屬性之后直接返回了。而判斷跳轉的值是由 wwlib.3127E6B3 返回的,進入該函數,分析后發(fā)現在函數末尾處會將 0x80004001 賦值給 eax,在這之前會以 0x3149BFA3 作為基址,以 eax * 4 做為偏移地址進行調用,而 eax 是通過 [ebp-1c] 傳進來的,對該位置下記錄斷點后查看日志。
根據日志可以發(fā)現當 [ebp+1c] 的值為 0xFFFF 時才會調用漏洞函數。而且解析 <w:font> 標簽前調用一次,解析 <o:idmap> 標簽后調用一次。
之后把 <o:idmap> 標簽刪除,再對比日志信息。
可以發(fā)現只有在 <w:font> 標簽解析前才會將此值設置為 0xFFFF,所以這一個值可能是用于判斷元素是否閉合。
最后總結得出 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模塊解析混淆漏洞分析就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng)、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。