天天看點

CVE-2017-11882 Office漏洞

簡介

CVE-2017-11882屬于緩沖區溢出類型漏洞,造成漏洞的原因是,EQNEDT32.EXE(微軟office自帶公式編輯器)程序在讀入包含MathType的ole資料時,在拷貝公式字型名稱(Font Name資料)時沒有對名稱長度進行校驗,導緻緩沖區溢出。通過覆寫函數的傳回位址,可執行任意代碼。

深究其中的具體原因還要對ole檔案的資料格式以及EQNEDT32.EXE的檔案格式進行了解:

ole檔案

首先我們需要了解的是什麼是OLE,OLE代表的是連結與嵌入(Object Linking and Embedding),用我們日常得話來講,就是使用者在使用Office文檔的過程中的一些資料的插入,可以是圖檔音樂之類的。而且需要注意的是OLE對象是基于COM元件的,也就是說OLE是一個COM元件的子集。這也就導緻了在帶來極大便利的同時,也給黑客帶來了可乘之機,事實上Office的很多0day漏洞也都是由于OLE對象引起或者是基于對OLE對象的利用導緻的。抛開題外話不談,我們專注于這個漏洞。

事實上,不同的檔案格式會使用不同版本的OLE檔案格式:

OLE格式的結構一共有兩種:OLE1.0和OLE2.0 詳細情況可以參考微軟的官方文檔:

OLE檔案格式1.0

同時我們需要知道,當使用者在office文檔中插入公式編輯器的時候,在使用者打開檔案的時候,會調用EQNEDT32.EXE來執行這個功能,這個功能是微軟自帶的,在使用者插入公式編輯器資料之後會在OLE檔案中新增一個Equation Native流資料,是以,下一步我們的工作就是對Equation Native流的資料格式進行解析

Equation Native流的資料格式

Equation Native Stream Data 的結構為

Equation Native Stream Data= EQNOLEFILEHDR+ MTEF Data
           

其中

MTEF Data=MTEF header + MTEF Byte Stream
           

EQNOLEFILEHDR的結構如下:

struct EQNOLEFILEHDR
{
	WORD cbhdr;    //EQNOLEFILEHDR的長度,恒為0x1C
	DORD version;  //恒為0x00020000
	WORD cf;      //剪切闆格式
	DWORD cbobject;//MTEF資料長度,不包括EQNOLEFILEHDR
	DWORD reserved1;//未公開
	DWORD reserved2;//未公開
	DWORD reserved3;//未公開
	DWORD reserved4;//未公開
};
           

MTEF Byte Stream如下:

struct MTEF header
{
	BYTE MTEF version;        //MTEF的主版本号
	BYTE generating plntform;  //該資料生成的平台
	BYTE generating product;   //該資料生成的産品 0x00表示由MathType生成,0x01表示由公式編輯器生成
	BYTE product version;      //生成産品的版本号
	BYTE product subversion;    //産品的子版本号
}
           

MTEF Byte Stream的結構由SizeRecord和FontRecord兩個結構構成,具體的結構如下

Struct SizeRecord
{
	BYTE lsize;
	BYTE dsize;
}
struct FontRecord
{
	BYTE bTag;
	BYTE bTypeFace;
	BYTE bStyle;
	BYTE bFontName;
}
           

FontRecord的主要成員及其意義:

CVE-2017-11882 Office漏洞

接下來對漏洞樣本進行分析:

樣本分析

首先是簡單的動态分析,開啟日志監控軟體和程序監控軟體,檢視程序運作過程中的異常程序情況以及異常的檔案操作:

該樣本在運作之後彈出計算機的界面,是以将注意力主要集中放在新程序的開啟以及程序樹的觀察:

CVE-2017-11882 Office漏洞

根據上圖可以知道,新的計算機程序是由EQNEDT32.EXE通過CMD指令啟動的,具體的指令行如下:

CVE-2017-11882 Office漏洞

通過檢視指令行,再結合該漏洞的原理可以大概知道,産生棧溢出之後,程式所執行的ShellCode可能就是這行指令,這個還要後邊去看。

通過上邊的基本觀察,可以知道,新程序的開啟是通過EQNEDT32.EXE來進行的,是以棧溢出漏洞的産生應該也是在EQNEDT32.EXE程序中産生的,是以我們的下一步的任務就是去調試EQNEDT32.EXE

通過檢視程序啟動的日志資訊,可以發現EQNEDT32.EXE啟動CMD調用的API是Winexec

CVE-2017-11882 Office漏洞

接下來目标就很明确了,我們直接用OD附加EQNEDT32.EXE,然後到WinExec去下斷點(在目前系統已經存在EQNEDT32.EXE程序的時候,系統不會再建立新的EQNEDT32.EXE程序,是以可以通過OD直接附加,之後下斷點再運作一次,可以直接斷下來)

但是這塊有一個問題,通過 bp WinExec或者設定條件斷點斷下來之後,通過棧回溯檢視最近的傳回位址:

CVE-2017-11882 Office漏洞

同時通過棧回溯,也可以發現這個CALL的過程來自0x004115A7,這樣的話通過IDA直接可以過去進行反編譯分析:

函數0x004115A7的函數内容如下:

CVE-2017-11882 Office漏洞

根據棧溢出的原理,我們可以直接将造成漏洞的點定位到函數41160F上邊(因為字元串比較函數和計算字元串長度的函數不可能造成棧溢出),檢視sub_41160F:

CVE-2017-11882 Office漏洞

那麼造成漏洞的點大概已經定位好了,接下來我們的目标就很明确了,通過動态調試來捕捉這個點:

在OD中對函數sub_41160F下斷點:

CVE-2017-11882 Office漏洞

