工具源码

恶意文档分析工具 oletools 使用说明

zeronohacker · 9月8日 · 2020年 · · · 338次已读

本文为 oletools 文档的中文版,原文链接:https://github.com/decalage2/oletools/wiki

如果你喜欢本文的话,可注册本站帐号并收藏本文,以方便下次查阅 ^_^ ! 那如何收藏文章,你可以选择以书签形式保存到你的浏览器中,还有一种方式是注册本站帐号,用鼠标移到你要收藏文件上面,在右上角处会显示收藏的图标,点击即可,收藏后,请前往个人用户中心的文章收藏选项卡处就可以查看你收藏的文章啦~

个人用户中心文章收藏处

另外,本文比较长,想快速定位你想要找的内容,可点击右侧的目录相关项即可。如果你在查阅过程中发现有哪不对的地方可在文章末尾处评论指出,站长收到经实践确认后确实是这样,我会给予一定的 Z 币奖励,Z 币可在本站购买付费资源,如果有可能,后面可兑换实物,这就很奶死了 ……

1 介绍

oletools 是一个用来分析 Microsoft OLE2 文件的工具包,OLE2 文件是一种以结构化存储的复合二进制文件或者复合文档格式的文件,例如微软的 Office文档、Outlook 邮件信息,工具包中的工具主要被用于进行恶意软件分析、取证和调试,工具是基于 olefile 解析器的。

想要获取更多 oletools 信息,请参看 http://www.decalage.info/python/oletools

Microsoft OLE2 请参看 http://en.wikipedia.org/wiki/Compound_File_Binary_Format

2 更新日志

v0.56 (2020-09-03) 开发版
1、olevba/mraptor: 新增 trigger _OnConnecting 检测
2、olevba: 更新 plugin_biff 至 0.0.15 版本,完善对 Excel 4/XLM 宏解析
3、olevba: 完善对 MHT 的检测
4、olevba: 新增 --no-xlm 选项,可关闭对 Excel 4/XLM 宏解析
5、olevba: 修复在 VBA 解压原始 chunks 的 bug
6、oleform: 完善解析
7、oleobj: Ole10Native 现在不区分大小写
8、clsid: 新增 PDF 和 Microsoft Word Picture

v0.55.2 (2019-12-16)
1、rtfobj: 从目标控制字列表中删除 \rtf
2、rtfobj: 修复 process_file 中对 Equation 类的检测

v0.55 (2019-12-03)
1、olevba: 支持 SLK 文件和从 SLK 文件中提取的 XLM 宏检测
2、olevba: 支持 VBA Stomping 检测
3、olevba: 将 pcodedmp 集成,使之能够对 P-code 提取和反汇编
4、olevba: 检测 P-code 中的可疑关键字
5、olevba: 新增 –pcode 选项,支持显示反汇编后的 P-code
6、对于不支持 UTF-8 语言环境的系统,可以更好地处理 unicode,例如 LANG=C
7、rtfobj: 新增 CVE-2017-0199

v0.55 之前的版本更新记录请自行在源码中查看 ……

3 工具包中各工具简单说明

用来分析恶意文档的工具

工具名用途
oleid用于分析 OLE 文件以便检测是否具有恶意文件的基本特征
olevba从 MS Office 文档 (OLE、OpenXML) 中提取和分析 VBA 宏代码
MacroRaptor检测恶意 VBA 宏
msodde从 MS Office 文档、RTF 和 CSV 中提取和检测 DDE/DDEAUTO 链接
pyxswf从 MS Office 文档 (例如 WORD、Excel)、RTF 中检测、提取和分析嵌入的 Flash 对象 (SWF)
oleobj从 OLE 文件中提取嵌入的对象
rtfobj从 RTF 文件中提取嵌入的对象

用于分析 OLE 文件结构的工具

工具名用途
olebrowse一个简单的 GUI 程序,用来查看和提取 OLE 文件 (例如 MS WORD、Excel 和 PPT) 中单个数据流
olemeta从 OLE 文件中提取所有的标准属性,标准属性也称元数据
oletimes提取所有流和存储当中创建和修改的时间戳
oledir显示 OLE 文件的所有目录条目
olemap以 map 的形式显示 OLE 文件中的区域

4 下载和安装

如果你想获取最新的稳定版本,请按相应平台使用 pip 命令安装

On Linux/Mac

sudo -H pip install -U oletools

On Windows

pip install -U oletools

如果你想获取最新的开发者安装版本,请按相应平台执行命令

On Linux/Mac

sudo -H pip install -U https://github.com/decalage2/oletools/archive/master.zip

On Windows

pip install -U https://github.com/decalage2/oletools/archive/master.zip

5 oleid

oleid 是一个用来分析 OLE 文件 (例如 MS Office 文档中的 Word、Excel) 的脚本文件,可以检测恶意文件的一般特征,举个粟子,比如能够检测 VBA 宏和嵌入的 Flash 对象。

5.1 主要特性

