3.5.11 pNext指向填充構造數據空間
觀察下一次循環的數據布局情況如`圖1`所示,`圖1`斷點<`EPSIMP32!RegisterPercentCallback+0x4664`>,經過第一個call的時候,則key與value都被更改成了我們構造好的數值如`圖2`所示,此時的`pNext`為0也就是下一次不用循環了,其中key和value都被賦值了我們之前構造好的,其中的`0462e0b0`是之前釋放空間前的數據,不是我們構造的所帶的數據,這個數據可以說是個泄露的地址;其中我們從eps文件格式上面或者動態調試上面看也可以大概猜測 `00000500`為字符串類型
圖1
圖2
3.5.12 構造stirng類型長度為0x7ffffff及ROP PostScript代碼
為了快速定位位置,我們可以在相應`memcopy`的位置下斷點,這樣方便我們定位數據的位置,構造出大小為0x7fffffff的可讀寫字符串空間。在該空間內作任意讀寫操作,做后續的處理(ROP/SHELLCODE),其中shellcdoe pe copy大小為`0x00000430`,和`0x0001a010`大小,通過`bytesavailable`跑`ROP`,其中`ROP`是直接通過PostScript語法來搜索得到的如`圖2`所示。
圖1(string類型字符串00000000-7ffffffff大小)
圖2(搜索ROP鏈)
3.6 調試分析-ROP/SHELLCODE[第三個方向]
3.6.1 如何繞過EMET
Rop很簡單,直接單步跟蹤即可,指令都是EPSIMP32.FLT模塊中的指令,單步跟蹤觀察即可,如`圖1`所示,關于`0xd7`十進制`215`為NtProctectVirtulMemory函數的調用號碼,可以通過`PChunter`這個軟件打開SSDT表即可,如`圖2,3`所示,這樣做是為什么呢?我們繼續往下面跟進觀察如`圖4`所示,跑到了`ZwCreateEvent+5`的位置了,這個位置一看就是要3環進0環的的地方,這就是繞過了EMET檢測,由于EMET在系統的關鍵API進行了檢測也就是`mov eax,調用號`這里進行了`jmp xxxx`檢測,所以樣本的做法為了繞過這個檢測,就需要找沒有被EMET hook的的函數,正好,ZwCreteEvent沒有被hook那么就直接調用到這里來改我們的內存保護。
圖1
圖2
圖3
圖4
3.6.2 shellcode
Shellcode的功能主要為釋放一個plugin.dll并加載執行。
4. POC/利用
關于POC,由于是forall中出現的問題,所以樣本出現問題的位置:dict{}forall,并且其中只有copy才會觸發漏洞所以POC的PostScript的語法是,這里列舉的是偽代碼。
dict {dict1 dict2 copy....} forall
----------------------------------------------------------------------------------
%%創建dict2并填充它
%%幾個鍵值對
/ dict2 5 dict def
dict2 begin
/ k1 1000 array def
/ k2 1000 array def
...
dict2 end
%%創建dict1并填充它
%%一個鍵值對在k1
/ dict1 3 dict def
dict1 begin
/ k1 1000 array def
dict1 end
%%在dict2上開始forall枚舉
dict2 {
dict1 dict2 copy
.......
0 <00000000ff0300000005000000000000000000002000e01303000000000000000000000044444444> putinterval
} forall
4.2 簡易彈框
關于利用,縱觀已知網上的cve-2015-2545的樣本,用的利用方式都是在初期的樣本模塊上面進行加以改造,所以只需要對其shellcode的方面進行更改即可,`圖1`則為更改樣本彈出簡單的對畫框
<6A006A006A006A00B811EA2177FFD06A006AFFB8B51FFF75FFD090> putinterval
|
圖1
5. Word插入EPS
Word在插入EPS格式文件之后,第一運行完其目錄`wordmedia`中的`image1.eps`會變成`.wmf`格式文件,如果想每次都運行完`.eps`之后不會變成`.wmf`格式的文件,需要通過修改壓縮包里面的一些內容即可,如`圖1,2, 3`所示。
第一個文件:rels/document.xml 追加內容:
<Relationship Id="rId8" Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="media/image1.eps"/<Relationship Id="rId9"
Type="http://schemas.openxmlformats.org/officeDocument/2006/relationships/image"
Target="ooxWord://word/media/image1.eps" TargetMode="External"/></Relationships>
圖1
第二個文件:world/document.xml 追加內容:
<w:p><w:r><w:pict><v:shape style="width:1;height:1"><v:imagedata r:id="rId8" r:href="rId9"/></v:shape></w:pict></w:r></w:p>
圖2
第三個文件:[Content_Types].xml:
<Default ContentType="application/postscript" Extension="eps"/>
6.漏洞防護
分析都調試完成,明白其漏洞發生的位置,那么我們需要去防御cve-2015-2545漏洞,防御可以分為兩個方面來完成:
1.靜態防御(yara規則)
2.動態防御
6.1 靜態防御
6.1.1 github yara
1.GitHub上面有關于cve-2015-2545的yara規則檢測,但是自己觀看了一下,可以看出規則寫的不像是針對eps/doc寫的,而是對dll,exe進行的yara規則編寫,自己進行測試,如下圖所示。
圖1(未檢測出來樣本)
圖2(檢測出來樣本生成的文件)
6.1.2 自己寫的yara
自己寫關于eps的文件的檢測,需要對其里面的eps文件規則進行檢測,自己簡易寫的yara規則[針對的是EPS文件]如下`圖1`所示,檢測出來惡意構造的EPS文件。
/*
Yara Rule Set
Author: Boluo
Date: 2017年3月28日19:16:16
Identifier: CVE-2015-2545
*/
/* Rule Set ----------------------------------------------------------------- */
rule cve_2015_2545 : BASE
{
meta:
description = "Check The EPS File"
author = "Boluo"
date = "2017年3月28日19:16:16"
hash1 = "1f9b7d8e692a1c9fadbdd05b794e8c49502323b073b44becaae5eee5e2186fc4"
strings:
$s1 = {3C 30 30 30 30 30 30 30 30 66 66 30 33 30 30 30 30 30 33 30 30 30 30 30 30 30 30 30 30
30 30 30 30 30 30 30 30 30 30 30 30 34 34 34 34 34 34 34 34 30 30 30 35 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30 30}
condition:
$s1
}
|
圖1(檢測eps文件為惡意)
6.2 動態防御
動態防御通過hook兩個點來進行防御,第一個hook點的位置為`pNext`進入PROC前其中0x28的內容保存一下,第二個hook點的位置為`pNext`在進入PROC后中0x28的內容是否發生變化進行hook,之后進行比較其內容進行判斷即可,之所以不能在循環遍歷刪除的位置檢測是因為PostScript中只要`dict1 dict2 copy`都會先把dict2的內容全部釋放掉然后再申請空間,不能直觀判斷是否為cve-2015-2545類型漏洞樣本,在釋放空間的位置進行檢測相當于給其打了補丁而不能直觀檢測為cve-2015-2545類型漏洞;測試結果如下圖所示。
圖1(動態檢測)
7. 結語
該漏洞及利用樣本的威脅程度非常高,可以在多種環境下成功利用,并且其構造的ROP鏈及shellcode能夠繞過多款安全性增強工具的檢測。所以需要做好防范工作。
8.參考資料
1.http://seclab.dbappsecurity.com.cn/?p=603 2.http://bbs.pediy.com/thread-216045.htm 3.http://bbs.pediy.com/thread-216046.htm 4.https://www-cdf.fnal.gov/offline/PostScript/PLRM2.pdf 5.https://www.fireeye.com/content/dam/fireeye-www/blog/pdfs/twoforonefinal.pdf 6.https://github.com/Yara-Rules/rules/tree/master/CVE_Rules 7.https://wenku.baidu.com/view/55adb37c8e9951e79b8927ed.html |