_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
EXCELntDonut は XLM(Excel 4.0)マクロジェネレータです。C# ソースコード(EXE)を入力として、メモリ上でコードを実行する XLM(Excel 4.0)マクロを出力します。XLM(Excel 4.0)マクロは .XLS ファイルに保存できます。
chmod +x install.sh
./install.sh
何がインストールされるのか?
EXCELntDonut を単なる Python スクリプトとして実行したい場合は、pandas と donut-shellcode というパッケージを含む仮想環境をセットアップする必要があります。さらに、apt-get で mono-complete をインストールし、python3 を使用して drive.py スクリプトを呼び出す必要があります。./install.sh バッシュスクリプトを使用することをお勧めしますが、選択はあなた次第です。
使用法:
$ EXCELntDonut -f exe_source.cs -r System.Windows.Forms.dll --sandbox --obfuscate
フラグ:
(必須)
-f C# ソースコードファイルへのパス(EXE のみ)
-r C# コードのコンパイルに必要な参照(Linux 上で mcs を使用してコンパイルする場合と同じもの)
(例: -r 'System.Management')
(オプション)
-o 出力ファイル名
--sandbox
基本的なサンドボックスチェックを実行します。新しい手法が発見されるたびに更新されます。
--obfuscate
基本的なマクロ難読化を実行します。
ペイロードを含む C# ファイル(たとえば、コバルトストライクビーコンペイロードを実行する Main メソッドを持つ EXE)を指定します。その C# ファイルは MCS を使用して、x86 と x64 の 2 つの .NET アセンブリにコンパイルされます。コンパイル後、Donut(x86 用)と CLRvoyance(x64 用)という優れたツールが各アセンブリを位置独立シェルコードに変換します。次に、すべてのヌルバイトが削除されます。XLM(Excel 4.0)マクロはヌルバイトと相性が悪いためです。ペイロードは、x86 の場合は 255 文字以下、x64 の場合は 10 文字以下の行に分割されます。
シェルコードが準備できたら、基本的なプロセスインジェクション関数(VirtualAlloc、WriteProcessMemory、CreateThread)と、ターゲットシステム上で実行するペイロード(x86 または x64)を決定するアーキテクチャチェック関数と組み合わされます。サンドボックスチェックや基本的な難読化を選択した場合、それらの関数がマクロを更新します。最後に、出力は CSV ファイル(.txt として保存)に配置されます。
EXCELntDonut から出力ファイルを取得したら、テキストエディタで出力ファイルを開き、その内容全体をコピーします(Ctrl-A、Ctrl-C)。Windows VM で Excel を開き、「Sheet 1」を右クリックして「挿入」を選択します。「MS Excel 4.0 マクロ」を選択します。セル A1 に移動し、EXCELntDonut の出力を貼り付けます。すべてのデータが 1 列に貼り付けられる可能性があります。データはセミコロン「;」で区切られています。「データ」タブに移動し、「区切り位置」をクリックします。「カンマやタブなどの区切り文字によってフィールドごとに区切られたデータ」を選択し、次の画面で「セミコロン」を選択して「完了」をクリックします。マクロは適切な列と行に広がります。
(注意:--obfuscate フラグを選択した場合、難読化ロジックの一部としてマクロがワークシートのランダムなセクションに移動されるため、実際のコードを見つけるにはかなり横にスクロールする必要があります)。
この時点で次の 2 つのことをお勧めします。
ファイルを保存し(.xls)、開いてみてください。ペイロードが自動的に実行されるはずです。
これらのチェックは、実際の脅威アクターがマルウェアで使用しているものに基づいています。
=FORMULA(D3&D23&D54&D23&D44,E45)
FORMULA 関数を使用すると、数式を別のセルに配置し、後で実行することができます。この場合、プロセスインジェクション命令を配置し、FORMULA 関数を使用して実際の関数を別のセルに配置して実行します。これにより、防御側が「VirtualAlloc」などの静的解析を行うのを防ぎます。
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET アセンブリを生成中。
warning CS8001: SDK パスを解決できませんでした
test.cs(2,14): error CS0234: 名前空間 `System' に型または名前空間名 `Management' が存在しません。アセンブリ参照が不足していませんか?
このエラーは、mono を使用したコンパイル中に参照アセンブリが不足していることを示している可能性が高いです。これを修正するには、-r フラグに該当の名前空間を渡してください。この場合、コマンドラインに -r 'System.Management' を追加します。新しいコマンドは次のようになります。
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r 'System.Management'
root@excelntdonut-test:/opt# EXCELntDonut -f test.cs -r System.Management
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET アセンブリを生成中。
warning CS8001: SDK パスを解決できませんでした
error CS0006: メタデータファイル `System.Management' が見つかりませんでした
[x] MCS を使用した x86 .NET アセンブリの生成中にエラーが発生しました。上記のエラーメッセージを確認してください。
このエラーは、install.sh バッシュスクリプトを使用せずに EXCELntDonut を実行した場合にのみ発生します。その場合は、mono-complete を手動でインストールする必要があります。これにより、関連する依存関係がダウンロードされます。次のように apt を使用してインストールできます。
apt-get install mono-complete
root@kali:~/Desktop# EXCELntDonut -f test.cs
_______ ______ _____ _ _ ____ _
| ____\ \/ / ___| ____| | _ __ | |_| _ \ ___ _ __ _ _| |_
| _| \ / | | _| | | | '_ \| __| | | |/ _ \| '_ \| | | | __|
| |___ / \ |___| |___| |___| | | | |_| |_| | (_) | | | | |_| | |_
|_____/_/\_\____|_____|_____|_| |_|\__|____/ \___/|_| |_|\__,_|\__|
by @JoeLeonJr (@FortyNorthSec)
[i] x86 .NET アセンブリを生成中。
error CS5001: プログラム `_excelntdonut_GJAoNuVPMcX.exe' に、エントリポイントとして適切な静的 `Main' メソッドが含まれていません
[x] MCS を使用した x86 .NET アセンブリの生成中にエラーが発生しました。上記のエラーメッセージを確認してください。
現時点では、EXCELntDonut は Main 関数内にペイロードがある C# ファイルのみをサポートしています。
@InQuest による Yara ルールの例:
非常にかくれたシートを探す
https://github.com/InQuest/yara-rules/blob/master/Excel_Hidden_Macro_Sheet.rule
Auto_Open 文字列を探す
https://github.com/Neo23x0/signature-base/blob/master/yara/general_officemacros.yar
OLEDUMP.py を使用して XLM ファイルをレビューする投稿が多数あります。次の記事を検討してください。
https://clickallthethings.wordpress.com/2020/04/06/covid-19-excel-4-0-macros-and-sandbox-detection/
Outflank(@outflanknl)の方々による素晴らしい研究がなければ、このツールは私たちの視野にすら入ってこなかったでしょう。このプロジェクトにおける洞察に対して @StanHacked に特に感謝します。また、このプロジェクトは Donut(@TheWover と @odzhan 作成)および関連する Python ライブラリ(@byt3bl33d3r 作成)なしでは実現できませんでした。同様に、Accenture のチームは CLRvoyance を作成し、Donut + XLM 4.0 マクロで解決できなかった x64 の問題を解決しました。最後に、XLM マクロを 64 ビット版の Excel と互換性を持たせるための優れた研究をしてくれた Cybereason の Philip Tsukerman に感謝します。
このツールの誤用について、私たちは責任を負いません。このツールは、C# ソースコードを XLM(Excel 4.0)マクロを使用してメモリにインジェクトする方法を示す、教育目的および許可されたテスト目的のために作成されました。このプロジェクトの最終的な目標は、(1) レッドチームに、実際の敵対者が現在使用しているものをエミュレートするための別のフィッシングペイロードオプションを提供すること、および (2) 防御側に分析と緩和策を構築するための参照枠を提供することです。この種のペイロードを迅速に生成するツールがなければ、防御側は実際に迫りくる脅威に適切に備えられないと考えています。責任を持って行動してください。
このフォルダにあるライセンスファイルを参照してください。このツールは、Donut と CLRvoyance という 2 つのオープンソースツールを組み込んでいることに注意してください。