Purgalicious VBA: VBA パージによるマクロ難読化

Module stream diagram news

悪意のある Office ドキュメントは、レッド チームから FIN グループ、APT まで、あらゆるタイプの攻撃者にとって好まれる手法であり続けています。このブログ投稿では、「VBA Purging」について説明します。これは、私たちが実際に観察することが増えている手法であり、 2020 年 2 月に Didier Stevens によって最初に公式に文書化されました。複合ファイル バイナリ形式 (CFBF) の Microsoft Office ドキュメントで VBA パージがどのように機能するかを説明し、いくつかの検出とハンティングの機会を共有し、Mandiant のレッド チームによって作成された新しいツールOfficePurgeを紹介します。

MS-OVBA ファイル形式

VBA Purging に入る前に、VBA マクロ (MS-OVBA) に関する Microsoft の仕様の特定のコンポーネントを理解することが重要です。 Microsoft Excel の「.xlsx」および Microsoft Word の「.docx」ドキュメントで使用される最新の Open Office XML (OOXML) 形式ではなく、CFBF ファイル形式を使用する Microsoft Office 97 ドキュメントの MS-OVBA に焦点を当てています。

MS-OVBA のファイル構造は、すべての VBA データを階層に格納します。階層は、さまざまな種類のストリームを含む構造化ストレージで構成されます。 Office ドキュメントの VBA コードは、 PerformanceCache (P コードとも呼ばれます) とCompressedSourceCodeの 2 つの部分で構成されるさまざまなモジュール ストリームに格納されます。 PerformanceCacheセクションは、コンパイルされた VBA コードを含むバイト配列です。 CompressedSourceCodeセクションには、Microsoft 独自のアルゴリズムで圧縮された VBA ソース コードが含まれています。 2 つのセクション間の境界は、 dirストリームに格納されているMODULEOFFSETによって決定されます。モジュール ストリームの図を図 1 に示します。

Module stream diagram
図 1: モジュール ストリーム図

VBA マクロがドキュメントに追加されると、VBA エンジンはコンパイルされたバージョンを関連するモジュール ストリームのPerformanceCacheセクションに保存して、パフォーマンスを向上させます。ただし、Office アプリケーションは、そのバージョンとアーキテクチャが元の VBA コードのコンパイルに使用されたものと一致する場合にのみ、 PerformanceCacheにアクセスします。このバージョンおよび実装情報は、 _VBA_PROJECT および __SRP__#ストリームに格納されます。バージョンが一致しない場合は、圧縮されたソース コードが解凍され、コンパイルされ、代わりに実行されます。

VBA パージと VBA ストンピング

2018 年、ウォルマートのセキュリティ チームによる調査により、「 VBA Stomping 」として知られる手法が広く一般に知られるようになりました。 2016 年に Vesselin Bontchev 博士によって最初に特定されたこの手法により、攻撃者は圧縮された VBA コードを Office ドキュメントから削除し、AV エンジンが検出に依存するようになった VBA キーワードの多くを使わずに悪意のあるマクロを実行することができます。 VBA の実際の使用例については、「 STOMP 2 Dis: Brilliance in the (Visual) Basics 」を参照してください。

VBA ストンピングは、モジュール ストリームが解釈される方法を利用して、悪意のあるCompressedSourceCodeを悪意のない VBA ソース コードと交換し、 PerformanceCacheを手付かずのままにします。ただし、この手法の成功は Office のバージョンに依存するため、攻撃者はターゲットに対して追加の偵察を行い、被害者の展開された Office のバージョンを認識する必要があることを意味します。

VBA パージは、モジュール ストリームを逆の方法で変更します。 CompressedSourceCodeを変更する代わりに、VBA パージはモジュール ストリームと_VBA_PROJECT ストリームからPerformanceCacheデータを完全に削除し、 MODULEOFFSETの値を 0 に変更し、すべての SRP ストリームを削除します ( _VBA_PROJECTSRPストリームにはバージョン依存のモジュール ストリームにPerformanceCacheがない場合に実行時エラーが発生するPerformanceCacheデータ)。これにより、多くの AV エンジンと YARA ルールが検出に依存しているPerformanceCacheで通常検出される文字列が削除されます。削除されると、攻撃者はより標準的な方法論を使用して、検出されることなく疑わしい機能 (つまり、 CreateObject ) を実行できるようになります。

図 2 は、 oledumpを使用して抽出された、通常のドキュメントとパージされたドキュメントの OLE ストリームを示しています。元のドキュメントでは、Module1 PerformanceCacheは 1291 バイトですが、VBA パージされたドキュメントでは 0 バイトです。パージされたドキュメントにはSRPストリームがなく、 _VBA_PROJECTストリームは 7 バイトに縮小されています。

oledump を使用して VBA パージされたドキュメントを分析する
図 2: VBA でパージされたドキュメントを oledump で分析する

VBA パージの有効性のテスト

