首发于red_Magic
Office恶意文件解析与混淆研究

Office恶意文件解析与混淆研究

简介

微软Office办公套装,包括word、Excel、Powerpoint等软件是全球范围内使用最广的文档编辑类软件,针对Office系列软件发起的钓鱼攻击和APT攻击一直是安全攻防的热点话题。


在上篇文章中我介绍了Pdf恶意文档的分析方式以及常见混淆处理方式。本次介绍一下基于OLE解析的Office恶意文档的解析方式以及分析中常出现的一些问题。


文章结构:


  • Office文档格式介绍
  • Rtf文档格式介绍以及解析
  • OLE格式介绍
  • Rtf文档格式混淆
  • Office恶意文档解析思路
  • 常用分析工具推荐


Office文件格式介绍


针对Office恶意文档的分析可以划分为两个部分:

Office2007之前的版本

Office2007之后的版本


Office2007之后的版本在原有Office文件格式的基础上加入了XML文件格式,这种新的文件格式称之为Office Open XML,相比于之前的版本Office文档结构更为清晰。下面我将详细介绍两个版本之间的区别:


Office2007之前的版本


Office2007的文件储存格式可以看作二进制文件,这里用十六进制编辑器打开示例文件(CVE-2008-0320)

可以看到示例文件的文件头为D0 CF 11 E0 A1 B1 1A E1

这种文档格式是OLESS(OLE Structured Storage),微软采用是的OLE1.0的文档规范

这里我们可以直接用微软自带工具——Offvis打开文档,直观的查看OLESS文档结构

用Offvis打开后可以看到文档,一个非常重要的关键字我们需要注意——CLSID

这个关键字一般常用来区分各种CVE编号而且主义的是OLESS中CLSID的存放位置与Rtf中CLSID的存放位置不同,Rtf中存放在\objdata控制字中。


Office2007之后的版本


同样,我们使用十六进制编辑器打开一个Office2007之后的样本。

可以发现文件头为PK,对独立软件发展历史有过了解的应该知道,PK代表ZIP算法的发明者(Phil Katz)。说明该文档实际上为ZIP压缩包。

那么接下来的第一步,我们需要将文档解压。简单的方式我们可以修改文件的后缀名,使用7z等解压软件将文档解压

需要注意的是,部分文档可能会在文档中设置解压终止符,所以用现成的解压软件可能会造成解压不完成的情况,建议使用zlib自定义封装解压库解压文档.

解压后的文档目录结构如图所示

(演示文件为ppt格式,word等格式可能稍微不一样)

其中_rels文件夹中包含一个.rels.xml文件,这个xml文件定义了包中的根关系,是解析整个包中需要首先浏览的一个文件。


Office恶意文档主要通过嵌入文件的形式触发攻击,所以,我们需要知道嵌入文件的存放位置。


根据分析,嵌入文件的存放位置一般为embeddings文件夹。

可以看到嵌入文件同样为OLESS格式文件,这种文件格式的详细介绍会在下文给出。


需要指出的是,Office文件嵌套方式主要有两种,一种是上面给出的在PK包中嵌入文档;另一种是将攻击文件包装成Rtf格式,再将嵌入文件插入Rtf的/objdata流中,那么下面我们有必要再进一步介绍Rtf格式。


Rtf文档格式介绍以及解析


富文本格式(Rtf, rich text format)是微软的文本和图像信息交换制定的格式。Rtf文件可以划分为文件头和文档区两个部分组成。

文件头和文档区由文本、控制字和控制符组成,同时利用{...}来表明层级关系。


Rtf文件内容	控制字		解释
文件头		\rtfN		版本号
			\fonttbl    字体表
			\filetbl    文件表
			\listtable  编目表
文档区		\info		信息组
			\pict       图片
			\object     对象
			\sv         绘图对象值
			\sn         绘图对象名称
			\objupdate  自动更新机制。很重要,攻击样本中经常使用,确保OLE对象自动加载、更新
  • 控制字是Rtf用来标记文档信息的格式命令。常见控制字如上
  • 由一个反斜线\跟随单个非字母字符组成。例如,\~代表一个不换行空格。控制符常被用来作为文件混淆的一种方式。
  • 组由包括在({})中的文本、控制字或控制符组成。左扩符({)表示组的开始,右扩符(})表示组的结束。拓展符内部同样可以嵌套其他组。(题外话:这种花括号的层级叠加一度让我想起了被LISP支配的恐惧。。。)


前面已经说过,Rtf恶意文档是通过嵌入文件触发的攻击。\object控制字表示Rtf中嵌入了其他格式文件。Rtf文件格式的嵌入涉及到了OLE(Object linking and embedding)技术,所以我们有必要再介绍一下OLE文件格式,在下文会有详细介绍,这里我们需要知道\object控制字之后可以嵌入其他文件。


