称CVE-2012-0158为不死鸟是因为直到CVE-2017-0199公布前,长达整整5年的时间,0158似乎一直以一种傲视群雄的姿态霸占着各大安全公司的通用漏洞利用榜单(文档类)。
CVE-2012-0158属于非常经典的基于栈的缓冲区溢出漏洞,在《漏洞战争》中栈溢出漏洞分析章节有对该漏洞进行详细分析,使得该漏洞成为不少二进制漏洞分析者入门的不二选择。
本文详细叙述漏洞触发原因、常见文档格式中的利用以及静态检测规则,算作分析0158的一段总结。如有不尽和错误之处希望大家批评指正。
CVE-2012-0158的漏洞成因在很多文章中都说得非常详尽。我最早是看维一零的文章《手把手教你如何构造office漏洞EXP(第一期》,里面对漏洞的原理到漏洞利用进行深入浅出的讲解。这里再简单介绍一下造成该漏洞的原因:CVE-2012-0158漏洞发生在MSCOMCTL.OCX模块,在一段内存拷贝时,由于检查条件错误造成基于栈的缓冲区溢出。
我们找一个POC调试一下。当我们来到漏洞溢出点的时候,结合当前环境寄存器的值和内存布局分析该溢出。
很明显,源地址为0x0020DEF8(即esi),目的地址为0x00137678(即edi),拷贝长度为0x800(即ecx * 4)字节。
查看当前内存布局:
查看调用栈:
当拷贝进行到第四次时,将保存在栈空间的返回地址0x275E742B覆盖为0xAAAAAAAA。
直接运行,在执行到EIP为0xAAAAAAAA时,触发访问异常。
结合以上分析,判定在漏洞触发点拷贝的数据长度最大应该为8字节,如果多于8字节将造成缓冲区溢出。可以使用IDA Pro查看函数反汇编代码,本文不再累述。
结合以上分析时内存的数据,我们可以很快地在文件十六进制中找到对应的字节序列。
结合《漏洞战争》中对该内存中结构体的描述,我们可以将该样本中的结构体定义如下:
0x03 常见格式
CVE-2012-0158的漏洞利用文档常见的格式主要集中在RTF和OFFICE 2003。比较少见的有MHT和OFFICE 2007+。以下我们将对一些常见的在野漏洞利用文档进行静态分析并尽量给出较为严格yara检测规则。当然,RTF的混淆本文不做讲解,对于RTF的混淆及解混淆如果需要后续可单独另起一篇帖子介绍,一定是好长的一篇文章。
CVE-2012-0158的在野漏洞中,RTF文档是最常见的,其占比非常高。究其原因,可能是RTF属于宽松的基于标签的文本格式,能够让漏洞利用作者展示各种混淆技巧用以躲避杀软厂商的检测。
不将文档混淆考虑在内,RTF漏洞文档的分析及检测其实相对容易。
RTF文档以 {rt 开头,我们直接搜索关键标识436F626A,得到以下结果:
通过我们对文件字段的划分可以很快标识出漏洞的关键信息。
针对RTF的CVE-2012-0158漏洞样本yara检测规则参考如下:
3.2 Office 2003文档
在野CVE-2012-0158攻击样本,除了RTF文件格式,占比其次的当属Office 2003。可能由于一些政府机构办公软件长时间不更新,一些上市公司财务软件与旧版Office绑定导致可能遭受针对使用旧版软件的定向攻击。
Office 2003格式以十六进制 D0 CF 11 E0 开头。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
最后于 2018-7-18 18:32
被花剌子模编辑
,原因: 修改源代码格式