oleid 的主要特性

  • 检测 OLE 文件类型
  • 检测 VBA 宏
  • 检测嵌入的 Flash 对象
  • 检测嵌入的 OLE 对象
  • 检测加密的 MS Office
  • 能用作一个命令行工具
  • 将 Python API 集成到应用程序中

计划要完善的地方

  • 提取更多的 metadata 重要域
  • 支持 OpenXML 文件和嵌入的 OLE 文件
  • 通用 VBA 宏检测
  • 检测自动执行的 VBA 宏
  • 扩展 OLE 文件类型的检测
  • 检测不同寻常的 OLE 结构
  • 可对多个文件扫描
  • 可对压缩文件内的文件扫描
  • CSV 格式输出

5.2 使用方法

oleid <file>

举个粟子,比如检测 VBA 宏和嵌入的 Flash 对象

C:\oletools>oleid word_flash_vba.doc

Filename: word_flash_vba.doc
+-------------------------------+-----------------------+
| Indicator                     | Value                 |
+-------------------------------+-----------------------+
| OLE format                    | True                  |
| Has SummaryInformation stream | True                  |
| Application name              | Microsoft Office Word |
| Encrypted                     | False                 |
| Word Document                 | True                  |
| VBA Macros                    | True                  |
| Excel Workbook                | False                 |
| PowerPoint Presentation       | False                 |
| Visio Drawing                 | False                 |
| ObjectPool                    | True                  |
| Flash objects                 | 1                     |
+-------------------------------+-----------------------+

5.3 在 Python 程序中如何使用 oleid

首先,需要导入 oletools.oleid 模块,然后创建一个 OleID 对象来扫描一个文件

import oletools.oleid

oid = oletools.oleid.OleID(filename)

注意:filename 参数可以是一个文件名,也可以是一个类文件对象或者是要分析的文件里所包含的一个字节类字符串

完成上述操作后,接下来就是要去调用 check() 方法,这个方法会返回 Indicator 对象,每个 Indicator 对象都有如下这些属性

  • id: Indicator 的标识符,字符串类型
  • name: Indicator 的名称,字符串类型
  • description: Indicator 的描述,字符串类型
  • type: Indicator 的类,比如 bool、str、int
  • value: Indicator 的值

举个粟子,下面这段代码显示所有的 Indicator

indicators = oid.check()
for i in indicators:
    print 'Indicator id=%s name="%s" type=%s value=%s' % (i.id, i.name, i.type, repr(i.value))
    print 'description:', i.description
    print ''

想要获取更多详细细节,请自行参看 oleid.py 源码。

6 olevba

olevba 是一个用来解析 OLE 和 OpenXML 文件的脚本文件,可以提取和检测 VBA 宏,也可用来检测与安全相关的指标,比如自动执行宏,VBA 可疑关键字,反沙箱和反虚拟化技术,IOCs (IP 地址、URLs、可执行文件名等等)。它还可以检测和解码运用了几种常见的混淆方法的字符串,包括 Hex、StrReverse、Base64、Dridex、VBA expressions,并可以从解码后的字符串提取 IOCs。XLM/Excel 4 宏在 Excel 和 SLK 文件中也受支持。

6.1 支持的文件格式

  • Word 97-2003 (.doc, .dot), Word 2007+ (.docm, .dotm)
  • Excel 97-2003 (.xls), Excel 2007+ (.xlsm, .xlsb)
  • PowerPoint 97-2003 (.ppt), PowerPoint 2007+ (.pptm, .ppsm)
  • Word/PowerPoint 2007+ XML
  • Word 2003 XML (.xml)
  • Word/Excel Single File Web Page / MHTML (.mht)
  • Publisher (.pub)
  • SYLK/SLK 文件 (.slk)
  • 包含 VBA 的文本文件或者 VBScript 源代码
  • 对以上文件的有密码保护的压缩包

6.2 主要特性

olevba 主要特性

  • 能对 MS Office 97-2003,2007+,XML 和 MHT 文件检测
  • 提取 VBA 宏代码
  • 检测自动执行宏
  • 检测 VBA 宏中的可疑关键字
  • 检测反沙箱和反虚拟化技术
  • 能够检测和解码那些经过 Hex/Base64/StrReverse/Dridex 编码后的字符串
  • 使用 pyparsing 内置的 VBA 解析器可对任意编码组合 (Chr、Asc、Val、StrReverse、Environ、+、&、自定义的 Hex 和 Base64 加密) 的字符串做去混淆处理
  • 提取 IOCs 或其它你感兴趣的一些特征,比如 IP 地址、URLs、E-Mail 和可执行文件名
  • 扫描多个文件和样本集
  • 分类模式能显示多个文件的摘要视图
  • 能够对压缩后的带密码保护的包进行扫描
  • 在你的应用程序中可使用 olevba 中的 Python API

提示:加密后的 MS Office 的文档也是支持的,因为 VBA 宏实际并没有加密,只是文档的内容加密。

6.3 关于 VBA 宏