執行到字元串複制操作的語句:(這裡需要注意,在調試的過程中,比較容易将原來的EQNEDT32.EXE和呗漏洞修改過的EQNEDT32.EXE混淆,事實上我自己在調試的過程中也發生了這種情況,建議在進行動态調試的時候,先将環境恢複一下,然後直接用OD附加EQNEDT32.EXE,按F9先讓程式跑起來,然後再到目标函數的位置下斷點,之後再運作樣本檔案,這個時候就會在目标函數的位置斷下來)如下圖所示:

CVE-2017-11882 Office漏洞

現在的目的就是分析它實作棧溢出的過程:

可以看到字元串的複制過程,複制勒0x30大小的資料:

CVE-2017-11882 Office漏洞
CVE-2017-11882 Office漏洞

對傳回位址進行覆寫:

CVE-2017-11882 Office漏洞

可以看到,修改之後的傳回位址被覆寫成為0x00430C12,嘗試跳過去分析:

CVE-2017-11882 Office漏洞

跳過去之後不難看到,這個位址的指令就是WinExec,也就是說接下來當程式執行return指令的時候,程式就會跳轉到Winexec指令的地方繼續執行,接下來,我們直接讓程式執行到這個函數retn的地方,檢視一下棧空間的傳回位址,以及WinExec的參數:

CVE-2017-11882 Office漏洞
CVE-2017-11882 Office漏洞

以上其實就是整個漏洞中最重要的過程的分析,其實整個過程很簡單,就是制造exploit,接下來寫入惡意代碼,執行惡意代碼,上邊是寫入和執行過程的分析,接下來簡要的介紹一下,Exploit的分析。

Exploit的分析

1:首先就是溢出點的選擇,這個也就是這個漏洞的基本,沒有這個點這個漏洞也就不會産生,是以這個點已經找到了,就是在拷貝公式字型名稱(Font Name資料)時沒有對名稱長度進行校驗,導緻緩沖區溢出。

2:填入資料,在确定了“爆破點”之後,要往該“爆破點”填入資料進行“爆破”,填入資料的時候需要注意,要覆寫的傳回位址要填充的資料是什麼,其他地方的資料可以任意填寫。這裡我們的傳回位址是WinExec指令的位址,是固定的,這個還要取決于該程式是否開啟了ASLR等安全機制,當然這個程式顯然是沒有開啟:

CVE-2017-11882 Office漏洞

3:相對來說這一步應該是一個精細活兒,我們需要計算要填入的資料的長度和Buffer的大小,保證能正常的執行我們的指令,而且還不會将我們的傳回位址覆寫掉。

CVE-2017-11882 Office漏洞

通過前邊的分析,我們知道在進行覆寫的時候,一共覆寫了0x30個大小的資料,除了4位元組的WinExec的位址,還剩0x2C的大小,也就是說構造的指令的長度不能超過0x2C個位元組,

接下來的工作就是:

手動構造POC

手動構造POC的思路很簡單,建立一個Word文檔,在文檔中插入公式編輯器,然後輸入相應的資料,通過OLE流資料檢視工具,查找對應的Equation Native Stream Data,之後将我們都遭好的ShellCode替換進去,儲存就好.

1:建立一個.docx的文檔,之後打開,插入一個公式編輯器的對象,在其中插入一些資料,儲存關閉文檔

CVE-2017-11882 Office漏洞

2:用7z以壓縮包的方式(因為.docx檔案本身就是一個壓縮封包件)打開這個文檔,把壓縮包中的.bin檔案複制出來,準備修改:

CVE-2017-11882 Office漏洞

3:修改之前可以使用微軟的官方軟體offvis.exe來定位一下我們要修改的資料的位置(Equation Native Stream Data):

CVE-2017-11882 Office漏洞

4:接下來,用010打開.bin檔案,開始替換資料(這裡還采用原樣本的實作方式,即運作電腦程式,當然也可以構造其他指令,可以通路連結或者可以通過釋放PE檔案的方式來執行而已指令)

CVE-2017-11882 Office漏洞
CVE-2017-11882 Office漏洞

5:替換之後,将檔案儲存,再複制回原來的.docx檔案中去,之後手動構造POC就結束了,接下來運作一下看一下結果:

CVE-2017-11882 Office漏洞

6:其實這裡手動構造的POC還是有點缺陷,因為,不能自動更新,也就是說,再打開檔案之後不會自動彈出計算機程式,需要點選一下,這個問題可以通過一下方式來解決:

建立rtf檔案之後,将上述POC構造過程重新做一遍之後,将rtf檔案的下邊的字段增加一個objupdate字段

CVE-2017-11882 Office漏洞

之後儲存打開就完成了.

同時采用這種方法做的話還涉及到怎麼從rtf檔案中将ole對象檔案提取出來,可以使用oletools工具将對象檔案提取出來.之後就和上邊的步驟一樣去構造Exploit就好.至于oletools的用法,我的工具使用過程中不太配合(提取了半天不太成功),這裡就不介紹了.

最後,其實這個Exploit的利用不僅僅可以使用Winexec來完成惡意指令的執行,還可以使用文章中說過的利用rtf檔案的特性(釋放檔案)來進行惡意檔案的執行,或者是通路惡意連結的形式來進行而已活動.

後記:

當我喜歡你的時候

我們直接就産生了階層,我仰望着你

是我自己給了你俯視我的權利

當這層窗戶紙捅破,而答案又是否定的時候

我們就不可能成為朋友了,如果還和你做朋友

就相當于我自己又把刀子遞到了你手上,給了你傷害我的權利

我給别人機會,也是給我自己機會

如果我還能喜歡上别人,我才有機會和你再次站在同一個台階上

那個時候 再做朋友吧

繼續閱讀