Mandiant の Red Team は、この手法をテストするためにOfficePurgeと呼ばれるコマンド ライン C# ツールを作成しました。 OfficePurge は、CFBF ファイル形式に従う Microsoft Office Word、Excel、および Publisher ドキュメントをサポートします。次の例では、OfficePurge とパブリック ツールキットUnicornの VBA ペイロードを使用して、Base64 でエンコードされた PowerShell ペイロードを含む Microsoft Office Word ドキュメントを VBA パージする効果をテストしました (図 3)。

Unicorn で生成されたマクロ ペイロード
図 3: Unicorn で生成されたマクロ ペイロード

元の Word ドキュメントの文字列出力 (図 4) は、Unicorn の Base64 でエンコードされた PowerShell ペイロードを示しています。これは、多くのセキュリティ製品によって検出されます。一方、VBA でパージされたドキュメントの出力には、Base64 でエンコードされたペイロードが完全には表示されません。これは、 PerformanceCacheが削除されているためです。 CompressedSourceCodeには引き続き Base64 でエンコードされたペイロードが含まれていますが、Microsoft のカスタム圧縮アルゴリズムによって文字列が分割されるため、静的分析での検出が難しくなります。

パージされたドキュメントとパージされていないドキュメントの文字列出力
図 4: パージされたドキュメントとパージされていないドキュメントの文字列出力

両方のドキュメントは、さまざまな製品の検出機能をテストするためにオンライン サンドボックスに送信されました。元のドキュメント(36/60)の VirusTotal の検出率は、VBA パージ後( 12/61) に 67% 低下しました。また、VirusTotal は、パージされていないドキュメントを「create-ole」、「doc」、および「macros」に分類しましたが、パージされたドキュメントは「doc」のみに分類されました。

パージされていない Word ドキュメントの VirusTotal 検出結果
図 5: パージされていない Word ドキュメントの VirusTotal 検出結果
パージされた Word 文書の VirusTotal 検出結果
図 6: パージされた Word ドキュメントの VirusTotal 検出結果

検出とハンティングの機会

OfficePurge を使用すると、コンパイルされた VBA コードをすばやく消去し、パブリック サンドボックスでのセキュリティ製品の検出を減らすことができますが、そこでやめるのはなぜでしょうか?このテスト データを使用して、次のステップは、YARA ルールなどの形式で条件付き検出ロジックを構築することです。これにより、VBA で削除されたドキュメントを識別し、以前は検出されなかった悪意のあるドキュメントを探すことができます。 OfficePurge GitHub リポジトリの “sample-data” フォルダーの下に、サポートされているファイルの種類ごとに元のドキュメントと削除されたドキュメントを追加し、calc.exe を生成するマクロを追加しました。 SHA256 ハッシュは、この投稿の最後に含まれています。

前述のように、この手法には_VBA_PROJECTストリームからPerformanceCacheデータを削除することが含まれます。 MSDN のドキュメントによると、 _VBA_PROJECTストリームの最小の長さは、ストリーム ヘッダーの必須フィールドに収まるように 7 バイトです。次の YARA ルールは、7 バイトの_VBA_PROJECTストリームを持つ CFBF ファイルを検索します。

ルール FEYE_OLE_VBAPurged_1 {
メタ:
著者=「アリッサ・ラーマン(@ramen0x3f)」
description = “このファイルには、クリアされた _VBA_PROJECT ストリームがあります。これは、マクロが埋め込まれた Office ファイルから p-code (PerformanceCache データ) を削除する手法である VBA パージの証拠です。
文字列:
$vba_proj = { 5F 00 56 00 42 00 41 00 5F 00 50 00 52 00 4F 00 4A 00 45 00 43 00 54 00 00 00 00 00 00 00 00 00 }
調子:
uint32(0) == 0xe011cfd0 および ( uint32(@vba_proj[1] + 0x78) == 0x07 )
}

VirusTotal でこのロジックを使用して検索すると、多数の悪意のあるドキュメントが明らかになります。これは、これが実際に広く普及しており、攻撃者によって使用されていることを意味します。このルールは、 9fd864e578d8bb985cf71a24089f5e2f ( HornetSecurity ) など、公開されている VBA パージングの例を特定する必要があります。ただし、誤検知を特定することもあります。以前にDidier Stevensによって特定されたように、EPPlus などの一部のパブリック ライブラリは、 PerformanceCacheデータのない無害なドキュメントを生成し、パージされたように見える場合があります。

この規則のもう 1 つの重要な制限は、 _VBA_PROJECTストリーム データを完全に削除する必要がないことです。したがって、公開されているこの手法のすべての例でストリーム サイズは 7 ですが、正確に 7 である必要はありません。

これに対する 1 つの解決策は、ドキュメントのマクロの圧縮バージョンとコンパイル バージョンを比較し、予期しないバリエーションを探すことです。別の潜在的なオプションは、 _VBA_PROJECTストリームでキーワードまたはバイトを検索する YARA ルールです。これは、p-code が有効な場合に表示されます。

しかし、最初は簡単な方法で OfficePurge 内の異常を探しましょう。コード内に、 _VBA_PROJECTストリームを静的ヘッダーで上書きするセクションがあります。