可参看 这篇文章 来获取更多关于 VBA 宏的信息和技术以及它们是怎样在 MS Office 文档存储的。

6.4 olevba 是如何工作的

olevba 大体的运行流程如下

  • 检测文件的类型,看是否为 OLE 文件,如果为 OLE 文件则立马解析
  • 如果它是一个压缩文件类型,则为 MS Office 2007+、XML 或 MHTML 文件,olevba 能够从中 (比如 vbaProject.bin、editdata.mso) 获取到所有的 ole 对象文件并打开
  • olevba 能够确定存储在 OLE 结构中的的有 VBA Projects
  • 解析每个 VBA Project以便查找包含宏代码的相应 OLE 流
  • 在每个 OLE 流中,VBA 宏代码会被提取和解压出来
  • olevba 会去查找经过诸如 Hex/Base64/StrReverse/Dridex/VBA expressions 算法编码后的字符串
  • olevba 扫描宏代码,去混淆,查找可疑的关键字、自动执行宏和 IOCs (URLs、IP 地址、E-Mail 地址、可执行文件名等等)

6.5 使用方法

Usage: olevba [options] <filename> [filename2 ...]

Options:
  -h, --help            show this help message and exit
  -r                    find files recursively in subdirectories.
  -z ZIP_PASSWORD, --zip=ZIP_PASSWORD
                        if the file is a zip archive, open all files from it,
                        using the provided password.
  -p PASSWORD, --password=PASSWORD
                        if encrypted office files are encountered, try
                        decryption with this password. May be repeated.
  -f ZIP_FNAME, --zipfname=ZIP_FNAME
                        if the file is a zip archive, file(s) to be opened
                        within the zip. Wildcards * and ? are supported.
                        (default:*)
  -a, --analysis        display only analysis results, not the macro source
                        code
  -c, --code            display only VBA source code, do not analyze it
  --decode              display all the obfuscated strings with their decoded
                        content (Hex, Base64, StrReverse, Dridex, VBA).
  --attr                display the attribute lines at the beginning of VBA
                        source code
  --reveal              display the macro source code after replacing all the
                        obfuscated strings by their decoded content.
  -l LOGLEVEL, --loglevel=LOGLEVEL
                        logging level debug/info/warning/error/critical
                        (default=warning)
  --deobf               Attempt to deobfuscate VBA expressions (slow)
  --relaxed             Do not raise errors if opening of substream fails

  Output mode (mutually exclusive):
    -t, --triage        triage mode, display results as a summary table
                        (default for multiple files)
    -d, --detailed      detailed mode, display full results (default for
                        single file)
    -j, --json          json mode, detailed in json format (never default)

提示:在 v0.54 新版本中,-p 选项被用来解密那些加了密的文档

6.6 一些粟子

扫描单个文件

olevba file.doc

扫描一个加了密的的 zip 压缩文件,密码为 infected

olevba malicious_file.xls.zip -z infected

扫描单个文件,显示所有混淆字符串被解码后的结果

olevba file.doc --decode

扫描单个文件,显示 VBA 字符串去混淆后的宏代码

olevba file.doc --reveal

扫描提取后的宏代码文件

olevba source_code.vba

扫描一个文件夹下的所有文件

olevba "MalwareZoo/VBA/*"

提示:在 Linux、MacOSX 或其它类 Unix 系统上,在通配符旁必须添加双引号,否则会被当作 shell 命令

在所有子目录中递归扫描所有的 .doc 和 .xls 文件

olevba "MalwareZoo/VBA/*.doc" "MalwareZoo/VBA/*.xls" -r

在带有密码的压缩包内递归扫描所有的 .doc 文件

olevba "MalwareZoo/VBA/*.zip" -r -z infected -f "*.doc"

6.7 详细分析模式 (默认单个文件)

当单个文件被扫描或使用 -d 选项时,分析的所有详细细节将会被罗列出来,比如下面扫描 DIAN_caso-5415.doc.zip 这个恶意文件时

>olevba c:\MalwareZoo\VBA\DIAN_caso-5415.doc.zip -z infected
===============================================================================
FILE: DIAN_caso-5415.doc.malware in c:\MalwareZoo\VBA\DIAN_caso-5415.doc.zip
Type: OLE
-------------------------------------------------------------------------------
VBA MACRO ThisDocument.cls
in file: DIAN_caso-5415.doc.malware - OLE stream: Macros/VBA/ThisDocument
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Option Explicit
Private Declare Function URLDownloadToFileA Lib "urlmon" (ByVal FVQGKS As Long,_
ByVal WSGSGY As String, ByVal IFRRFV As String, ByVal NCVOLV As Long, _
ByVal HQTLDG As Long) As Long
Sub AutoOpen()
    Auto_Open
End Sub
Sub Auto_Open()
SNVJYQ
End Sub
Public Sub SNVJYQ()
    [Malicious Code...]
End Sub
Function OGEXYR(XSTAHU As String, PHHWIV As String) As Boolean
    [Malicious Code...]
    Application.DisplayAlerts = False
    Application.Quit
