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)。
CRC-32 、 uncompressed file size 、およびfile nameフィールドを使用すると、このエントリの YARA ルールは次のように記述できます。
ルール content_types { 文字列: 調子: |
注:数値フィールドはリトルエンディアンで保存されます。
例
Advanced Practices では、この手法を使用して、同じ埋め込みファイルを含む類似のドキュメントを長期間にわたって検索します。以下に、実際の例をいくつか示します。
ドキュメント: 397ba1d0601558dfe34cd5aafaedd18e
ファイル: 0dc39af4899f6aa0a8d29426aba59314 (wordmediaimage1.png)
グループ: UNC1130 、UNC1837、UNC1965
ルール png_397ba1d0601558dfe34cd5aafaedd18e { 文字列: 調子: |
このルールは、図 3 に示す特定の PNG 画像を含む OOXML ドキュメントを検出します。
図 3 は、LATEOP をドロップするいくつかのドキュメントで見つかり、北朝鮮政府が支援する脅威アクターであるUNC1130などのグループに起因するとされています。
ドキュメント: 252227b8701d45deb0cc6b0edad98836
ファイル: 3bdfaf98d820a1d8536625b9efd3bb14 ([コンテンツ タイプ].xml)
グループ: FIN7
ルールxml_252227b8701d45deb0cc6b0edad98836 { 文字列: 調子: |
このルールは、特定の [Content_Types].xml ファイルを検出します。このファイルは、図 4 に (フォーマットされて) 示されています。
このファイルは、OOXML パッケージのさまざまな部分をそれぞれのコンテンツ タイプにマップします。パーツとタイプの組み合わせが十分にユニークな場合、[Content_Types].xml ファイルは類似した OOXML ドキュメントを見つける優れた方法となります。この特定の例は、複数の FIN7 GRIFFON サンプルに見られます。
ツーリング
最後になりましたが、 apooxmlを紹介します。これは、このような YARA ルールをすばやく簡単に生成するために使用できる Python ツールです。仕組みは次のとおりです。
➜ python3 apooxml.py -h OOXML ドキュメントの YARA ルールを生成します。 位置引数: オプションの引数: ➜ python3 apooxml.py -o ‘example.yara’ 397ba1d0601558dfe34cd5aafaedd18e 目的のエントリに対応する番号を入力してください: 7 example.yara に YARA ルールを書きました。 ➜猫 example.yara 文字列: 調子: |
詳細については、 GitHub のリポジトリを確認してください。
参照: https://www.mandiant.com/resources/blog/detecting-embedded-content-in-ooxml-documents
Comments