
アンパックまたはインジェクションされたC2エージェントのIOCを、スレッドのアイドル動作、未バッキングメモリ、モジュールスタンピング、APC、タイマー、リターンアドレススプーフィングを分析することで識別するコールスタックスキャナー。
このプロジェクトは(主に)コールスタックスキャナーであり、アンパックまたはインジェクションされたC2エージェントを示すIOCを特定しようとするものです。
すべてのチェックは、C2エージェントがコールバックの間で待機し、ビーコンのスレッドがアイドル状態になるという観察に基づいており、このツールはスレッドがアイドル状態になった原因を分析することを目的としています。
これには、バックされていないメモリやスタンプされたモジュールなどの従来のIOCが含まれますが、APCやタイマーを使用するスリープマスクの複数の実装を検出しようと試みます。後者は、コールスタックの分析と、ユーザーランドからタイマーとその正確なコールバックを列挙することの両方によって行われます。
これらのIOCの(ほぼ)どれも100%真陽性と見なすことはできません。例えば、モジュールスタンピング検出は特に誤検出が発生しやすいです。それでも、結果はプロセスの動作について疑念を引き起こす可能性があります。
DotNetおよび32ビットのバイナリは無視されます。

コールスタック内のプライベートなr(w)xページは、実行時にアンパックまたはインジェクションされたビーコンを示している可能性があります。
複数のスリープマスクは、ビーコンページのページ権限を非実行可能に変更します。これにより、コールスタックに怪しい非実行可能ページが現れます。
多くの場合、ビーコンはプライベートメモリページを避けるために、ディスクから正当なモジュールを読み込んで上書きします。
コピーオンライト機構のおかげで、操作されたイメージはMEMORY_WORKING_SET_EX_INFORMATIONのVirtualAttributes.SharedOriginalフィールドをチェックすることで識別できます。コールスタック内のページがプライベートではなく、SharedOriginal == 0の場合、IOCと見なされます。
これはおそらく最も誤検出が発生しやすい検出です。 :'(
スリープマスクの複数の実装は、一連のAPCをNtdll!NtContinueにキューイングし、そのうちの1つがNtdll!WaitForSingleObjectの実行をトリガーします。したがって、ブロッキング関数へのコールスタック上にNtdll!KiUserApcDispatcherが見つかった場合、このツールはそれをIOCと見なします。
APCの怪しい使用法と同様に、このツールはブロッキング関数へのコールスタック上にntdll!RtlpTpTimerCallbackがないかチェックし、タイマーベースのスリープマスクを検出します。
私の理解では、タイマーはThreadPoolの上に実装されています。Alon Levievが実証したように、これらはNtQueryInformationWorkerFactoryとWorkerFactoryBasicInformationを使用して列挙できます。
WORKER_FACTORY_BASIC_INFORMATION構造体にはFULL_TP_POOLが埋め込まれており、それがTimerQueueの二重リンクリストにリンクしています。そのPFULL_TP_TIMERのリストをたどることで、各登録されたコールバックにアクセスできます。コールバックがntdll!ntcontinueなどの怪しいAPI呼び出しのセットを指している場合、強力なIOCと見なすことができます。

もともとモジュールプロキシングは、怪しいコールスタックをバイパスする方法として導入されました。 バイパスは機能しますが、WINAPIを呼び出すためにNTAPIが使用されるという、別の強力なIOCが導入されます。これは、WINAPIはNTAPIの抽象化であるため、異常です。したがって、ntdll.dll->kernel32.dll->ntdll.dllのシーケンスがブロッキング関数を呼び出すコールスタックが観察された場合、IOCと見なすことができます。
私が知っているほとんどのリターンアドレススプーフィングの実装は、呼び出された関数がjmp [Nonvolatile-Register]ガジェットに戻るという技法を使用しています。このプロジェクトは単純にコールスタック内のすべてのリターンアドレスを反復処理し、jmpガジェットへの戻りを示すパターンを検索します。

_ _ _____ ______
| | | | / ___| | ___ \
| |_| | \ `--. | |_/ /
| _ | `--. \ | ___ \
| | | | /\__/ / | |_/ /
\_| |_/ \____/ \____/
Hunt-Sleeping-Beacons | @thefLinkk
-p / --pid {PID}
--dotnet | dotnetプロセスも含めるように設定します。(誤検出が発生しやすい)
--commandline | 疑わしいプロセスのコマンドライン出力を有効にします
-h / --help | このメッセージを表示しますか?