End Function
Sub Workbook_Open()
    Auto_Open
End Sub

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
ANALYSIS:
+------------+----------------------+-----------------------------------------+
| Type       | Keyword              | Description                             |
+------------+----------------------+-----------------------------------------+
| AutoExec   | AutoOpen             | Runs when the Word document is opened   |
| AutoExec   | Auto_Open            | Runs when the Excel Workbook is opened  |
| AutoExec   | Workbook_Open        | Runs when the Excel Workbook is opened  |
| Suspicious | Lib                  | May run code from a DLL                 |
| Suspicious | Shell                | May run an executable file or a system  |
|            |                      | command                                 |
| Suspicious | Environ              | May read system environment variables   |
| Suspicious | URLDownloadToFileA   | May download files from the Internet    |
| IOC        | http://germanya.com. | URL                                     |
|            | ec/logs/test.exe"    |                                         |
| IOC        | http://germanya.com. | URL                                     |
|            | ec/logs/counter.php" |                                         |
| IOC        | germanya.com         | Executable file name                    |
| IOC        | test.exe             | Executable file name                    |
| IOC        | sfjozjero.exe        | Executable file name                    |
+------------+----------------------+-----------------------------------------+

6.8 分流模式 (默认多个文件)

当多个文件被扫描或使用 -t 选项时,每个文件的概要信息会被罗列出来,这对于快速分类可疑文件集合更为方便。下面为分析结果中显示的标志说明

  • OLE:文件类型为 OLE,比如 MS Office 97-2003
  • OpX:文件类型为 OpenXML,比如 MS Office 2007+
  • XML:文件类型为 Word 2003 XML
  • MHT:文件类型为 Word MHTML,即 .mht 文件
  • ?:不支持的文件类型
  • M:包含 VBA 宏
  • A:自动执行宏
  • S:可疑的 VBA 关键字
  • I:IOCs
  • H:Hex 编码的字符串
  • B:Base64 编码的字符串
  • D:Dridex 编码的字符串
  • V:VBA expressions 字符串

下面举个粟子

c:\>olevba \MalwareZoo\VBA\samples\*
Flags       Filename
----------- -----------------------------------------------------------------
OLE:MASI--- \MalwareZoo\VBA\samples\DIAN_caso-5415.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_1.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_2.doc.malware
OLE:MASI--- \MalwareZoo\VBA\samples\DRIDEX_3.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_4.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_5.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_6.doc.malware
OLE:MAS---- \MalwareZoo\VBA\samples\DRIDEX_7.doc.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_8.doc.malware
OLE:MASIHBD \MalwareZoo\VBA\samples\DRIDEX_9.xls.malware
OLE:MASIH-- \MalwareZoo\VBA\samples\DRIDEX_A.doc.malware
OLE:------- \MalwareZoo\VBA\samples\Normal_Document.doc
OLE:M------ \MalwareZoo\VBA\samples\Normal_Document_Macro.doc
OpX:MASI--- \MalwareZoo\VBA\samples\RottenKitten.xlsb.malware
OLE:MASI-B- \MalwareZoo\VBA\samples\ROVNIX.doc.malware
OLE:MA----- \MalwareZoo\VBA\samples\Word within Word macro auto.doc

6.9 支持 Python3 —— olevba3

自从 v0.54 版本以来,olevba 完全兼容 Python2 和 Python3,因此 olevba3 就没必要再去使用了,但是为了向下兼容,还是将它保留了。

6.10 在 Python 应用程序中如何使用 olevba

olevba 可被用来打开一个 MS Office 文件,检测它是否包含 VBA 宏,并可以提取和分析宏代码。

注意:olevba 目前正在积极开发中,因此有些 API 会发生更改

导入 olevba

首先,需导入 oletools.olevba 包,至少得用到 VBA_Parser 和 VBA_Scanner 类

from oletools.olevba import VBA_Parser, TYPE_OLE, TYPE_OpenXML, TYPE_Word2003_XML, TYPE_MHTML

用 VBA_Parser 解析 MS Office 文件

解析一个 MS Office 文件,需创建 VBA_Parser 类的实例,并提供要打开的文件所在路径作为参数,例如

vbaparser = VBA_Parser('my_file_with_macros.doc')

此外,也能将此文件里的数据作为字节类型字符串参数,在这种情况下,文件名必须提供,例如

myfile = 'my_file_with_macros.doc'
filedata = open(myfile, 'rb').read()
vbaparser = VBA_Parser(myfile, data=filedata)

如果文件不是受支持的格式,例如 OLE (MS Office 97-2003),OpenXML (MS Office 2007+),MHTML 或 Word 2003 XML,则 VBA_Parser 将引发异常。解析文件后,VBA_Parser.type 属性是表明文件类型的字符串。它可以是 TYPE_OLE,TYPE_OpenXML,TYPE_Word2003_XML 或 TYPE_MHTML (在 olevba 模块中定义的常量)。

检测 VBA 宏

