
Windows Debugging APIを使用したシェルコードインジェクション
DbgNexum は、Windows デバッグ API と共有メモリ (ファイルマッピング) を使用してシェルコードを注入する Proof-of-Concept です。リモートメモリへの直接の書き込みや読み取りを回避し、代わりにコンテキスト操作を利用してターゲットプロセスにペイロードをロードおよび実行させます。
インジェクターはターゲットプロセスにアタッチし、中断されたスレッドを作成します。デバッグループを通じて、特定のリターンアドレスで実行をトラップするハードウェアブレークポイントを設定します。各トラップで、インジェクターは CPU レジスタを変更して関数呼び出しを模倣し、ターゲットプロセス内部で一連の Windows API 関数呼び出しを調整します。
この README を書いている時点では、MDE および Elastic に対してこの手法をテストしましたが、どちらも検出しませんでした。
WriteProcessMemory / VirtualAllocEx は使用しません: ペイロードは CreateFileMapping と MapViewOfFile を介して転送されます。ReadProcessMemory は使用しません: この手法はスレッドコンテキストからすべての重要な情報を取得します。PoC は "calc.exe" を起動する XOR された msfvenom シェルコードを使用しています。ただし、ご自身のシェルコードを使用してください。
shellcode.h にシェルコード (および XOR キー) を含めます。DbgNexum.exe <PID>
出力例:
[i] Section 'MZ' created and shellcode copied
[+] Bait thread created. Setting HWBP on FileTimeToSystemTime
[i] Execution Redirected:
|-> [0] Preparation & anchoring stack
|-> [1] Setting HWBP & buffer alloc
|-> [2] Copying File-Mapping name
|-> [3] Zeroing stack slot
|-> [4] Opening handle to named file mapping
|-> [5] Mapping payload into mem. with exec. perm.
|-> [6] Cleanup & shellcode execution
[+] Successfully detached from process 19256
[i] Orchestration complete.
実行フローは、インジェクターのデバッグループとターゲットプロセス間の絶え間ないやり取りです。
インジェクションステージ
DebugLoop 関数にはメインのインジェクションロジックが含まれており、「ステートマシン」を調整します:
0. 準備:
ret 呼び出しに実行を設定します。1. 割り当て:
LocalAlloc を呼び出して小さなバッファを割り当てるように強制します。2. データ設定:
memcpy を呼び出して文字列 MZ を以前に割り当てられたバッファにコピーするように強制します。3. スタック準備:
memset を呼び出させてスタックスロットをゼロにします。これは、MapViewOfFile を呼び出すステージ 5 の準備です。この関数は 4 つ以上の引数を使用するため、5 番目の引数はスタックを介して渡されます (ここで設定します)。4. マッピングを開く:
MZ 名を使用して OpenFileMappingA を呼び出すように強制します。5. ペイロードのマッピング:
MapViewOfFile を呼び出させます。これにより、共有メモリセクション (シェルコードを含む) が EXECUTE 権限でターゲットのアドレス空間にマッピングされます。6. 実行:
RIP を MapViewOfFile によって返されたアドレスにリダイレクトします。