Svchost は、いわゆる共有サービス プロセスの実装に不可欠であり、リソース消費を削減するために多数のサービスがプロセスを共有できます。複数のサービスを 1 つのプロセスにグループ化すると、コンピューティング リソースが節約されます。Windows プロセスの作成には他のオペレーティング システム (Unix ファミリなど) よりも時間がかかり、より多くのメモリを消費するため、この考慮事項は NT 設計者にとって特に懸念事項でした。 1
これは簡単に言うと次のことを意味します。 Windows オペレーティング システムでは、svchost.exe がサービスを管理し、サービスは実際には svchost.exe の下でスレッドとして実行されます。 Phant0m はイベント ログ サービスをターゲットにし、イベント ログ サービスを担当するプロセスを見つけて、イベント ログ サービスを担当するスレッドを検出して強制終了します。したがって、イベント ログ サービスはシステム内で実行されているように見えますが (Phant0m がプロセスを強制終了しなかったため)、実際には実行されず (Phant0m がスレッドを強制終了したため)、システムはログを収集しません。
Phant0m は、2 つの異なるオプションを使用してイベント ログ サービスのプロセス ID を検出します。 1 つ目は SCM (Service Control Manager) 経由で検出する方法、2 つ目は WMI (Windows Management Instrumentation) 経由で検出する方法です。 Phant0m がイベント ログ サービスのプロセス ID を検出する方法を使用して、main.cpp ファイル内の次の行を変更します。
たとえば、プロセス ID を SCM 経由で検出したい場合は、次のように編集する必要があります。 (すべての値を同時に設定せず、必要なテクニックを 1 つだけ設定してください。)
// PID detection techniques configuration section.
# define PID_FROM_SCM 1 // If you set it to 1, the PID of the Event Log service is obtained from the Service Manager.
# define PID_FROM_WMI 0 // If you set it to 1, the PID of the Event Log service is obtained from the WMI.
たとえば、Technique-1 を使用してスレッドを強制終了したい場合は、次のように編集する必要があります。 (すべての値を同時に設定せず、必要なテクニックを 1 つだけ設定してください。)
// TID detection and kill techniques configuration section.
# define KILL_WITH_T1 1 // If you set it to 1, Technique-1 will be use. For more information; https://github.com/hlldz/Phant0m
# define KILL_WITH_T2 0 // If you set it to 1, Technique-2 will be use. For more information; https://github.com/hlldz/Phant0m
Phant0m は 2 つの異なるオプションを使用して、イベント ログ サービスのスレッドを検出して強制終了します。
Windows Vista 以降を実行しているマシンに各サービスが登録されると、サービス コントロール マネージャー (SCM) によって、一意の数値タグが (昇順で) サービスに割り当てられます。その後、サービスの作成時に、タグがメイン サービス スレッドの TEB に割り当てられます。このタグは、メイン サービス スレッドによって作成されたすべてのスレッドに伝播されます。たとえば、Foo サービス スレッドが RPC ワーカー スレッドを作成する場合 (注: RPC ワーカー スレッドはスレッド プール メカニズムを使用しません。これについては後ほど説明します)、そのスレッドには Foo サービスのサービス タグが付けられます。 2
したがって、この手法では、Phant0m は NtQueryInformationThread API を使用してイベント ログ サービスのスレッドを検出し、スレッドの TEB アドレスを取得し、TEB から SubProcessTag を読み取ります。次に、イベント ログ サービスに関連するスレッドを強制終了します。この手法のコードは、 the technique_1.h
ファイルにあります。
この手法では、Phant0m はスレッドに関連付けられた DLL の名前を検出します。 Windows イベント ログ サービスはwevtsvc.dll
を使用します。フルパスは%WinDir%System32wevtsvc.dll
です。スレッドがその DLL を使用している場合、それは Windows イベント ログ サービスのスレッドであるため、Phant0m はスレッドを強制終了します。この手法のコードは、 the technique_2.h
ファイルにあります。
Phant0m は、スタンドアロン EXE としてもリフレクティブ DLL としても使用できます。 Microsoft Visual Studio でプロジェクトを開き、設定 (検出および強制終了手法の選択) を行ってコンパイルします。 Cobalt Strike で Reflective DLL バージョンを使用することもできます。このために、リポジトリに Aggressor スクリプト ファイル (phant0m.cna) があります。
Cobalt Strike の Aggressor Script (phant0m.cna) の実行タイプでは、 bdllspawn
でフォークとインジェクト メソッドが使用されていました。 Phant0m を既存のプロセスに挿入して実行したい場合は、このプロジェクト (https://github.com/rxwx/cs-rdll-ipc-example) を確認すると簡単に実行できます。コードを DLL に変換してから、Donut を使用してシェルコードに変換することもできます。
注: プロジェクトは x64 アーキテクチャのみをサポートします。