VBA_Parser 对象中的 detect_vba_macros 方法可检测 VBA 宏是否存在,若存在,则返回 True,否则返回 False,如下

if vbaparser.detect_vba_macros():
    print 'VBA Macros found'
else:
    print 'No VBA Macros found'

检测算法会在 OLE 结构中查找具有特定名称的流和存储结构,这对于上面列出的所有受支持的格式都适用。但是,对于某些格式 (例如 PowerPoint 97-2003),此方法将始终返回 False,因为 VBA 宏是以 olevba 尚不支持的另一种方式存储的。此外,如果文件包含嵌入式文档 (例如,插入到 Word 文档中的 Excel 工作簿),即使嵌入的文档包含 VBA 宏,此方法可能返回 True,即使没有了主文档。

原文作者是用了 may return True,具体可自行去验证

提取 VBA 宏代码

extract_macros 方法可在文件 (可能包括嵌入式文件) 中找到每个 VBA 宏,并把它们提取和解压缩,会为找到的每个 VBA 宏生成一个 tuple (filename,stream_path,vba_filename,vba_code)。

  • filename:如果文件是 OLE (MS Office 97-2003) 类型,则 filename 是文件的路径。如果文件是 OpenXML (MS Office 2007+) 类型,则 filename 是压缩包中包含 VBA 宏的 OLE 子文件的路径,例如 word/vbaProject.bin
  • stream_path:包含 VBA 宏代码的 OLE 流路径
  • vba_filename:对应的 VBA 文件名
  • vba_code:以明文形式包含的 VBA 代码字符串

举个粟子

for (filename, stream_path, vba_filename, vba_code) in vbaparser.extract_macros():
    print '-'*79
    print 'Filename    :', filename
    print 'OLE stream  :', stream_path
    print 'VBA filename:', vba_filename
    print '- '*39
    print vba_code

另外,VBA_Parser 对象中的 extract_all_macros 方法返回的结果和上述相同。

分析 VBA 宏代码

从 v0.40 版本开始,已经用 VBA_Parser 类来替代 VBA_Scanner 类,VBA_Scanner 类已被废弃,类中提供的方法都用来分析宏。

VBA_Parser 类中的 analyze_macros 方法能够从所有的 VBA 模块中找到混淆的字符串、可疑的关键字、IOCs、自动执行宏等等。

VBA_Parser.analyze_macros() 方法返回一个包含 tuple(type, keyword, description) 的列表,以下为其中之一的所有项

  • type 的值为 AutoExec、Suspicious、IOC、Hex String、Base64 String、Dridex String、VBA obfuscated Strings 中之一
  • keyword 的值为自动执行宏、可疑关键字或 IOCs。对于混淆的字符串来说,这是解码后的字符串
  • description 的值提供 keyword 的描述,对于混淆的字符串来说,这是解码后的字符串

举个粟子

results = vbaparser.analyze_macros()
for kw_type, keyword, description in results:
    print 'type=%s - keyword=%s - description=%s' % (kw_type, keyword, description)

在调用 analyze_macros 方法后,下列 VBA_Parser 这些属性在每一个分类中都能显示相关条目的数量

print 'AutoExec keywords: %d' % vbaparser.nb_autoexec
print 'Suspicious keywords: %d' % vbaparser.nb_suspicious
print 'IOCs: %d' % vbaparser.nb_iocs
print 'Hex obfuscated strings: %d' % vbaparser.nb_hexstrings
print 'Base64 obfuscated strings: %d' % vbaparser.nb_base64strings
print 'Dridex obfuscated strings: %d' % vbaparser.nb_dridexstrings
print 'VBA obfuscated strings: %d' % vbaparser.nb_vbastrings

对 VBA 宏代码去混淆

reveal 方法可去混淆,去混淆原理为将解码后的内容替换原来混淆的字符串,并返回一个字符串。

举个粟子

print vbaparser.reveal()

关闭 VBA_Parser

在使用过后,最好是调用 VBA_Parser 对象中的关闭方法,以确保文件被关闭,特别是当你解析很多文件时更应该这样做

vbaparser.close()

6.11 废弃的 API

关于废弃的 API,这里就没必要讲了

7 mraptor (MacroRaptor)

mraptor 使用一般启发式技术来检测大多数恶意 VBA 宏,与反病毒引擎不同,它不依赖于特征。简而言之,mraptor 可以检测以下三种行为类型所对应的关键字 (明文)

  • A:触发自动执行行为
  • W:对文件系统和内存有写行为
  • X:在 VBA 内容外执行文件或 payload

当以上三个标记其中有一个为 True 时,mraptor 就会认为此宏为恶意的。如果你想要了解关于 mraptor 检测算法,可参看 这篇文章。mraptor 不仅可以作为一个命令行工具,也可以在你的 Python 应用程序中当作模块导入。

7.1 使用方法

Usage: mraptor [options] <filename> [filename2 ...]

