
Raphael Mudgeのページストリーミング技術とモジュラーコールゲート(Draugr)を組み合わせた、Crystal Palaceで構築されたCobalt Strike用のPoC UDRL
Eden loaderは、Crystal Palaceを使用して構築されたCobalt Strike用のPoC UDRLであり、Raphael Mudgeのページストリーミング技術とモジュラコールゲート(現在はSleepmask-VS DraugrコールゲートBOFのPICバージョン)を組み合わせています。
Eden loaderの目的は次のとおりです:
Eden loaderの詳細については、付属のブログをご覧ください。
注記: Edenの目的は、Crystal Palaceを使用して異なる「実行単位」(すなわち機能)を組み合わせてカスタムローダーを作成するアイデアを示すことです。完全に「回避型」のローダーを意図しておらず、そのため設計上、基本的なOPSEC機能がいくつか欠けています。例えば、RWXメモリを使用し、Beaconのヒープメモリを追跡/マスクしないため、このようなYARAシグネチャに対して脆弱です。
注記: このクイックスタートガイドは、Crystal Palaceをダウンロード/ビルドし、以下の手順を完了して開発環境を設定していることを前提としています。
stage {
set sleep_mask "false";
}
WSLターミナルを開き、Eden loaderをビルドします:make clean; make。crystalpalace.jarをCobalt Strikeクライアントディレクトリにコピーします。eden.cnaをCobalt Strikeクライアントにロードします。[14:55:55] [*] Generating Payload: HTTP -- Type: HTTP -- Arch: x64 -- Exit Function: Thread -- System Call: None -- HTTP Library: wininet
[14:55:56] [EDEN] Parsing C:\Users\wb\Desktop\eden\eden.spec...
[14:55:56] [EDEN] Applying eden ldr spec...
[14:55:56] [EDEN] Payload Size: 387060 bytes
[14:55:56] [*] Using user modified reflective DLL! DLLName=resources/beacon.x64.rl0k.dll Arch=x64
注記: EdenはHTTP(S)、DNS、およびPivot Beaconsをサポートしています。
リリース時点のCrystal Palaceの制限の一つは、mingwでビルドされたオブジェクトファイルのみをサポートしていることです。MSVCやClangでビルドされたCOFFを使用しようとすると、通常は再配置エラーが発生します。mingwはpdbファイルを直接サポートしていないため、複雑なWindowsトレードクラフトを作成する際のデバッグが難しい場合があり、これは不便です。ただし、Makefileに-gオプションを追加することで、実行可能ビルドにデバッグ情報を埋め込むことができます。これにより、WinDbgでコードをステップ実行できるようになります。このプロセスの詳細については、Rastamouseによる次のブログを読むことをお勧めします。
このリポジトリは上記のアプローチを使用して、Draugr(draugr.x64.exe)とページストリーミングコード(guardexec.x64.exe)のデバッグビルドをデフォルトでビルドします。Draugrデバッグビルドには依存関係がないため、そのままビルドできますが、ページストリーミング/IATフックコードをステップ実行/デバッグする場合は、以下の手順に従う必要があります:
1. ローダーなしでBeaconをエクスポート:
debug/export_beacon_with_no_ldr.cnaをCSクライアントにロードし、ステージレスなraw x64 (HTTP) Beaconを/eden/debug/ディレクトリにエクスポートします。これにより、リフレクティブローダーなしのBeacon DLLがエクスポートされ、guardexecエントリポイントをモックするために使用できます。$ xxd -i ./beacon_x64.bin > debug_beacon.h2. Crystal PalaceからDraugr PICスタブをエクスポート:
$ ./piclink /<path>/eden/debug/draugr.spec x64 /<path>/eden/debug/draugr.binを実行してCrystal Palaceを実行する必要があります。これにより、Crystal Palaceを使用してDraugr PICスタブのみが出力され、guardexecエントリポイントのモックに使用できます。$ xxd -i ./draugr.bin > debug_druagr.h3. WinDbgでデバッグを開始
make clean;makeWinDbgを開き、実行可能ファイル(/eden/bin/draugr.exeまたは/eden/bin/guardexec.exe)を起動するを選択します。ソースファイルを開くを選択し、該当する.cファイル(例:ページストリーミングコードをデバッグする場合はguardexec.c)を選択します。注記: ローダー用のデバッグ実行可能ファイルはありません。なぜなら、暗号化DLLとそのキーのようなものに対してCrystal Palaceにデバッグペイロードをエクスポートさせる明白な方法がないからです。そのため、モックの「暗号化」PICバッファを渡すことは非自明になります。
Eden loaderは主に、異なる**「機能」**を組み合わせて新しいローダーを作成することでCrystal Palaceの力を示すことを目的としています。このアイデアは、このリポジトリで実現されているよりもはるかに進めることができます(例:COFFモジュール(ガードレール、コールゲート、スリープ難読化など)を介して完全にカスタマイズ可能な「静的」PICローダー)。
Eden loaderは明示的にDraugrのPICバージョンを使用しており、Beaconのライフサイクルのすべての呼び出しを偽装できる(すなわち、リフレクティブロードプロセスで使用されるVirtualAlloc/LoadLibrary呼び出し)。場合によっては、これは過剰である可能性があります(例:EDRがLoadLibraryへのバックなし呼び出しを気にしない場合など)。その場合、はるかにシンプルなDraugrのPICO(=='BOF')相当に変更することができます。
Eden loaderは意図的に「コールゲート」をローダーから切り離すよう努めています。これはモジュール性のための設計であり、BeaconGate/コールゲートBOFを交換できるという考えです。したがって、Draugrコールゲートコードはすべて独自のオブジェクトファイルに自己完結しています。これを別の「機能」に置き換えることで、EdenのTTPを大幅に変更できます。
Eden loaderは意図的にCrystal Palaceのより最近の機能を使用していません。例として、mergelibはCrystal Palaceの共有ライブラリLibTCGで使用できます。ただし、これはコードをデバッグする機能を失うことを意味します。
ページストリーム技術は、特定のコマンドでBeaconのパフォーマンスに影響を与える可能性があります(例:デフォルトでは、4つの可視ページが構成されている場合、プロセスインジェクションに**約1分(!)**かかります)。guardexec.hの#define MAXVISIBLEを増やすことで、ほとんどの問題を解決できます(Edenのデフォルト値は6です)。一般的な参考情報として、ページストリーミングはプロセスインジェクション技術に問題を引き起こす可能性があります(特にタイミングに依存する場合)。
https://aff-wg.org/2025/03/13/the-security-conversation/
Eden loaderはCrystal Palace(https://tradecraftgarden.org/crystalpalace.html)を使用して構築されており、以下のプロジェクトを活用しています:
最後に、開発中に役立ったCrystal Palaceに関するブログを執筆してくれた@rastamouseに感謝します。