ビーコンの幽霊:BOF RunPEによるインメモリPE実行の習得

Image

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