<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          CVE-2017-0261及利用樣本分析

          共 6053字,需瀏覽 13分鐘

           ·

          2020-08-16 11:24

          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

          圖片1 加載EPSIMP32.FLT

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

          圖片2 ImportGr

          于此處直接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       arraytype          0x0B0000     packedarraytype0x70000     packedarraytype0x110000      dicttype0x210000      gstatetype

          以字符串為例,闡述其存儲(chǔ)結(jié)構(gòu)。對(duì)forall函數(shù)設(shè)置斷點(diǎn),便可以進(jìn)一步查看其如何處理字符串(如何定位forall函數(shù),可參閱https://paper.seebug.org/368/)。

          圖片3 字符串存儲(chǔ)結(jié)構(gòu)

          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ā):

          圖片4 第一次

          首先是將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ì)被釋放,從而成為懸掛指針。

          圖片5 l95-l99

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

          圖片6 exch_proc

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

          圖片7 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)存空間):

          圖片8 l102

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

          圖片9 獲取值

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

          圖片10 構(gòu)造字符串

          這些修改內(nèi)容是精心構(gòu)造的,會(huì)于第三次觸發(fā)漏洞時(shí)用到。

          漏洞第三次觸發(fā),申請(qǐng)包含0x37個(gè)元素的數(shù)組,之后在循環(huán)到第0x34個(gè)元素時(shí)執(zhí)行l62 restore

          圖片11 第三次觸發(fā)流程

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

          圖片12 覆蓋內(nèi)容

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

          圖片13 獲取數(shù)組元素

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

          圖片14 數(shù)組元素內(nèi)容

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

          獲取kernel32.dll基址:

          圖片15 獲取基址-1

          圖片16 獲取基址-2

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

          圖片17 獲取基址-3

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

          圖片18 search

          查找指定gadget:

          圖片19 gadget-1

          圖片20 gadget-2

          構(gòu)造file類型結(jié)構(gòu):

              l199 l201 get_dword                              /l487 exch def    l487 l201 get_dword    /l488 exch def    l488 36 my_add l201 get_dword    /l489 exch def    l489 l201 get_dword    /l490 exch def    l490 32 my_add l201 get_dword    /l491 exch def    l199 l491 l201 put_data_to_array    l199 12 my_sub 2304 l201 put_data_to_array

          圖片21 構(gòu)造file type

          l492地址(l491+0x32)處寫入構(gòu)造數(shù)據(jù):

                  l492 0 l201 put_data_to_array                 %% 0x00 0        l492 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 0        l492 24 my_add 0 l201 put_data_to_array       %% 0x18 0        l492 28 my_add 0 l201 put_data_to_array       %% 0x1C 0        l492 32 my_add l368 l201 put_data_to_array    %% 0x20 Address of Shellcode        l492 36 my_add l368 l201 put_data_to_array    %% 0x24 Address of Shellcode——lpAddress        l492 40 my_add l349 l201 put_data_to_array    %% 0x28 Size of Shellcode——dwSize        l492 44 my_add 64 l201 put_data_to_array      %% 0x2C PAGE_EXECUTE_READWRITE——flNewProtect        l492 48 my_add l493 l201 put_data_to_array    %% 0x30 lpflOldProtect

          最后,執(zhí)行closefile指令時(shí)跳轉(zhuǎn)至Shellcode:

          圖片22 closefile

          0x03 樣本分析

          EPS利用腳本位于\word\media目錄下,解壓之后即可看到。該漏洞利用樣本除Shellcode部分,其余基本一致,故以Patchword組織某樣本為例進(jìn)行分析。

          文件名:Cyber_Secure_Pakistan.docx

          MD5:DD89BBB916A2C909630EC78CBB0E13E5

          跳轉(zhuǎn)到Shellcode,恢復(fù)堆棧:

          圖片23 恢復(fù)堆棧

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

          圖片24 VirtualAlloc

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

          圖片25 函數(shù)調(diào)用地址

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

          圖片26 CreateToolhelp32Snapshot

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

          圖片27 枚舉進(jìn)程

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

          圖片28 創(chuàng)建MSBuild.exe

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

          圖片29 WriteFile

          圖片30 payload_32

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

          圖片31 創(chuàng)建vmtools.dll

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

          圖片32 WriteFile

          圖片33 payload_32_f2

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

          圖片34 創(chuàng)建VMwareCplLauncher.exe

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

          圖片35 payload_32_f1

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

          圖片36 Vmware簽名

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

          圖片37 注入explorer.exe

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

          圖片38 創(chuàng)建VMwareCplLauncher.exe進(jìn)程

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

          圖片39 流程

          有興趣的讀者可以進(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)


          瀏覽 41
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  天天操屄日日操屄 | 久草男人天堂 | 蜜桃网站在线观看 | 国产美女一级真毛片酒店 | 国产精品久久久久久久久免费挑花 |