OOXML ドキュメントの埋め込みコンテンツの検出

Hex dump of the first local file header for example.docx news

Advanced Practices では、悪意のあるアクティビティを発見し、時間の経過とともに敵を追跡する新しい方法を常に探しています。本日は、Microsoft Office ドキュメント、特にOffice Open XML (OOXML)ファイル形式のドキュメントを検出してクラスタ化するために使用する手法を共有します。さらに、アナリストとディフェンダーがこの手法を使用して YARA ルールを自動的に生成できるツールをリリースしています。

OOXML ファイル形式

Microsoft Office 2007 以降、Excel、PowerPoint、および Word ドキュメントの既定のファイル形式は、オブジェクトのリンクと埋め込み (OLE) ベースの形式から OOXML に切り替わりました。現時点で理解しておくべき重要な点は、OOXML ドキュメントは、ZIP アーカイブにパッケージ化されたフォルダーとファイルの集まりにすぎないということです。このブログ投稿が書かれている Word 文書を見てみましょう (図 1)。たとえば、次のようになります。

➜ ファイル example.docx
example.docx: Microsoft Word 2007+

➜ unzip -v example.docx
アーカイブ: example.docx

長さ メソッド サイズ Cmpr 日付 時間 CRC-32 名前

——– —— ——- —- ———- —– ——– — —

1445 Defl:S 358 75% 01-01-1980 00:00 576f9132 [Content_Types].xml

590 Defl:S 239 60% 01-01-1980 00:00 b71a911e _rels/.rels

1559 Defl:S 407 74% 01-01-1980 00:00 33ce17ac ワード/_rels/document.xml.rels

10861 Defl:S 2480 77% 01-01-1980 00:00 f0af2147 word/document.xml

8393 Defl:S 1746 79% 01-01-1980 00:00 9867f4b6 単語/テーマ/theme1.xml

4725 Defl:S 1416 70% 01-01-1980 00:00 718205c5 word/settings.xml

655 Defl:S 295 55% 01-01-1980 00:00 bf8dd4bd ワード/webSettings.xml

755 Defl:S 367 51% 01-01-1980 00:00 5bf1cf49 docProps/core.xml

991 Defl:S 476 52% 01-01-1980 00:00 bad67489 docProps/app.xml

30308 Defl:S 3104 90% 01-01-1980 00:00 ce0f21cd ワード/styles.xml

7781 Defl:S 952 88% 01-01-1980 00:00 9f45bf02 word/numbering.xml

2230 Defl:S 559 75% 01-01-1980 00:00 63baaf8c ワード/fontTable.xml

——– ——- — ——-

70293 12399 82% 12 ファイル

図 1: example.docx の unzip -v 出力

unzip コマンドを使用しましたが、実際にはアーカイブを解凍していません。 -v オプションによって提供される出力は、圧縮ファイルに関する豊富な情報を含むZIP ローカル ファイル ヘッダーから取得されます。特に興味深いのは、CRC-32 値です。

巡回冗長検査 (CRC)は、データのエラーや意図しない変更を検出するために設計されたアルゴリズムです。システムは、データの完全性を保証する簡単な方法として、データの転送または変換の前後に CRC 値を計算できるという考え方です。 ZIP アーカイブの場合、CRC-32 値は、解凍されたファイルが圧縮前と同じであることを確認します。これは素晴らしいことですが、他のユースケースにも対応できます。

検出

エラー検出のことは忘れてください。 ZIP CRC-32 値は、本質的に圧縮されていないファイルの小さなハッシュであり、そのハッシュよりもファイルを識別する良い方法はありますか? CRC-32 の衝突の可能性は、SHA-256 や MD5 などの他のアルゴリズムよりも大幅に高くなりますが、ファイル名 (または拡張子) やサイズなどの追加のメタデータと組み合わせて誤検知を減らすことができます。

前の例の最初のローカル ファイル ヘッダーの 16 進ダンプを次に示します (図 2)。

Hex dump of the first local file header for example.docx
図 2: example.docx の最初のローカル ファイル ヘッダーの 16 進ダンプ

CRC-32uncompressed file size 、およびfile nameフィールドを使用すると、このエントリの YARA ルールは次のように記述できます。

ルール content_types {
メタ:
author = “アーロン スティーブンス <aaron.stephens@mandiant.com>”
description = “OOXML ルールの例。”

文字列:
$crc = { 32 91 6f 57 }
$name = “[Content_Types].xml”
$size = { a5 05 00 00 }

調子:
@crc[1] の $size + 8 および @crc[1] の $name + 16
}

注:数値フィールドはリトルエンディアンで保存されます。

Advanced Practices では、この手法を使用して、同じ埋め込みファイルを含む類似のドキュメントを長期間にわたって検索します。以下に、実際の例をいくつか示します。

ドキュメント: 397ba1d0601558dfe34cd5aafaedd18e
ファイル: 0dc39af4899f6aa0a8d29426aba59314 (wordmediaimage1.png)
グループ: UNC1130 、UNC1837、UNC1965