Options:
  -h, --help            show this help message and exit
  -r                    find files recursively in subdirectories.
  -z ZIP_PASSWORD, --zip=ZIP_PASSWORD
                        if the file is a zip archive, open all files from it,
                        using the provided password (requires Python 2.6+)
  -f ZIP_FNAME, --zipfname=ZIP_FNAME
                        if the file is a zip archive, file(s) to be opened
                        within the zip. Wildcards * and ? are supported.
                        (default:*)
  -l LOGLEVEL, --loglevel=LOGLEVEL
                        logging level debug/info/warning/error/critical
                        (default=warning)
  -m, --matches         Show matched strings.

An exit code is returned based on the analysis result:
 - 0: No Macro
 - 1: Not MS Office
 - 2: Macro OK
 - 10: ERROR
 - 20: SUSPICIOUS

7.2 一些粟子

扫描单个文件

mraptor file.doc

扫描一个加了密的的 zip 压缩文件,密码为 infected

mraptor malicious_file.xls.zip -z infected

扫描一个文件夹下的所有文件

mraptor "MalwareZoo/VBA/*"

提示:在 Linux/MacOSX 上,使用 * 和 ?等通配符时,请始终在文件名前后加上双引号, 否则,shell 可以在启动脚本之前用与通配符匹配的文件的实际列表替换参数。

mraptor 检测样本后的结果显示

7.3 Python3 支持 —— mraptor3

自从 v0.54 版本以来,mraptor 完全兼容 Python2 和 Python3,因此 mraptor3 就没必要再去使用了,但是为了向下兼容,还是将它保留了。

7.4 在 Python 应用程序中如何使用 mraptor

TODO

8 msodde

msodde 可在 MS Office 中检测和提取 DDE 链接 (例如 DDEAUTO),被用来运行恶意命令传递恶意软件。它还支持 CSV 文件,CSV 文件可能包含 Excel 公式,目的是为了方便使用 DDE (称为 CSV 注入) 运行可执行文件。对于 Word 文档,它可以提取所有字段,并识别其中的可疑字段。

支持的格式

  • Word 97-2003 (.doc, .dot), Word 2007+ (.docx, .dotx, .docm, .dotm)
  • Excel 97-2003 (.xls), Excel 2007+ (.xlsx, .xlsm, .xlsb)
  • RTF
  • CSV (exported from/imported into Excel)
  • XML (exported from Word 2003, Word 2007+, Excel 2003, Excel 2007+)

对于 Word 文档,msodde 会检测使用 QUOTE 混淆的 DDE 命令,并自动对其进行去混淆。msodde 可以用作命令行工具,也可以在你的 Python 应用程序中当作模块导入。

8.1 关于 DDE 的漏洞利用分析文章

个人还是比较推荐大家看一下 ^_^

8.2 使用方法

usage: msodde.py [-h] [-j] [--nounquote] [-l LOGLEVEL] [-p PASSWORD] [-d] [-f]
                 [-a]
                 FILE

positional arguments:
  FILE                  path of the file to be analyzed

optional arguments:
  -h, --help            show this help message and exit
  -j, --json            Output in json format. Do not use with -ldebug
  --nounquote           don't unquote values
  -l LOGLEVEL, --loglevel LOGLEVEL
                        logging level debug/info/warning/error/critical
                        (default=warning)
  -p PASSWORD, --password PASSWORD
                        if encrypted office files are encountered, try
                        decryption with this password. May be repeated.

Filter which OpenXML field commands are returned:
  Only applies to OpenXML (e.g. docx) and rtf, not to OLE (e.g. .doc). These
  options are mutually exclusive, last option found on command line
  overwrites earlier ones.

  -d, --dde-only        Return only DDE and DDEAUTO fields
  -f, --filter          Return all fields except harmless ones
  -a, --all-fields      Return all fields, irrespective of their contents

提示:在 v0.54 新版本中,-p 选项被用来解密那些加了密的文档

8.3 一些粟子

扫描单个文件

msodde file.doc

扫描一个 Word 文档,提取所有的域

msodde -a file.doc

8.4 在 Python 应用程序中如何使用 msodde

这项工作正在进行中,API 预计在将来的版本中更改。

9 pyxswf

pyxswf 可用来在 MS Office 文件中检测、提取和分析嵌入的 Flash 对象 (SWF 文件),这对于恶意软件分析特别有用。pyxswf 可看作是 xxxswf.py (由 Alexander Hanel 编写) 的一个扩展。与 xxxswf.py 相比,它可以在 MS Office 文档正确解析其 OLE 结构来提取流,这在分离的流中是必须的。分离的流是已知的一种混淆技术,可参看 这篇文章 来了解。

9.1 使用方法

Usage: pyxswf [options] <file.bad>