而且根据控制字的不同可以嵌入不同格式的文件,如下:

对象类型			解释
\objemb		嵌入图片、文档、音频等
\objlink	嵌入链接文件
\objautlink	嵌入自动链接对象类型。
\objsub		Macintosh版管理签署对象类型。
\objpub		Macintosh版管理发布对象类型。
\objicemb	MS Word for Macintosh可安装命令(IC)嵌入对象类型。
\objhtml	超文本标记语言(HTML)控件对象类型。
\objocx		嵌入ActiveX控件

了解对象类型之后我们还需要了解对象数据控制字,以便知道如何数据如何储存。如下:

对象数据			解释
\objdata	采用特定格式表示的对象数据;OLE对象采用OLESaveToStream结构。常见恶意文件样本关键字。
\objalias	Macintosh编辑管理器发行对象的别名记录。
\objsect	Macintosh编辑管理器发行对象的域记录。

由上一系列分析可知\objdata控制字之后即为OLE文件内容,下面我们介绍OLE文件格式


#OLE格式介绍


OLE(Object linking and embedding)是一种基于组件对象模型(COM)的对象链接与嵌入技术。

基于OLE嵌入技术加载未开启ASLR模块的CVE以及攻击样本层出不穷,下面简单介绍一下OLE格式。


前面已经提及,Rtf中采用的是OLE 1.0的文档格式,这种文件格式分为文件头部分以及数据部分的OLESS格式。


文件头部分的格式包含的信息如下:

* ClassName字段即为Rtf中储存的CLSID,CLSID是指windows系统针对不同应用程序、文件类型、OLE对象以及各种虐系统组件分配的ID代码,恶意样本中用特定ID调用相应组件达到针对性攻击的目的,这一数值同样是检测中常用的特征值。

* Data部分即为数据区,数据区的数据中以D0 CF 11 E0 A1 B1 1A E1开头的数据即为OLESS格式内容。造成堆溢出的数据即在这部分区域。同样应该注意的是,如果OLE文件头部分中包含的CLSID不合法,那么CLSID将在OLESS部分中的clssidThis字段中读取。


在用十六进制编辑器打开Rtf文件时,我们可以看到,Rtf将嵌入的OLE文件以可见字符的形式进行了表示。所以,分析的时候我们需要将可见字符转换成相应的16进制,即——Ascii to hex,如下图

Rtf文档格式混淆


恶代样本中常采取一些混淆机制以规避杀软检查,常用的手段有以下几种:


文件头混淆

{\rtf1

正常Rtf文档打开文件头如上,实际测试中发现解析器只需识别前四个字节{\rt,一般会见到几种修改文件头的样本

{\rt{{{\{\info{\authorismail-
{\rtÈÐÏ

无用字符混淆

{\rtf1\object112\objocx9912{\*\objdata54541 {{0
1
0
5

  0
0
0
0
0
  2
0
0
0

经测试,rtf中的空格回车和不可见字符并不会被解析器识别,所以在解析rtf样本时推荐跳过Ascii码表中<=0x20和>0x7F的字符


objdata头不正确

\objdata为OLE嵌入对象数据控制字,但实际测试中发现\objdata可以写成如下形式

\ bjdata

其中空格部分代表0x00


大小写不敏感


D0 CF 11 E0 A1 B1 1A E1是OLESS的文件头,其在OLE的data部分常见于小写形式,不过实际测试样本发现

D0cf11e0a1b11ae1

可见office的解析器对大小写是不敏感的。


bin混淆


{{1521BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBE\bin2ÐÏ{}\bin5ࡱE13E3FEFF9611121FEFFFFFF

上面是一段Rtf文档,\binxx代表之后的xx个数字以二进制形式读取,所以上面中两个\bin中的内容联合起来实质为OLESS的文件头,如果编写的解析器不能正确解析相应数据将会带来误判。


组多重嵌套


rtf中的组可以循环嵌套,例如

{{}{}{}{}ddd{}ddd}

解析器在解析的时候会跳过无用的组和控制符,这也是混淆常用的手段。


Office恶意文档解析思路


针对Office恶意文档的解析可以分成三个方向来进行。

1. 对于2007之前的版本可以看作OLESS格式,对这部分直接按照OLESS格式解析扫描特征

2. 2007之后的版本,需要先进行解压缩之后找到OLE文件进行相应的分析。

3. 如果待扫描的文件头为rtf格式,则提取相应的OLE文件进行分析。


常用分析工具推荐

[Offvis]

软件官方OLESS分析工具


[OLETools]

开源OLE分析项目


[OpenXmlScanner]

开源OpenXml恶代扫描项目

编辑于 2017-11-23

文章被以下专栏收录