oletools
OLEおよびMS Officeファイルを解析するためのPythonツール
確認時の最新版:2021-01-23 v0.56
悪質な文書を分析するツール
- 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:個々のデータストリームを表示および抽出するためのOLEファイル(MS Word、Excel、Powerpointドキュメントなど)を参照するためのシンプルなGUI
- olemeta:OLEファイルから標準のすべてのプロパティ(メタデータ)を抽出する
- oletimes:すべてのストリームとストレージの作成タイムスタンプと修正タイムスタンプを抽出する
- oledir:空ファイルと孤立したエントリを含む、OLEファイルのすべてのディレクトリエントリを表示する
- olemap:OLEファイル内のすべてのセクタのマップを表示する
oletools と 解析可能なファイルタイプについて
それぞれのツールが解析対象としているファイルについては、以下の資料が分かりやすく参考になります。
- Malware-Analysis-Fundamentals-Files-Tools.pdf
https://www.winitor.com/pdf/Malware-Analysis-Fundamentals-Files-Tools.pdf
実際に使った時の結果表示例
解析対象とした検体
- ファイル名:oBfsC4t10n2.xls
- MD5: 0C09FBDF98F0A6144A42FDE00FE21504
- SHA1: BB4A594ECF90ED6B9E408C404B08620500FB4C02
- SHA256: 1F156F86D45E28DAC74015051546305497ADB86B4E46BB7D9A84CCF5E25A12F4
# oleid oBfsC4t10n2.xls oleid 0.54 - http://decalage.info/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues Filename: oBfsC4t10n2.xls Indicator Value OLE format True Has SummaryInformation stream True Application name b'Microsoft Excel' Encrypted False Word Document False VBA Macros False Excel Workbook True PowerPoint Presentation False Visio Drawing False ObjectPool False Flash objects 0
- olevba
https://github.com/decalage2/oletools/wiki/olevba
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
※ほかのコマンドと比較して、少し処理に時間がかかる。
# olevba -a oBfsC4t10n2.xls olevba 0.56 on Python 3.8.3 - http://decalage.info/python/oletools =============================================================================== FILE: oBfsC4t10n2.xls Type: OLE ------------------------------------------------------------------------------- VBA MACRO xlm_macro.txt in file: xlm_macro - OLE stream: 'xlm_macro' +----------+--------------------+---------------------------------------------+ |Type |Keyword |Description | +----------+--------------------+---------------------------------------------+ |AutoExec |Auto_Open |Runs when the Excel Workbook is opened | |Suspicious|Open |May open a file | |Suspicious|CALL |May call a DLL using Excel 4 Macros (XLM/XLF)| |Suspicious|Windows |May enumerate application windows (if | | | |combined with Shell.Application object) | |Suspicious|FORMULA.FILL |May modify Excel 4 Macro formulas at runtime | | | |(XLM/XLF) | |Suspicious|Hex Strings |Hex-encoded strings were detected, may be | | | |used to obfuscate strings (option --decode to| | | |see all) | |Suspicious|Base64 Strings |Base64-encoded strings were detected, may be | | | |used to obfuscate strings (option --decode to| | | |see all) | |IOC |rundll32.exe |Executable file name | +----------+--------------------+---------------------------------------------+
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip ZIP_PASSWORD ファイルがZIPアーカイブの場合、指定されたパスワードを使ってアーカイブ内のすべてのファイルを開きます。 -p PASSWORD, --password PASSWORD 暗号化されたオフィスファイルに遭遇した場合、このパスワードで復号化を試みます。繰り返してもかまいません。 -a, --analysis 解析結果のみを表示し、マクロのソースコードは表示しません。 -c, --code VBAのソースコードのみを表示し、解析は行いません。 --decode すべての難読化された文字列をそのデコード内容(Hex, Base64, StrReverse, Dridex, VBA)とともに表示します。 --attr VBAのソースコードの先頭にある属性行を表示します。 --reveal 難読化された文字列をすべてデコードした内容に置き換えた後のマクロのソースコードを表示します。 --deobf VBA 式の難読化の解除を試みます (低速) --show-pcode 逆アセンブルされた P-code を表示します(pcodedmp を使用)。 出力モード(相互に排他的) -t, --triage トリアージモード、結果をサマリーテーブルとして表示する(複数ファイルの場合のデフォルト)。 -d, --detailed 詳細モード:結果をすべて表示する(デフォルトは1ファイル)。 -j, --json json モード、詳細をjson形式で表示(デフォルトはなし)。
- MacroRaptor
https://github.com/decalage2/oletools/wiki/mraptor
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
# mraptor oBfsC4t10n2.xls MacroRaptor 0.56 - http://decalage.info/python/oletools This is work in progress, please report issues at https://github.com/decalage2/oletools/issues ----------+-----+----+-------------------------------------------------------- Result |Flags|Type|File ----------+-----+----+-------------------------------------------------------- SUSPICIOUS|A-X |OLE:|oBfsC4t10n2.xls Flags: A=AutoExec, W=Write, X=Execute Exit code: 20 - SUSPICIOUS
- msodde
※今回の検体では検出しなかったので、せめてデバッグログ付きで出力。
# msodde -l debug oBfsC4t10n2.xls msodde 0.55 - http://decalage.info/python/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues Opening file: oBfsC4t10n2.xls DEBUG Is OLE. Checking streams to see whether this is xls DEBUG Finding streams in ole file DEBUG direntry 0 Root Entry: no stream (root) DEBUG direntry 1 Workbook: is stream of size 833805 DEBUG Process file as excel 2003 (xls) DEBUG Finding streams in ole file DEBUG direntry 0 Root Entry: no stream (root) DEBUG direntry 1 Workbook: is stream of size 833805 DEBUG direntry 2 SummaryInformation: is stream of size 4096 DEBUG direntry 3 DocumentSummaryInformation: is stream of size 4096 DDE Links:
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip=ZIP_PASSWORD ファイルがZIPアーカイブの場合、与えられたパスワードを使って、すべてのファイルを開きます。 -m, --matches マッチした文字列を表示します。
# pyxswf oBfsC4t10n2.xls pyxswf 0.54 - http://decalage.info/python/oletools Please report any issue at https://github.com/decalage2/oletools/issues [SUMMARY] 0 SWF(s) in MD5:248281a8216a8340469ec88659ec7e1a:oBfsC4t10n2.xls
- oleobj
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
※今回の検体では検出しなかったので、せめてデバッグログ付きで出力。
# oleobj -l debug oBfsC4t10n2.xls oleobj 0.56 - http://decalage.info/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues ------------------------------------------------------------------------------- File: 'oBfsC4t10n2.xls' DEBUG working on file by name DEBUG Finding streams in ole file DEBUG direntry 0 Root Entry: no stream (root) DEBUG direntry 1 Workbook: is stream of size 833805 DEBUG direntry 2 SummaryInformation: is stream of size 4096 DEBUG direntry 3 DocumentSummaryInformation: is stream of size 4096 INFO is ole file: oBfsC4t10n2.xls DEBUG Checking stream '\x05DocumentSummaryInformation' DEBUG Checking stream '\x05SummaryInformation' DEBUG Checking stream 'Workbook'
オプション(一部抜粋)※機械翻訳
オプション -x, --extract 埋め込まれた SWF を抽出し、MD5HASH.swf という名前を付け、作業ディレクトリに保存します。 -y, --yara yara で SWF をスキャンします。SWF が圧縮されている場合は圧縮を解除します。 -s, --md5scan SWF (s) を MD5 署名でスキャンします。 -H, --header SWFs ファイルのヘッダを表示します。 -d, --decompress 圧縮された SWFS をデフレートします。 -r PATH, --recdir=PATH SWF を含むファイルのためにディレクトリを再帰的にスキャンします。 SWF を含むファイルを再帰的にスキャンします。パスを引用符で囲む必要があります。 -c, --compress Zlib を使って SWF を圧縮します。 -o, --ole OLE ファイル (Word、Excel など) を解析して、各ストリームにある SWF を探します。 -f, --rtf RTF ファイルを解析して、埋め込まれた各オブジェクトの中から SWF を探します。
- rtfobj
https://github.com/decalage2/oletools/wiki/rtfobj
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
※今回の検体では検出しなかったので、せめてデバッグログ付きで出力。
# rtfobj -l debug oBfsC4t10n2.xls rtfobj 0.55.2 on Python 3.8.3 - http://decalage.info/python/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues =============================================================================== File: 'oBfsC4t10n2.xls' - size: 849920 bytes ---+----------+--------------------------------------------------------------- id |index |OLE Object ---+----------+--------------------------------------------------------------- DEBUG b'g' is a destination control word: starting a new destination at index 37FBh DEBUG b'g' is a destination control word: starting a new destination at index 1AF9Dh DEBUG b'g' is a destination control word: starting a new destination at index 1B484h DEBUG b'g' is a destination control word: starting a new destination at index 209D6h DEBUG b'g' is a destination control word: starting a new destination at index 2E43Dh DEBUG b'g' is a destination control word: starting a new destination at index 3A799h
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip=ZIP_PASSWORD ファイルがZIPアーカイブの場合、与えられたパスワードで最初のファイルを開きます。 -s SAVE_OBJECT, --save=SAVE_OBJECT 例えば「-s 2」のように、指定された番号に対応するオブジェクトをファイルに保存します。すべてのオブジェクトを一度に保存するには「-s all」を使用します。 -d OUTPUT_DIR 指定したディレクトリに出力ファイルを保存する。
- olemeta
https://github.com/decalage2/oletools/wiki/olemeta
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
# olemeta oBfsC4t10n2.xls olemeta 0.54 - http://decalage.info/python/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues =============================================================================== FILE: oBfsC4t10n2.xls Properties from the SummaryInformation stream: +---------------------+------------------------------+ |Property |Value | +---------------------+------------------------------+ |codepage |1252 | |author |0xdf | |last_saved_by |0xdf | |create_time |2020-03-23 14:19:10 | |last_saved_time |2020-04-25 18:43:56 | |creating_application |Microsoft Excel | |security |0 | +---------------------+------------------------------+ Properties from the DocumentSummaryInformation stream: +---------------------+------------------------------+ |Property |Value | +---------------------+------------------------------+ |codepage_doc |1252 | |scale_crop |False | |company | | |links_dirty |False | |shared_doc |False | |hlinks_changed |False | |version |1048576 | +---------------------+------------------------------+
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip=ZIP_PASSWORD ファイルがZIPアーカイブの場合、与えられたパスワードを使って、その中のすべてのファイルを開きます(Python 2.6+が必要です
- oletimes
https://github.com/decalage2/oletools/wiki/oletimes
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
# oletimes oBfsC4t10n2.xls oletimes 0.54 - http://decalage.info/python/oletools THIS IS WORK IN PROGRESS - Check updates regularly! Please report any issue at https://github.com/decalage2/oletools/issues =============================================================================== FILE: oBfsC4t10n2.xls +----------------------------+---------------------+---------------+ | Stream/Storage name | Modification Time | Creation Time | +----------------------------+---------------------+---------------+ | Root | 2021-01-23 07:21:27 | None | | '\x05DocumentSummaryInform | None | None | | ation' | | | | '\x05SummaryInformation' | None | None | | 'Workbook' | None | None | +----------------------------+---------------------+---------------+
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip=ZIP_PASSWORD ファイルがZIPアーカイブの場合、与えられたパスワードを使って、その中のすべてのファイルを開きます(Python 2.6+が必要です
- oledir
https://github.com/decalage2/oletools/wiki/oledir
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
# oledir oBfsC4t10n2.xls oledir 0.54 - http://decalage.info/python/oletools OLE directory entries in file oBfsC4t10n2.xls: ----+------+-------+----------------------+-----+-----+-----+--------+------ id |Status|Type |Name |Left |Right|Child|1st Sect|Size ----+------+-------+----------------------+-----+-----+-----+--------+------ 0 |<Used>|Root |Root Entry |- |- |2 |FFFFFFFE|0 1 |<Used>|Stream |Workbook |- |- |- |0 |833805 2 |<Used>|Stream |\x05SummaryInformation|1 |3 |- |65D |4096 3 |<Used>|Stream |\x05DocumentSummaryInf|- |- |- |665 |4096 | | |ormation | | | | | ----+----------------------------+------+-------------------------------------- id |Name |Size |CLSID ----+----------------------------+------+-------------------------------------- 0 |Root Entry |- |00020820-0000-0000-C000-000000000046 | | |Microsoft Microsoft Excel 97-2003 | | |Worksheet (Excel.Sheet.8) 3 |\x05DocumentSummaryInformati|4096 | |on | | 2 |\x05SummaryInformation |4096 | 1 |Workbook |833805|
オプション(一部抜粋)※機械翻訳
オプション -r サブディレクトリ内のファイルを再帰的に検索します。 -z ZIP_PASSWORD, --zip=ZIP_PASSWORD ファイルがZIPアーカイブの場合、与えられたパスワードを使って、その中のすべてのファイルを開きます(Python 2.6+が必要です
- olemap
https://github.com/decalage2/oletools/wiki/olemap
※パスワード付きzipのまま中身のファイル解析が可能 (-z ZIP_PASSWORD)
# olemap oBfsC4t10n2.xls olemap 0.55 - http://decalage.info/python/oletools ------------------------------------------------------------------------------- FILE: oBfsC4t10n2.xls OLE HEADER: +------------------------+----------------+-----------------------------------+ |Attribute |Value |Description | +------------------------+----------------+-----------------------------------+ |OLE Signature (hex) |D0CF11E0A1B11AE1|Should be D0CF11E0A1B11AE1 | |Header CLSID | |Should be empty (0) | |Minor Version |003E |Should be 003E | |Major Version |0003 |Should be 3 or 4 | |Byte Order |FFFE |Should be FFFE (little endian) | |Sector Shift |0009 |Should be 0009 or 000C | |# of Dir Sectors |0 |Should be 0 if major version is 3 | |# of FAT Sectors |13 | | |First Dir Sector |0000067A |(hex) | |Transaction Sig Number |0 |Should be 0 | |MiniStream cutoff |4096 |Should be 4096 bytes | |First MiniFAT Sector |FFFFFFFE |(hex) | |# of MiniFAT Sectors |0 | | |First DIFAT Sector |FFFFFFFE |(hex) | |# of DIFAT Sectors |0 | | +------------------------+----------------+-----------------------------------+ CALCULATED ATTRIBUTES: +------------------------+----------------+-----------------------------------+ |Attribute |Value |Description | +------------------------+----------------+-----------------------------------+ |Sector Size (bytes) |512 |Should be 512 or 4096 bytes | |Actual File Size (bytes)|849920 |Real file size on disk | |Max File Size in FAT |852480.0 |Max file size covered by FAT | |Extra data beyond FAT |0 |Only if file is larger than FAT | | | |coverage | |Extra data offset in FAT|000CF800 |Offset of the 1st free sector at | | | |end of FAT | |Extra data size |0 |Size of data starting at the 1st | | | |free sector at end of FAT | +------------------------+----------------+-----------------------------------+ To display the FAT or MiniFAT structures, use options --fat or --minifat, and -h for help.
参考文献
Winitor
https://www.winitor.com/Interactive Online Malware Analysis Sandbox - ANY.RUN
https://app.any.run/
更新履歴
- 2018/07/21 新規作成
- 2020/03/19 表記を一部修正
- 2021/01/23 実際に使った時の結果表示例を追記
- 2021/01/27 一部書式崩れを修正
- 2021/01/31 「Malware-Analysis-Fundamentals-Files-Tools」についての記載を追加
- 2021/05/10 コマンド毎の github リンク、オプションの機械翻訳を追加