Options:
  -o, --ole             Parse an OLE file (e.g. Word, Excel) to look for SWF
                        in each stream
  -f, --rtf             Parse an RTF file to look for SWF in each embedded
                        object
  -x, --extract         Extracts the embedded SWF(s), names it MD5HASH.swf &
                        saves it in the working dir. No addition args needed
  -h, --help            show this help message and exit
  -y, --yara            Scans the SWF(s) with yara. If the SWF(s) is
                        compressed it will be deflated. No addition args
                        needed
  -s, --md5scan         Scans the SWF(s) for MD5 signatures. Please see func
                        checkMD5 to define hashes. No addition args needed
  -H, --header          Displays the SWFs file header. No addition args needed
  -d, --decompress      Deflates compressed SWFS(s)
  -r PATH, --recdir=PATH
                        Will recursively scan a directory for files that
                        contain SWFs. Must provide path in quotes
  -c, --compress        Compresses the SWF using Zlib

9.2 一些粟子

在 Word 文档中提取和检测 SWF 文件

C:\oletools>pyxswf -o word_flash.doc
OLE stream: 'Contents'
[SUMMARY] 1 SWF(s) in MD5:993664cc86f60d52d671b6610813cfd1:Contents
        [ADDR] SWF 1 at 0x8  - FWS Header

C:\oletools>pyxswf -xo word_flash.doc
OLE stream: 'Contents'
[SUMMARY] 1 SWF(s) in MD5:993664cc86f60d52d671b6610813cfd1:Contents
        [ADDR] SWF 1 at 0x8  - FWS Header
                [FILE] Carved SWF MD5: 2498e9c0701dc0e461ab4358f9102bc5.swf

在 RTF 文档中提取和检测 SWF 文件

C:\oletools>pyxswf -xf "rtf_flash.rtf"
RTF embedded object size 1498557 at index 000036DD
[SUMMARY] 1 SWF(s) in MD5:46a110548007e04f4043785ac4184558:RTF_embedded_object_0
00036DD
        [ADDR] SWF 1 at 0xc40  - FWS Header
                [FILE] Carved SWF MD5: 2498e9c0701dc0e461ab4358f9102bc5.swf

9.3 在 Python 应用程序中如何使用 pyxswf

TODO

10 oleobj

oleobj 可从 OLE 文件中提取嵌入的对象,oleobj 不仅可以作为一个命令行工具,也可以在你的 Python 应用程序中当作模块导入。此工具官方未作过多详细说明。

10.1 使用方法

usage: usage: oleobj.py [options] <filename> [filename2 ...]

positional arguments:
  FILE                  Office files to parse (same as -i)

optional arguments:
  -h, --help            show this help message and exit
  -r                    find files recursively in subdirectories.
  -d OUTPUT_DIR         use specified directory to output files.
  -z ZIP_PASSWORD, --zip ZIP_PASSWORD
                        if the file is a zip archive, open first file from it,
                        using the provided password (requires Python 2.6+)
  -f ZIP_FNAME, --zipfname ZIP_FNAME
                        if the file is a zip archive, file(s) to be opened
                        within the zip. Wildcards * and ? are supported.
                        (default:*)
  -l LOGLEVEL, --loglevel LOGLEVEL
                        logging level debug/info/warning/error/critical
                        (default=warning)
  -i FILE, --more-input FILE
                        Additional file to parse (same as positional
                        arguments)
  -v, --verbose         verbose mode, set logging to DEBUG (overwrites -l)

10.2 在 Python 应用程序中如何使用 oleobj

查看 rtfobj.py 源代码

TODO

11 rtfobj

rtfobj 可用于检测和提取存储在 RTF 文件中的嵌入式对象,例如 OLE 对象。它还可以检测 OLE 包对象,并提取嵌入式文件。从 v0.50 版本开始,rtfobj 包含一个自定义 RTF 解析器,该解析器旨在匹配 MS Word 的行为,以便处理混淆的 RTF 文件。有关一些具体示例,请查看 这篇文章。rtfobj 可用作 Python 库或命令行工具。

11.1 使用方法

rtfobj [options] <filename> [filename2 ...]

Options:
  -h, --help            show this help message and exit
  -r                    find files recursively in subdirectories.
  -z ZIP_PASSWORD, --zip=ZIP_PASSWORD
                        if the file is a zip archive, open first file from it,
                        using the provided password (requires Python 2.6+)
  -f ZIP_FNAME, --zipfname=ZIP_FNAME
                        if the file is a zip archive, file(s) to be opened
                        within the zip. Wildcards * and ? are supported.
                        (default:*)
  -l LOGLEVEL, --loglevel=LOGLEVEL
                        logging level debug/info/warning/error/critical
                        (default=warning)
  -s SAVE_OBJECT, --save=SAVE_OBJECT
                        Save the object corresponding to the provided number
                        to a file, for example "-s 2". Use "-s all" to save
                        all objects at once.
  -d OUTPUT_DIR         use specified directory to save output files.

rtfobj 可显示已检测到的 OLE 和 Package 对象的列表及其属性,例如类和文件名。当 OLE Package 对象包含可执行文件或脚本时,会突出显示,例如:

rtfobj 检测样本后的结果显示

要提取对象或文件,请使用 -s 选项,后跟表中所表示的对象编号,例如

rtfobj -s 0

