BOF RunPEはCobalt Strikeのビーコンオブジェクトファイルで、ビーコンプロセス内でPEファイルをメモリ内完全に実行します。従来のfork&runと異なり、子プロセスは生成されず、コンソールも作成されず、パイプも使用されません。すべての出力はIATフッキング経由でキャプチャされ、ビーコンコンソールにリダイレクトされます。
主な特徴
- プロセス作成なし:PEはビーコンプロセス内で実行される
- コンソール/パイプなし:出力は
printf/WriteConsoleフック経由でキャプチャされる - 複数の割り当て方法:ヒープ、VirtualAlloc、モジュール踏みつぶし
- プロキシロード:タイマーキュー、RegisterWait、または直接呼び出し
- Ntdllアンフック:ディスクからの新しいコピーのオプション
- RWX:RWXでメモリを割り当てるオプション
- スレッド開始スプーフィング:RIP ハイジャックを備えた正当な開始アドレス
回避技術
| 技術 | バイパス |
|---|---|
| 間接的なシステムコール | ユーザーランドAPIフック(EDR/AV) |
| Draugrスタックスプーフィング | コールスタック検査 |
| スレッド開始スプーフィング | スレッド開始アドレス分析 |
| モジュール踏みつぶし | バッキングなしメモリ検出 |
| プライベートヒープ割り当て | VirtualAllocモニタリング |
| Ntdllアンフック | ディスク上のNtdllを使用してメモリ内ntdllを上書き |
| IATフック(パイプなし) | 名前付きパイプモニタリング |
検出ベクトル
カーネルテレメトリ(ETW-TI)
NtGetContextThread / NtSetContextThread:
- 中断されたスレッド上のスレッドコンテキスト操作、その後再開
メモリ操作:
- NtAllocateMemory割り当て、RWXで実行可能(設定に依存)
- NtProtectVirtualMemoryトランジション(RW → RX)
- ヒープ領域の実行可能メモリは疑わしい(設定に依存)
- モジュール踏みつぶしはセクションハッシュの不一致を経由して検出可能(設定に依存)
動作指標
- 中断されたスレッド作成、コンテキスト取得、RIPの値を変更
- ヒープメモリが実行可能とマークされた(メモリアロケータがヒープの場合)
DONT_RESOLVE_DLL_REFERENCESでロードされたDLL(メモリアロケータがモジュール踏みつぶしの場合)- Ntdll .textセクション変更(アンフック有効の場合)
ダウンロード&使用
翻訳元: https://meterpreter.org/bof-runpe-cobalt-strike-in-memory-pe-execution-evasion/
ソース: meterpreter.org