

Svchost は、いわゆる共有サービスプロセスの実装に不可欠です。このプロセスでは、複数のサービスが単一のプロセスを共有してリソース消費を削減できます。複数のサービスを1つのプロセスにグループ化することで、コンピューティングリソースを節約できます。これは、Windows プロセスの作成にかかる時間と消費メモリが他のオペレーティングシステム(例:Unix ファミリー)よりも多いため、NT 設計者にとって特に重要な考慮事項でした。1
つまり、簡単に言うと、Windows オペレーティングシステムでは、svchost.exe がサービスを管理し、サービスは実際には svchost.exe のスレッドとして実行されています。Phant0m はイベントログサービスを標的とし、そのサービスを担当するプロセスを特定して、イベントログサービスを担当するスレッドを検出し、強制終了します。その結果、Phant0m はプロセスを終了しないため、システム上でイベントログサービスは実行中のように見えますが、実際には(スレッドが強制終了されたため)動作しておらず、システムはログを収集しません。

Phant0m は、イベントログサービスのプロセス ID を検出するために2つの異なる方法を使用します。1つ目は SCM(サービスコントロールマネージャー)を介した検出、2つ目は WMI(Windows Management Instrumentation)を介した検出です。Phant0m にイベントログサービスのプロセス ID をどの方法で検出させるかを、main.cpp ファイル内の以下の行を変更して指定します。
例えば、SCM を介してプロセス ID を検出したい場合は、次のように編集します(すべての値を同時に設定せず、使用したい手法のみを設定してください)。
// PID 検出技術の設定セクション。
#define PID_FROM_SCM 1 // 1 に設定すると、イベントログサービスの PID がサービスマネージャーから取得されます。
#define PID_FROM_WMI 0 // 1 に設定すると、イベントログサービスの PID が WMI から取得されます。
例えば、Technique-1 を使用してスレッドを強制終了したい場合は、次のように編集します(すべての値を同時に設定せず、使用したい手法のみを設定してください)。
// TID 検出および強制終了技術の設定セクション。
#define KILL_WITH_T1 1 // 1 に設定すると、Technique-1 が使用されます。詳細: https://github.com/hlldz/Phant0m
#define KILL_WITH_T2 0 // 1 に設定すると、Technique-2 が使用されます。詳細: https://github.com/hlldz/Phant0m
Phant0m は、イベントログサービスのスレッドを検出して強制終了するために、2つの異なる方法を使用します。
Windows Vista 以降を実行しているマシンに各サービスが登録されると、サービスコントロールマネージャー(SCM)はそのサービスに一意の数値タグを(昇順で)割り当てます。そして、サービスの作成時に、そのタグがメインサービススレッドの TEB に割り当てられます。このタグは、その後、メインサービススレッドによって作成されたすべてのスレッドに伝播されます。例えば、Foo サービスのスレッドが RPC ワーカースレッドを作成した場合(注:RPC ワーカースレッドはスレッドプールメカニズムを使用しません。詳細は後述)、そのスレッドには Foo サービスのサービスタグが設定されます。2
つまり、この手法では、Phant0m は NtQueryInformationThread API を使用してスレッドの TEB アドレスを取得し、TEB から SubProcessTag を読み取ることで、イベントログサービスのスレッドを検出します。その後、イベントログサービスに関連するスレッドを強制終了します。この手法のコードは technique_1.h ファイルにあります。
この手法では、Phant0m はスレッドに関連付けられた DLL の名前を検出します。Windows イベントログサービスは wevtsvc.dll を使用します。完全なパスは %WinDir%\System32\wevtsvc.dll です。スレッドがその DLL を使用している場合、それは Windows イベントログサービスのスレッドであり、Phant0m はそのスレッドを強制終了します。この手法のコードは technique_2.h ファイルにあります。
Phant0m は、スタンドアロンの EXE としても、リフレクティブ DLL としても使用できます。Microsoft Visual Studio でプロジェクトを開き、設定(検出および強制終了手法の選択)を行ってコンパイルしてください。リフレクティブ DLL バージョンは Cobalt Strike でも使用できます。そのための Aggressor Script ファイル(phant0m.cna)がリポジトリに含まれています。

Cobalt Strike 用の Aggressor Script(phant0m.cna)の実行タイプでは、bdllspawn を使用した Fork and inject メソッドが使用されています。Phant0m を既存のプロセスにインジェクションして実行したい場合は、このプロジェクト(https://github.com/rxwx/cs-rdll-ipc-example)を参照すると簡単に実現できます。また、コードを DLL に変換し、さらに Donut を使用してシェルコードに変換することもできます。
注意:このプロジェクトは x64 アーキテクチャのみをサポートしています。