// _VBA_PROJECT ストリームのパフォーマンス キャッシュを削除します。ストリーム全体を _VBA_PROJECT ヘッダーに置き換えます。
byte[] data = Utils.HexToByte(“CC-61-FF-FF-00-00-00”);

少しグーグルで調べると、このヘッダーがMicrosoft の仕様に基づいて作成されたことがわかります。しかし、パージされたドキュメントとパージされていないドキュメントを比較すると、ヘッダーは実際の仕様と実際には異なっているように見えます (図 7)。

パージされたドキュメントとパージされていないドキュメントの比較
図 7: パージされたドキュメントとパージされていないドキュメントの比較

このヘッダーは、ドキュメントが悪意のあるものであるか、OfficePurge で作成されたものであることを必ずしも証明するものではありませんが、ドキュメントがプログラムによって作成されたか、Office 製品を使用して作成されたかを示す良い指標になる可能性があります。このような異常がある場合、次のようなルールの構築を開始できます。このルールは、「小さい」 _VBA_PROJECTストリームとこの疑わしいストリーム ヘッダーを含むドキュメントを検索します。

ルール FEYE_OLE_VBAPurged_2 {
メタ:
author = “Michael Bailey (@mykill)、Jonell Baltazar、Alyssa Rahman (@ramen0x3f)、Joseph Reyes”
description = “このファイルには疑わしい _VBA_PROJECT ヘッダーと小さな _VBA_PROJECT ストリームが含まれています。これは、VBA パージ ツール OfficePurge またはツールによって生成されたドキュメントの証拠である可能性があります。”
文字列:
$vba_proj = { 5F 00 56 00 42 00 41 00 5F 00 50 00 52 00 4F 00 4A 00 45 00 43 00 54 00 00 00 00 00 00 00 00 00 }
$cc61 = {CC 61 FF FF 00 00 00}
調子:
uint32(0) == 0xe011cfd0 および ( uint32(@vba_proj[1] + 0x78) >= 0x07 ) および ( uint32(@vba_proj[1] + 0x78) < 0xff ) および $cc61
}

ここで共有されている 2 つのルールを使用して検索すると、VBA パージ、または少なくともある種の自動ドキュメント生成を利用する、さまざまな種類の脅威アクターとマルウェアが明らかになります。 VirusTotal では、このルールによって捕捉された多数の Emotet ペイロードが見られる可能性があります。これは、悪意のある電子メールの添付ファイルに大きく依存していることを考えると理解できます。私たちが観察したもう 1 つの上位犯罪者は、AgentTesla でした。

これらのルールはどちらも問題のないドキュメントを検出するため、運用環境には対応していません。ただし、より手動の脅威ハンティングの「弱いシグナル」として役立つ可能性があります。多くの静的検出エンジンは、VBA パージ手法を特定する際の精度に苦労する可能性があります。 FireEye の MVX エンジンで使用されるような動的分析技術は、VBA がパージされた場合でも、悪意のあるドキュメントを適切に爆発させ、検出されます。

結論

企業が Office ドキュメントを使用している限り、攻撃者は悪意のあるマクロをドキュメントに密輸しようとします。 VBA パージは、攻撃者が防御側を回避するための新しい方法を継続的に発明している最近の例です。このブログ投稿で説明されているアーティファクトは、VBA パージを検出するための出発点として役立つはずです。共有されているツールとインジケーターが、悪意のある Office ドキュメントのその他の異常を探すのに役立つことを願っています。今日OfficePurgeをチェックしてください!

侵害の痕跡

ファイル名

説明

SHA256 ハッシュ

test.doc

VBAパージなしのWord文書のUnicornマクロペイロード

f4431f02fe1e624fdb7bf2243bb72f1899d7eccb1ed7b2b42ed86e001e8bff28

test2.doc

VBA パージを使用した Word 文書のユニコーン マクロ ペイロード

98bd119f928e8db4ed45f5426f2c35c5f6d6ccc38af029e7ab4b9cfcc1447c53

エクセル計算.xls

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

de6583d338a8061bb1fc82687c8f5bff9a36ba1e2a87172e696ffaeca32567af

excel_calc_PURTED.xls

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

914a6cf78fe98e80b1dee87347adbc8f8b37a1dfe672aa5196885daa447e9e73

publisher_calc.pub

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

4bce7c675edde20a3357bc1d0f25b53838ab0b13824ab7a5bbc09b995b7c832f

publisher_calc_PURTED.pub

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

36bdfaaf3ea228844507b1129b6927e1e69a2cd5e8af99d507121b1485d85e1e

word_calc.doc

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

23fa4b77c578470c1635fe20868591f07662b998716c51fbb53d78189c06154f

word_calc_PURGE.doc

OfficePurgeの「サンプルデータフォルダ」内のサンプル文書

a7eac98b3477fc97ccfe94f1419a859061ca944dc95372265e922992bd551529

参照: https://www.mandiant.com/resources/blog/purgalicious-vba-macro-obfuscation-with-vba-purging

Comments

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