Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析
文章目錄
- 漏洞描述
- 分析環(huán)境
- RTF文件格式
- 基于棧回溯的漏洞分析方法
- 漏洞利用
- Office 2003與Office 2007 Exploit通用性研究
漏洞描述
Microsoft Office XP SP3,Office2003SP3,Office2007 SP2,Office 2010等多個(gè)版本的Office軟件中,Open XML文件格式轉(zhuǎn)換器存在棧溢出漏洞,主要是在處理RTF中的pFragments屬性時(shí)存在棧溢出,導(dǎo)致遠(yuǎn)程攻擊者可以借助特制的RTF數(shù)據(jù)執(zhí)行任意代碼,因此該漏洞又名RTF棧溢出漏洞
分析環(huán)境
| 操作系統(tǒng) | Windows XP SP3 |
| 虛擬機(jī) | VMware |
| 調(diào)試器 | windbg |
| 反匯編器 | IDA Pro |
| 漏洞軟件 | Office 2003 SP3與2007 SP0中文版 |
RTF文件格式
RTF格式是Microsoft公司為進(jìn)行文本和圖像信息格式的交換而制定的一種文件格式,它適用于不同的設(shè)備 操作系統(tǒng)和操作環(huán)境。RTF的基本元素是正文(Text) 控制字(Control Word) 控制符號(hào)(Control Symbol)和群組(Group)
控制字是RTF用來(lái)標(biāo)記打印控制符和文檔信息的一種特殊格式的命令,RTF用它作為正文格式的控制代碼,每個(gè)控制字均以一個(gè)反斜杠開(kāi)頭,由a-z小寫字母組成,通常應(yīng)該不包含任何大寫字母,而分隔符標(biāo)志著控制字名稱的結(jié)束。它的使用格式為:\字母序列<分隔符>
控制符號(hào)由一個(gè)反斜杠跟一個(gè)單獨(dú)的非字母的字符,表示一個(gè)特定的符號(hào)
群組由包含在大括號(hào)中的文本 控制字或控制符組成。左括號(hào)表示組的開(kāi)始,右括號(hào)表示組的結(jié)束。每個(gè)組包括文本和文本的不同屬性。RTF文件也能同時(shí)包括字體 格式 屏幕顏色 圖形 腳注 注釋 文件頭和文件尾 摘要信息 域和書簽的組合,以及文檔區(qū)段 段落和字符的格式屬性
一個(gè)完整的RTF文件包括文件頭<header>和文檔區(qū)<document>兩大部分,可以用下列的語(yǔ)法表示
<File>{<header><document>}通過(guò)微軟官方文檔的目錄,我們大體可以了解到文件頭和文檔區(qū)各自所包含的數(shù)據(jù),如下所示:
Content of an RTF fileHeaderRTF VersionCharacter SetUnicode RTFFont TableColor TableStyle SheetList TableTrack Changes(Revision Marks)Document AreaInformation GroupDocument Formatting PropertiesSection TextParagraph TextCharacter TextDocument VariablesBookmarksPicturesObjectsDrawing ObjectsWord 97-2000 RTF for Drawing Object(Shapes)FootnotesComments(Annotations)FieldsForm FieldsIndex EntriesBidrectional language Support我們回頭看下CVE-2010-3333(cve-2010-3333_exploit.doc)的部分?jǐn)?shù)據(jù),如圖所示
[外鏈圖片轉(zhuǎn)存失敗(img-HytgrTLN-1564825057651)(E:\博客\漏洞分析\Microsoft RTF棧溢出漏洞(CVE-2010-3333)]漏洞分析\assets\1560046133473.png)
樣本數(shù)據(jù)分析如下:
\rtf1——RTF版本 \ansi——支持ANSI字符集 \shp——繪圖對(duì)象 \*\shpinst———圖片引用 \sp——繪圖對(duì)象屬性定義 \sn pFragments——定義屬性名稱,pFragments段是圖形的附加部分 屬于數(shù)組結(jié)構(gòu)。它允許圖形包含多個(gè)路徑和分段,該屬性值列出圖形的各個(gè)碎片 \sv——定義屬性值RTF分析器正是在解析pFragments屬性值時(shí),沒(méi)有正確計(jì)算屬性值所占的空間大小,導(dǎo)致棧溢出漏洞的發(fā)生
基于棧回溯的漏洞分析方法
首先打開(kāi)winword.exe,接著用windbg附加進(jìn)程,輸入g命令直接運(yùn)行。接著打開(kāi)poc.rtf,此時(shí)觸發(fā)異常,如下圖:
查看一下堆棧
此時(shí)當(dāng)前棧已經(jīng)被樣本生成的垃圾數(shù)據(jù)覆蓋,接著用lmm命令查看mso模塊的詳細(xì)信息
0:000:x86> lmm mso v start end module name 30c90000 31837000 MSO (export symbols) MSO.DLLLoaded symbol image file: MSO.DLLImage path: MSO.DLLImage name: MSO.DLLTimestamp: Fri Aug 08 15:10:06 2003 (3F334CCE)CheckSum: 00BA7175ImageSize: 00BA7000File version: 11.0.5606.0Product version: 11.0.5606.0File flags: 0 (Mask 3F)File OS: 40004 NT Win32File type: 2.0 DllFile date: 00000000.00000000Translations: 0000.04e4CompanyName: Microsoft CorporationProductName: Microsoft Office 2003InternalName: MSOOriginalFilename: MSO.DLLProductVersion: 11.0.5606FileVersion: 11.0.5606FileDescription: Microsoft Office 2003 componentLegalCopyright: Copyright ? 1983-2003 Microsoft Corporation. All rights reserved.這是mso.dll上的一處棧溢出漏洞,由于在循環(huán)賦值到棧空間時(shí),未檢測(cè)復(fù)制的內(nèi)存大小,導(dǎo)致edi開(kāi)始的不可寫頁(yè)面,觸發(fā)指令的地址位于0x30e9eb88位于sub_30ED4406中,我們暫且標(biāo)記為CrashFun函數(shù)
此時(shí)我們重新運(yùn)行windbg,在0x30e9eb88下斷點(diǎn),運(yùn)行后讓程序斷下
斷下后,查看調(diào)用堆棧,以定位到是哪個(gè)函數(shù)奔潰的
由上可知,CrashFun函數(shù)是在0x30f4cc5d函數(shù)中被調(diào)用的。重新加載windbg,并在0x30f4cc5d下斷點(diǎn),讓程序斷在0x30f4cc5d處。
按F10單步跟蹤
這里開(kāi)辟了0x14個(gè)字節(jié)大小的棧空間,我們繼續(xù)跟蹤下去
當(dāng)運(yùn)行到0x30f4cc93時(shí),就調(diào)用到了CrashFun函數(shù)進(jìn)行內(nèi)存數(shù)據(jù)復(fù)制。接著按F8跟進(jìn)CrashFun函數(shù),然后一直單步
可以發(fā)現(xiàn)用rep movs指令復(fù)制內(nèi)存時(shí),ecx的值為c8ac,即復(fù)制數(shù)據(jù)的大小,由于的操作dword字節(jié),所以需要再除以4,回頭看下poc.rtf樣本數(shù)據(jù)
可以發(fā)現(xiàn)上面的0xc8ac其實(shí)是源于樣本數(shù)據(jù)的,它位于pFragements屬性值的第三個(gè)字段,而0xc8ac后面的數(shù)據(jù)正是實(shí)際內(nèi)存復(fù)制的數(shù)據(jù),復(fù)制的內(nèi)存源地址esi剛好指向這里
復(fù)制內(nèi)存的目標(biāo)地址edi剛好偏移棧底ebp共0x10字節(jié),加上ebp本身占用的4個(gè)字節(jié),剛好是0x14字節(jié),再覆蓋下去就是函數(shù)的返回地址了
由于poc.rtf中復(fù)制的內(nèi)存數(shù)據(jù)比較大,導(dǎo)致復(fù)制的過(guò)程中覆蓋到不可寫的內(nèi)存地址而觸發(fā)異常,因此沒(méi)有去執(zhí)行覆蓋到的返回地址或者SEH異常處理函數(shù)
**總結(jié):**總結(jié)上面的分析過(guò)程,由于Word中的rtf分析器在解析pFragments屬性值時(shí),沒(méi)有正確計(jì)算屬性值所占用的空間大小,只要復(fù)制的數(shù)據(jù)大小超過(guò)0x14即可覆蓋返回地址,若繼續(xù)覆蓋下去還可以覆蓋SEH結(jié)構(gòu),進(jìn)而控制程序的執(zhí)行流程,用于執(zhí)行任意代碼
漏洞利用
將漏洞成因分析清楚之后,利用該漏洞相對(duì)還是比較容易的。我們只需要將返回地址用jmp esp指令覆蓋,也就是復(fù)制數(shù)據(jù)大小的值之后再偏移0x14字節(jié),即可覆蓋返回地址;然后將ShellCode放置在后面,即可執(zhí)行任意代碼。由于在漏洞函數(shù)的結(jié)尾處,它在返回時(shí)會(huì)彈出0x14大小的棧空間,因此我們?cè)趈mp esp中填充一些垃圾指令以填充這一空缺
某實(shí)際樣本的分析情況如上圖,當(dāng)漏洞函數(shù)返回后,會(huì)先從棧頂彈出0x14字節(jié)空間,然后執(zhí)行0x7d1f5fb7處的jmp esp指令,進(jìn)而跳入shellcode起始地址,導(dǎo)致執(zhí)行任意代碼
Office 2003與Office 2007 Exploit通用性研究
上例樣本中0x7d1f5fb7指令地址并不是很穩(wěn)定,這種硬編碼地址可能受軟件及系統(tǒng)版本影響,較難實(shí)現(xiàn)通用性。為了實(shí)現(xiàn)Office 2003與Office 2007的通用,我們可以在返回地址上用0x0026762F覆蓋,它在Office 2003上相當(dāng)于call esp指令
0:000> u 0x0026762f l1<br>0026762f ffd4 call esp該地址適用于Office 2003 SP0和SP3等各個(gè)子版本,屬于穩(wěn)定的跳轉(zhuǎn)地址。對(duì)于Office 2007,0x0026762F已不再是call/jmp esp等類似指令,當(dāng)我們用0x0026762F這個(gè)地址覆蓋掉Office 2007上的返回地址,只要能夠讓它觸發(fā)異常,就可能執(zhí)行SEH結(jié)構(gòu)。這樣的話,我們只需加大內(nèi)存拷貝的大小,使其覆蓋到最近的SEH結(jié)構(gòu)就可以劫持EIP。也就是說(shuō),我們需要同時(shí)覆蓋返回地址和SEH結(jié)構(gòu)。
我們構(gòu)造的數(shù)據(jù)如下:
111111111111111111111111111111111111111111111111111111111111112f762600111111111111111111111111111111111111111111111111111111111111aaaaaaaaffffffff關(guān)于SEH結(jié)構(gòu)地址的定位,可以使用MSF上的兩個(gè)工具:pattern_create和pattern_offset定位偏移量
總結(jié)
以上是生活随笔為你收集整理的Microsoft RTF栈溢出漏洞(CVE-2010-3333)漏洞分析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: PC微信逆向:分析微信发送文件call
- 下一篇: CVE-2012-0158栈溢出漏洞分析