它提取并解码相应的对象,并将其保存为名为 object_xxxx.bin 的文件,其中 xxxx 是对象在 RTF 文件中的位置。

11.2 在 Python 应用程序中如何使用 rtfobj

从 v0.50 版本开始,API 发生了重大变化,并且尚未最终确定。具体请参见 rtfobj 源码中的 RtfObjectParser 类。废弃的 API 在此不讲。

12 olebrowse

olebrowse 是一个简单的 GUI 程序,可以浏览 OLE 文件 (例如 MS Word,Excel,Powerpoint 文档),以查看和提取单个数据流。

12.1 依赖关系

olebrowse 需要 Tkinter,在 Windows 和 MacOSX 上,可使用 Python 进行安装。但是,在 Linux 上,例如在 Ubuntu 上,可通过以下命令完成此操作:

sudo apt-get install python-tk

安装 Python3 版本的 Tkinter

sudo apt-get install python3-tk

其实在安装 oletools 时会自动帮你处理好依赖关系。

12.2 使用方法

olebrowse [file]

如果你提供一个文件,它将被打开,否则将出现一个对话框,让你浏览文件夹以打开文件。然后,如果它是有效的 OLE 文件,将显示数据流列表。你可以选择一个流,然后在内置的十六进制查看器中查看其内容,或将其保存到文件中以进行进一步分析。

12.3 快照

主菜单上显示 OLE 文件中的所有流

主菜单上显示 OLE 文件中的所有流

流操作菜单

流操作菜单

流的十六进制视图

流的十六进制视图

13 olemeta

olemeta 可用于解析 OLE 文件 (例如 MS Office 文档中的 Word,Excel),以提取 OLE 文件中存在的所有标准属性。

13.1 使用方法

olemeta <file>
olemeta 检测样本后的结果显示

13.2 在 Python 应用程序中如何使用 olemeta

TODO

14 oletimes

oletimes 可用于解析 OLE 文件 (例如 MS Office 文档中的 Word,Excel),以提取 OLE 文件中所有流和存储的创建和修改时间。

14.1 使用方法

oletimes <file>

对 DIAN_caso-5415.doc 这个恶意样本检测

>oletimes DIAN_caso-5415.doc

+----------------------------+---------------------+---------------------+
| Stream/Storage name        | Modification Time   | Creation Time       |
+----------------------------+---------------------+---------------------+
| Root                       | 2014-05-14 12:45:24 | None                |
| '\x01CompObj'              | None                | None                |
| '\x05DocumentSummaryInform | None                | None                |
| ation'                     |                     |                     |
| '\x05SummaryInformation'   | None                | None                |
| '1Table'                   | None                | None                |
| 'Data'                     | None                | None                |
| 'Macros'                   | 2014-05-14 12:45:24 | 2014-05-14 12:45:24 |
| 'Macros/PROJECT'           | None                | None                |
| 'Macros/PROJECTwm'         | None                | None                |
| 'Macros/VBA'               | 2014-05-14 12:45:24 | 2014-05-14 12:45:24 |
| 'Macros/VBA/ThisDocument'  | None                | None                |
| 'Macros/VBA/_VBA_PROJECT'  | None                | None                |
| 'Macros/VBA/__SRP_0'       | None                | None                |
| 'Macros/VBA/__SRP_1'       | None                | None                |
| 'Macros/VBA/__SRP_2'       | None                | None                |
| 'Macros/VBA/__SRP_3'       | None                | None                |
| 'Macros/VBA/dir'           | None                | None                |
| 'WordDocument'             | None                | None                |
+----------------------------+---------------------+---------------------+

14.2 在 Python 应用程序中如何使用 oletimes

TODO

15 oledir

oledir 可用于显示 OLE 文件的所有目录条目,包括空闲和孤立的条目。它既可以用作命令行工具,也可以用作你自己的应用程序中的 python 模块。

15.1 使用方法

Usage: oledir [options] <filename> [filename2 ...]

Options:
  -h, --help            show this help message and exit
  -r                    find files recursively in subdirectories.
  -z ZIP_PASSWORD, --zip=ZIP_PASSWORD
                        if the file is a zip archive, open all files from it,
                        using the provided password (requires Python 2.6+)
  -f ZIP_FNAME, --zipfname=ZIP_FNAME
                        if the file is a zip archive, file(s) to be opened
                        within the zip. Wildcards * and ? are supported.
                        (default:*)

15.2 一些粟子

扫描单个文件

oledir file.doc
oledir 检测样本后的结果显示

15.3 在 Python 应用程序中如何使用 oledir

TODO

16 olemap

以 map 的形式显示 OLE 文件中的区域,它既可以用作命令行工具,也可以用作你自己的应用程序中的 python 模块。

16.1 使用方法

Usage: olemap <filename>

16.2 一些粟子

扫描单个文件

olemap file.doc
olemap 检测样本后的结果显示
olemap 检测样本后的结果显示

16.3 在 Python 应用程序中如何使用 olemap

TODO

(本文完)

0 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!