CVE-2017-0261及利用樣本分析
CVE-2017-0261及利用樣本分析
注意事項: 1.本篇文章由Gcow安全團隊複眼小組的ERFZE師傅原創,未經許可禁止轉載 2.本篇文章一共2313字,39張圖,預計用時20分鐘 3.文中提及的方法僅供參考學習,若用在實際情況而造成的損失,本團隊以及本公眾號概不負責 4.若本篇文章中存在說得有錯誤或者模糊的環節,希望各位看官可以在後臺留言或者評論指出,本小組不勝感激!
0x01 漏洞描述
- 成因:開啟Office文件時,FLTLDR.EXE將被用於渲染包含該漏洞的嵌入式EPS檔案。該檔案是由PostScript語言編寫而成,可以被攻擊者透過"save-restore"操作利用,其本質為一UAF漏洞。 當使用者開啟包含格式錯誤的圖形影像的檔案時,或者當使用者將格式錯誤的圖形影像插入到 Office 檔案時,該漏洞可能會受到利用。
影響版本: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分析
筆者在網上尋找許久,並未找到包含EPSIMP32.FLT的Office安裝包。幸而kcufId師傅提供了一LoadEps.exe用以載入EPS檔案,感謝kcufId師傅。
LoadEps.exe
先是載入EPSIMP32.FLT
:
之後呼叫ImportGr
開始載入EPS檔案:
於此處直接F7跟進,然後就可以成功斷在EPSIMP32.FLT內所設斷點。
在進入正題之前,先來鋪陳下Postscript物件結構。
// PostScript Object struct PostScript object { dword type; dword attr; dword value1; dword value2; // if array, point to userdict where store the array object }ps_obj;
其中不同type
對應數值如下:
0x0 nulltype 0x3 integertype 0x5 realtype 0x8 booleantype 0x10 operatortype 0x20 marktype 0x40 savetype 0x300 nametype 0x500 stringtype 0x900 filetype 0x30000 arraytype 0x0B0000 packedarraytype 0x70000 packedarraytype 0x110000 dicttype 0x210000 gstatetype
以字串為例,闡述其儲存結構。對forall
函式設定斷點,便可以進一步檢視其如何處理字串(如何定位forall
函式,可參閱https://paper.seebug.org/368/)。
1號圖片對應ps_obj
,其value2
項指向索引列表中所對應項(2號圖片);索引項指向一大小為0x30的結構,該結構0x24位置儲存一指向大小為0x28結構(5號圖片)的指標的指標,0x2C位置儲存字串大小(3號圖片);5號圖片中結構0x4位置儲存該結構於索引列表中對應項的地址(即4號圖片的0x01DB5E94),0x20位置指向字串最終儲存位置(6號圖片),0x24位置為實際所佔記憶體大小——字串大小+1。
大小為0x30結構:
+0x0 dword +0x4 dword +0x8 dword +0xc dword +0x10 dword +0x14 dword +0x18 dword +0x1c dword +0x20 dword +0x24 dword pp_struct //指向大小為0x28結構的指標的指標 +0x28 dword +0x2c dword size //字串實際大小
大小為0x28結構(換作陣列,該結構大小為0x2C,且0x28位置指向陣列元素,每一元素都是ps_obj
):
+0x0 dword +0x4 dword //儲存該結構於索引列表中對應項的地址 +0x8 dword +0xc dword +0x10 dword +0x14 dword +0x18 dword +0x1c dword +0x20 dword ptr_object //指向字串最終儲存位置 +0x24 dword size //實際所佔記憶體大小,字串實際大小+1
漏洞第一次觸發:
首先是將VM狀態儲存在l62
變數內,之後對於l63
變數內每一字元呼叫l61
——>>l59
——>>l56
處理過程;l62 restore
恢復之前的狀態,如此一來,/l62 save def
語句後面l63
申請的記憶體空間會被釋放,從而成為懸掛指標。
l95-l99
變數決定了後續流程,其值均為0(即32位):
漏洞第二次觸發,首先是申請0x27大小(實際會佔用0x28)的記憶體空間儲存l63
:
之後l62 restore
恢復之前的狀態,導致l63
申請的記憶體空間被釋放,從而成為懸掛指標;接下來執行l100
,之前l63
所佔用記憶體空間會用來儲存l102
(即l136
)字串的0x28結構(這就解釋了l63
為何會申請0x27大小記憶體空間):
分別獲取該結構0x4、0x20、0x24位置的數值:
最後修改l136
字串內容(圖中僅展示了部分修改之處):
這些修改內容是精心構造的,會於第三次觸發漏洞時用到。
漏洞第三次觸發,申請包含0x37個元素的陣列,之後在迴圈到第0x34個元素時執行l62 restore
:
執行完restore
之後,陣列的0x30結構被l193
字串內容覆蓋:
如此一來,最後一次(0x36)forall
過程所執行的物件便成為上圖中0x30結構,而獲取其第0x36個元素便會來到第二次漏洞觸發時所精心構造的字串處:
而其獲取到的陣列元素是一大小為4的陣列,該陣列首元素是一起始地址為0,大小為0x7FFFFFFF的字串:
該陣列會儲存在l159
變數中,其首元素——起始地址為0,大小為0x7FFFFFFF的字串會儲存在l201
變數中,之後便可透過l201
變數獲取任意地址的值。
獲取kernel32.dll基址:
如此一來,l314
變數記憶體儲的便是EPSIMP32.FLT基址。
注:search
命令語法如下:
查詢指定gadget:
構造file
型別結構:
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
向l492
地址(l491
+0x32)處寫入構造資料:
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
最後,執行closefile
指令時跳轉至Shellcode:
0x03 樣本分析
EPS利用指令碼位於\word\media
目錄下,解壓之後即可看到。該漏洞利用樣本除Shellcode部分,其餘基本一致,故以Patchword組織某樣本為例進行分析。
檔名:Cyber_Secure_Pakistan.docx
MD5:DD89BBB916A2C909630EC78CBB0E13E5
跳轉到Shellcode,恢復堆疊:
申請記憶體:
獲取函式呼叫地址:
除錯過程中,可能是因為環境問題導致CreateToolhelp32Snapshot
函式呼叫地址未成功獲取:
手動填入地址並開啟Word以繼續分析。列舉程式,查詢WINWORD.exe:
於C:\ProgramData\Microsoft\DeviceSync
目錄下建立一名為MSBuild.exe的程式:
寫入檔案內容,其內容儲存於EPS指令碼的payload_32
變數內:
建立vmtools.dll檔案:
寫入檔案內容,其內容儲存於EPS指令碼的payload_32_f2
變數內:
建立VMwareCplLauncher.exe檔案:
其內容儲存於EPS指令碼的payload_32_f1
變數內:
該檔案是具有Vmware簽名的白檔案:
注入如下內容到explorer.exe中:
其功能為建立VMwareCplLauncher.exe程式:
之後流程於360此篇報告(https://www.freebuf.com/vuls/157694.html)有提及,本文暫不涉及其分析部分:
有興趣的讀者可以進一步閱讀該報告。
注:該漏洞的利用樣本基本相似,不同之處在於最後的MSBuild.exe載荷,其儲存於EPS指令碼的payload_32
變數內,可直接dump出來,填補完DOS檔案頭之後便可以拖進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)
- 摩訶草組織最新漏洞攻擊樣本分析及預警(https://www.freebuf.com/vuls/157694.html)
相關文章
- CVE-2017-8291及利用樣本分析2020-05-01
- CVE-2017-11882及利用樣本分析2020-03-26
- MS12-027及利用樣本分析2021-04-10
- CVE-2015-1641及利用樣本分析2020-11-29
- 惡意程式碼分析之行為分析及樣本收集2021-01-29
- 利用Office宏及Powershell的針對性攻擊樣本分析2020-08-19
- 利用Office巨集及Powershell的針對性攻擊樣本分析2018-03-08
- 某EXCEL漏洞樣本shellcode分析2020-08-19Excel
- AI+遊戲:高效利用樣本的強化學習2018-04-23AI遊戲強化學習
- (CVE-2019-5786) 漏洞原理分析及利用2020-07-01
- CVE-2013-4547 Nginx解析漏洞深入利用及分析2020-08-19Nginx
- Python數模筆記-Sklearn(2)樣本聚類分析2021-05-10Python筆記聚類
- “愛思助手”被爆為iOS木馬樣本技術分析2020-08-19iOS
- 招標書樣本2024-10-10
- 「分段對映」幫助利用少量樣本習得新類別細粒度分類器2018-05-22
- CVE-2021-26411在野樣本中利用RPC繞過CFG緩解技術的研究2021-04-29RPC
- BlueKeep 漏洞利用分析2019-09-20
- CVE-2014-6352漏洞及定向攻擊樣本分析2020-08-19
- R語言作業:樣本容量與好樣本概率的關係2020-11-02R語言
- 利用DP-SSL對少量的標記樣本進行有效的半監督學習2022-02-22
- User-Agent手工注入攻擊及防禦(探測與利用分析)2020-12-19
- 《利用Python進行資料分析》 11.6 重新取樣和頻率轉換(二)2018-12-19Python
- 小樣本學習,路在何方?2020-01-10
- 對抗樣本綜述(一)2021-07-10
- CVE-2023-49442 利用分析2024-03-11
- 利用perf進行效能分析2024-06-09
- Commons-Beanutils利用鏈分析2021-08-10Bean
- 怎樣利用GoogleAdsense自動賺錢?2018-07-11Go
- 0day漏洞組合拳:詳細分析一款惡意PDF樣本2018-05-21
- 分析了16993個專案後,我們得到了定性研究的最佳樣本量2023-09-15
- 【開源樣本庫分享】Five-Billion-Pixels-ENVIFormat 五十億畫素高精度樣本庫分享2024-06-14ORM
- 不平衡樣本的處理2018-09-27
- AnglerEK的Flash樣本解密方法初探2020-08-19解密
- 近似熵-樣本熵-多尺度熵2020-08-23熵
- 某被外掛用爛了的讀寫驅動樣本全逆向+功能分析2018-06-14
- R資料分析:樣本量計算的底層邏輯與實操,pwr包2022-03-03
- 棧溢位基礎及利用2021-03-09
- 淺析Block的內部結構 , 及分析其是如何利用 NSInvocation 進行呼叫2018-09-18BloC