CVE-2017-0261及利用樣本分析
CVE-2017-0261及利用樣本分析
注意事項(xiàng):1.本篇文章由Gcow安全團(tuán)隊(duì)復(fù)眼小組的ERFZE師傅原創(chuàng),未經(jīng)許可禁止轉(zhuǎn)載2.本篇文章一共2313字,39張圖,預(yù)計(jì)用時(shí)20分鐘3.文中提及的方法僅供參考學(xué)習(xí),若用在實(shí)際情況而造成的損失,本團(tuán)隊(duì)以及本公眾號(hào)概不負(fù)責(zé)4.若本篇文章中存在說得有錯(cuò)誤或者模糊的環(huán)節(jié),希望各位看官可以在后臺(tái)留言或者評(píng)論指出,本小組不勝感激!
0x01 漏洞描述
?成因:打開Office文檔時(shí),F(xiàn)LTLDR.EXE將被用于渲染包含該漏洞的嵌入式EPS文件。該文件是由PostScript語(yǔ)言編寫而成,可以被攻擊者通過"save-restore"操作利用,其本質(zhì)為一UAF漏洞。當(dāng)用戶打開包含格式錯(cuò)誤的圖形圖像的文件時(shí),或者當(dāng)用戶將格式錯(cuò)誤的圖形圖像插入到 Office 文件時(shí),該漏洞可能會(huì)受到利用。?影響版本:Microsoft Office 2010 Service Pack 2、Microsoft Office 2013 Service Pack 1、Microsoft Office 2016?POC:kcufId's Github(https://github.com/kcufId/eps-CVE-2017-0261)
0x02 POC分析
筆者在網(wǎng)上尋找許久,并未找到包含EPSIMP32.FLT的Office安裝包。幸而kcufId師傅提供了一LoadEps.exe用以加載EPS文件,感謝kcufId師傅。
LoadEps.exe先是加載EPSIMP32.FLT:

之后調(diào)用ImportGr開始加載EPS文件:

于此處直接F7跟進(jìn),然后就可以成功斷在EPSIMP32.FLT內(nèi)所設(shè)斷點(diǎn)。
在進(jìn)入正題之前,先來(lái)鋪陳下Postscript對(duì)象結(jié)構(gòu)。
// PostScript Objectstruct PostScript object{dword type;dword attr;dword value1;dword value2; // if array, point to userdict where store the array object}ps_obj;
其中不同type對(duì)應(yīng)數(shù)值如下:
0x0 nulltype0x3 integertype0x5 realtype0x8 booleantype0x10 operatortype0x20 marktype0x40 savetype0x300 nametype0x500 stringtype0x900 filetype0x30000 arraytype0x0B0000 packedarraytype0x70000 packedarraytype0x110000 dicttype0x210000 gstatetype
以字符串為例,闡述其存儲(chǔ)結(jié)構(gòu)。對(duì)forall函數(shù)設(shè)置斷點(diǎn),便可以進(jìn)一步查看其如何處理字符串(如何定位forall函數(shù),可參閱https://paper.seebug.org/368/)。

1號(hào)圖片對(duì)應(yīng)ps_obj,其value2項(xiàng)指向索引列表中所對(duì)應(yīng)項(xiàng)(2號(hào)圖片);索引項(xiàng)指向一大小為0x30的結(jié)構(gòu),該結(jié)構(gòu)0x24位置保存一指向大小為0x28結(jié)構(gòu)(5號(hào)圖片)的指針的指針,0x2C位置保存字符串大小(3號(hào)圖片);5號(hào)圖片中結(jié)構(gòu)0x4位置存儲(chǔ)該結(jié)構(gòu)于索引列表中對(duì)應(yīng)項(xiàng)的地址(即4號(hào)圖片的0x01DB5E94),0x20位置指向字符串最終存儲(chǔ)位置(6號(hào)圖片),0x24位置為實(shí)際所占內(nèi)存大小——字符串大小+1。
大小為0x30結(jié)構(gòu):
+0x0 dword+0x4 dword+0x8 dword+0xc dword+0x10 dword+0x14 dword+0x18 dword+0x1c dword+0x20 dword+0x24 dword pp_struct //指向大小為0x28結(jié)構(gòu)的指針的指針+0x28 dword+0x2c dword size //字符串實(shí)際大小
大小為0x28結(jié)構(gòu)(換作數(shù)組,該結(jié)構(gòu)大小為0x2C,且0x28位置指向數(shù)組元素,每一元素都是ps_obj):
+0x0 dword+0x4 dword //存儲(chǔ)該結(jié)構(gòu)于索引列表中對(duì)應(yīng)項(xiàng)的地址+0x8 dword+0xc dword+0x10 dword+0x14 dword+0x18 dword+0x1c dword+0x20 dword ptr_object //指向字符串最終存儲(chǔ)位置+0x24 dword size //實(shí)際所占內(nèi)存大小,字符串實(shí)際大小+1
漏洞第一次觸發(fā):

首先是將VM狀態(tài)保存在l62變量?jī)?nèi),之后對(duì)于l63變量?jī)?nèi)每一字符調(diào)用l61——>>l59——>>l56處理過程;l62 restore恢復(fù)之前的狀態(tài),如此一來(lái),/l62 save def語(yǔ)句后面l63申請(qǐng)的內(nèi)存空間會(huì)被釋放,從而成為懸掛指針。