ルール png_397ba1d0601558dfe34cd5aafaedd18e {
メタ:
author = “アーロン スティーブンス <aaron.stephens@mandiant.com>”
description = “OOXML ドキュメント内の PNG。”

文字列:
$crc = {f8158b40}
$ext = “.png”
$ufs = {b42c0000}

調子:
$ufs @crc[1] + 8 および $ext @crc[1] + uint16(@crc[1] + 12) + 16 – 4
}

このルールは、図 3 に示す特定の PNG 画像を含む OOXML ドキュメントを検出します。

フィッシング文書に埋め込まれた PNG
図 3: フィッシング文書に埋め込まれた PNG

図 3 は、LATEOP をドロップするいくつかのドキュメントで見つかり、北朝鮮政府が支援する脅威アクターであるUNC1130などのグループに起因するとされています。

ドキュメント: 252227b8701d45deb0cc6b0edad98836
ファイル: 3bdfaf98d820a1d8536625b9efd3bb14 ([コンテンツ タイプ].xml)
グループ: FIN7

ルールxml_252227b8701d45deb0cc6b0edad98836 {
メタ:
author = “アーロン スティーブンス <aaron.stephens@mandiant.com>”
description = “OOXML ドキュメントの [Content_Types].xml。”

文字列:
$crc = {8cf0d220}
$name = “[Content_Types].xml”
$ufs = {9b060000}

調子:
@crc[1] + 8 の $ufs および @crc[1] + 16 の $name
}

このルールは、特定の [Content_Types].xml ファイルを検出します。このファイルは、図 4 に (フォーマットされて) 示されています。

フォーマットされた [Content_Types].xml ファイル
図 4: フォーマットされた [Content_Types].xml ファイル

このファイルは、OOXML パッケージのさまざまな部分をそれぞれのコンテンツ タイプにマップします。パーツとタイプの組み合わせが十分にユニークな場合、[Content_Types].xml ファイルは類似した OOXML ドキュメントを見つける優れた方法となります。この特定の例は、複数の FIN7 GRIFFON サンプルに見られます。

ツーリング

最後になりましたが、 apooxmlを紹介します。これは、このような YARA ルールをすばやく簡単に生成するために使用できる Python ツールです。仕組みは次のとおりです。

python3 apooxml.py -h
使用法: apooxml.py [-h] [-a 作成者] [-n 名前] [-o OUT] サンプル

OOXML ドキュメントの YARA ルールを生成します。

位置引数:
YARA ルールを生成するサンプル OOXML ドキュメント。

オプションの引数:
-h, –help このヘルプ メッセージを表示して終了します
-a AUTHOR, –author AUTHOR
YARAルール作者。
-n NAME, –name NAME YARA ルール名。
-o OUT, –out OUT YARA ルールファイル名。

➜ python3 apooxml.py -o ‘example.yara’ 397ba1d0601558dfe34cd5aafaedd18e
1. [Content_Types].xml 1980-01-01 00:00:00 14506c9d 1613
2. _rels/.rels 1980-01-01 00:00:00 b71a911e 590
3. word/_rels/document.xml.rels 1980-01-01 00:00:00 ab5e83b7 1207
4. word/document.xml 1980-01-01 00:00:00 44c9bf93 2692
5. word/_rels/vbaProject.bin.rels 1980-01-01 00:00:00 ef601408 277
6. word/vbaProject.bin 1980-01-01 00:00:00 ab54dacf 10752
7. ワード/メディア/image1.png 1980-01-01 00:00:00 408b15f8 11444
8. 単語/テーマ/theme1.xml 1980-01-01 00:00:00 4276c88b 7088
9. word/settings.xml 1980-01-01 00:00:00 17044d98 2750
10. word/vbaData.xml 1980-01-01 00:00:00 9209afe1 1292
11. word/fontTable.xml 1980-01-01 00:00:00 37e3715b 960
12. word/stylesWithEffects.xml 1980-01-01 00:00:00 c883d0b1 16755
13. docProps/app.xml 1980-01-01 00:00:00 3cc6382c 982
14. ワード/webSettings.xml 1980-01-01 00:00:00 4e16a017 428
15. docProps/core.xml 1980-01-01 00:00:00 8cef183c 643
16. word/styles.xml 1980-01-01 00:00:00 1f9b9145 16002

目的のエントリに対応する番号を入力してください: 7

example.yara に YARA ルールを書きました。

猫 example.yara
ルールooxml_png_crc_397ba1d0601558dfe34cd5aafaedd18e {
メタ:
著者 = “apooxml”
description = “apooxml によって生成されます。”
reference_md5 = “397ba1d0601558dfe34cd5aafaedd18e”

文字列:
$crc = {f8158b40}
$ext = “.png”
$ufs = {b42c0000}

調子:
$ufs @crc[1] + 8 および $ext @crc[1] + uint16(@crc[1] + 12) + 16 – 4
}

詳細については、 GitHub のリポジトリを確認してください。

参照: https://www.mandiant.com/resources/blog/detecting-embedded-content-in-ooxml-documents

Comments

タイトルとURLをコピーしました