l95-l99變量決定了后續(xù)流程,其值均為0(即32位):

漏洞第二次觸發(fā),首先是申請(qǐng)0x27大小(實(shí)際會(huì)占用0x28)的內(nèi)存空間存儲(chǔ)l63:

之后l62 restore恢復(fù)之前的狀態(tài),導(dǎo)致l63申請(qǐng)的內(nèi)存空間被釋放,從而成為懸掛指針;接下來(lái)執(zhí)行l100,之前l63所占用內(nèi)存空間會(huì)用來(lái)存儲(chǔ)l102(即l136)字符串的0x28結(jié)構(gòu)(這就解釋了l63為何會(huì)申請(qǐng)0x27大小內(nèi)存空間):

分別獲取該結(jié)構(gòu)0x4、0x20、0x24位置的數(shù)值:

最后修改l136字符串內(nèi)容(圖中僅展示了部分修改之處):

這些修改內(nèi)容是精心構(gòu)造的,會(huì)于第三次觸發(fā)漏洞時(shí)用到。
漏洞第三次觸發(fā),申請(qǐng)包含0x37個(gè)元素的數(shù)組,之后在循環(huán)到第0x34個(gè)元素時(shí)執(zhí)行l62 restore:

執(zhí)行完restore之后,數(shù)組的0x30結(jié)構(gòu)被l193字符串內(nèi)容覆蓋:

如此一來(lái),最后一次(0x36)forall過程所執(zhí)行的對(duì)象便成為上圖中0x30結(jié)構(gòu),而獲取其第0x36個(gè)元素便會(huì)來(lái)到第二次漏洞觸發(fā)時(shí)所精心構(gòu)造的字符串處:

而其獲取到的數(shù)組元素是一大小為4的數(shù)組,該數(shù)組首元素是一起始地址為0,大小為0x7FFFFFFF的字符串:

該數(shù)組會(huì)存儲(chǔ)在l159變量中,其首元素——起始地址為0,大小為0x7FFFFFFF的字符串會(huì)存儲(chǔ)在l201變量中,之后便可通過l201變量獲取任意地址的值。
獲取kernel32.dll基址:


如此一來(lái),l314變量?jī)?nèi)存儲(chǔ)的便是EPSIMP32.FLT基址。

注:search命令語(yǔ)法如下:

查找指定gadget:


構(gòu)造file類型結(jié)構(gòu):
l199 l201 get_dword/l487 exch defl487 l201 get_dword/l488 exch defl488 36 my_add l201 get_dword/l489 exch defl489 l201 get_dword/l490 exch defl490 32 my_add l201 get_dword/l491 exch defl199 l491 l201 put_data_to_arrayl199 12 my_sub 2304 l201 put_data_to_array

向l492地址(l491+0x32)處寫入構(gòu)造數(shù)據(jù):
l492 0 l201 put_data_to_array %% 0x00 0l492 4 my_add l375 l201 put_data_to_array %% 0x04 Address of <5E C3>l492 8 my_add l373 l201 put_data_to_array %% 0x08 Address of <94 00 00 00 00 5E C3>l492 12 my_add l377 l201 put_data_to_array %% 0x0C Address of <C2 0C 00>l492 16 my_add l370 l201 put_data_to_array %% 0x10 Address of VirtualProtect()l492 20 my_add 0 l201 put_data_to_array %% 0x14 0l492 24 my_add 0 l201 put_data_to_array %% 0x18 0l492 28 my_add 0 l201 put_data_to_array %% 0x1C 0l492 32 my_add l368 l201 put_data_to_array %% 0x20 Address of Shellcodel492 36 my_add l368 l201 put_data_to_array %% 0x24 Address of Shellcode——lpAddressl492 40 my_add l349 l201 put_data_to_array %% 0x28 Size of Shellcode——dwSizel492 44 my_add 64 l201 put_data_to_array %% 0x2C PAGE_EXECUTE_READWRITE——flNewProtectl492 48 my_add l493 l201 put_data_to_array %% 0x30 lpflOldProtect
最后,執(zhí)行closefile指令時(shí)跳轉(zhuǎn)至Shellcode:

0x03 樣本分析
EPS利用腳本位于\word\media目錄下,解壓之后即可看到。該漏洞利用樣本除Shellcode部分,其余基本一致,故以Patchword組織某樣本為例進(jìn)行分析。
文件名:Cyber_Secure_Pakistan.docx
MD5:DD89BBB916A2C909630EC78CBB0E13E5
跳轉(zhuǎn)到Shellcode,恢復(fù)堆棧:

申請(qǐng)內(nèi)存:

獲取函數(shù)調(diào)用地址:

調(diào)試過程中,可能是因?yàn)榄h(huán)境問題導(dǎo)致CreateToolhelp32Snapshot函數(shù)調(diào)用地址未成功獲取:

手動(dòng)填入地址并打開Word以繼續(xù)分析。枚舉進(jìn)程,查找WINWORD.exe:

于C:\ProgramData\Microsoft\DeviceSync目錄下創(chuàng)建一名為MSBuild.exe的程序:

寫入文件內(nèi)容,其內(nèi)容存儲(chǔ)于EPS腳本的payload_32變量?jī)?nèi):


創(chuàng)建vmtools.dll文件:

寫入文件內(nèi)容,其內(nèi)容存儲(chǔ)于EPS腳本的payload_32_f2變量?jī)?nèi):


創(chuàng)建VMwareCplLauncher.exe文件:

其內(nèi)容存儲(chǔ)于EPS腳本的payload_32_f1變量?jī)?nèi):

該文件是具有Vmware簽名的白文件:

注入如下內(nèi)容到explorer.exe中:

其功能為創(chuàng)建VMwareCplLauncher.exe進(jìn)程:

之后流程于360此篇報(bào)告(https://www.freebuf.com/vuls/157694.html)有提及,本文暫不涉及其分析部分:

有興趣的讀者可以進(jìn)一步閱讀該報(bào)告。
注:該漏洞的利用樣本基本相似,不同之處在于最后的MSBuild.exe載荷,其存儲(chǔ)于EPS腳本的payload_32變量?jī)?nèi),可直接dump出來(lái),填補(bǔ)完DOS文件頭之后便可以拖進(jìn)IDA分析。
0x04 參閱鏈接
?EPS Processing Zero-Days Exploited by Multiple Threat Actors(https://www.fireeye.com/blog/threat-research/2017/05/eps-processing-zero-days.html)?CVE-2015-2545 Word 利用樣本分析(https://paper.seebug.org/368/)?PostScript LANGUAGE REFERENCE(https://web.archive.org/web/20170218093716/https://www.adobe.com/products/postscript/pdfs/PLRM.pdf)?摩訶草組織最新漏洞攻擊樣本分析及預(yù)警(https://www.freebuf.com/vuls/157694.html)
