Svchost ist unverzichtbar bei der Implementierung sogenannter Shared-Service-Prozesse, bei denen sich mehrere Dienste einen Prozess teilen können, um den Ressourcenverbrauch zu reduzieren. Durch die Gruppierung mehrerer Dienste in einem einzigen Prozess werden Rechenressourcen geschont, und diese Überlegung war für NT-Designer von besonderer Bedeutung, da die Erstellung von Windows-Prozessen mehr Zeit in Anspruch nimmt und mehr Speicher verbraucht als in anderen Betriebssystemen, z. B. in der Unix-Familie. 1
Das bedeutet kurz gesagt: Auf Windows-Betriebssystemen verwaltet svchost.exe die Dienste und Dienste werden tatsächlich unter svchost.exe als Threads ausgeführt. Phant0m zielt auf den Ereignisprotokolldienst ab und findet den für den Ereignisprotokolldienst verantwortlichen Prozess. Es erkennt und beendet die für den Ereignisprotokolldienst verantwortlichen Threads. Obwohl der Ereignisprotokolldienst scheinbar im System ausgeführt wird (weil Phant0m den Prozess nicht beendet hat), wird er tatsächlich nicht ausgeführt (weil Phant0m Threads beendet hat) und das System sammelt keine Protokolle.
Phant0m verwendet zwei verschiedene Optionen, um die Prozess-ID des Ereignisprotokolldienstes zu ermitteln. Die erste Möglichkeit besteht in der Erkennung über den SCM (Service Control Manager) und die zweite in der Erkennung über WMI (Windows Management Instrumentation). Mit welcher Methode Phant0m die Prozess-ID des Ereignisprotokolldienstes erkennen soll, ändern Sie die folgenden Zeilen in der Datei main.cpp.
Wenn Sie beispielsweise möchten, dass die Prozess-ID über SCM erkannt wird, sollten Sie sie wie folgt bearbeiten. (Stellen Sie nicht alle Werte gleichzeitig ein, sondern nur die gewünschte Technik.)
// 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.
Wenn Sie beispielsweise möchten, dass Threads mit Technik-1 beendet werden, sollten Sie es wie folgt bearbeiten. (Stellen Sie nicht alle Werte gleichzeitig ein, sondern nur die gewünschte Technik.)
// 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 verwendet zwei verschiedene Optionen, um die Threads des Ereignisprotokolldienstes zu erkennen und zu beenden.
Wenn jeder Dienst auf einem Computer mit Windows Vista oder höher registriert wird, weist der Service Control Manager (SCM) dem Dienst ein eindeutiges numerisches Tag zu (in aufsteigender Reihenfolge). Anschließend wird das Tag zum Zeitpunkt der Diensterstellung dem TEB des Hauptdienstthreads zugewiesen. Dieses Tag wird dann an jeden vom Hauptdienstthread erstellten Thread weitergegeben. Wenn beispielsweise der Foo-Dienstthread einen RPC-Arbeitsthread erstellt (Hinweis: RPC-Arbeitsthreads verwenden den Thread-Pool-Mechanismus nicht mehr dazu später), hat dieser Thread das Service-Tag des Foo-Dienstes. 2
Bei dieser Technik erkennt Phant0m Threads des Ereignisprotokolldienstes mit der NtQueryInformationThread-API, um die TEB-Adresse des Threads abzurufen und den SubProcessTag aus dem TEB zu lesen. Anschließend werden die Threads im Zusammenhang mit dem Ereignisprotokolldienst beendet. Die Codes für diese Technik befinden sich in the technique_1.h
.
Bei dieser Technik erkennt Phant0m die Namen von DLLs, die Threads zugeordnet sind. Der Windows-Ereignisprotokolldienst verwendet wevtsvc.dll
. Der vollständige Pfad lautet %WinDir%System32wevtsvc.dll
. Wenn der Thread diese DLL verwendet, handelt es sich um den Thread des Windows-Ereignisprotokolldienstes, und dann beendet Phant0m den Thread. Die Codes für diese Technik befinden sich in the technique_2.h
.
Sie können Phant0m sowohl als eigenständige EXE-Datei als auch als reflektierende DLL verwenden. Öffnen Sie das Projekt in Microsoft Visual Studio, nehmen Sie die Einstellungen vor (wählen Sie die Erkennungs- und Kill-Techniken) und kompilieren Sie es. Sie können auch die Reflektive DLL-Version mit Cobalt Strike verwenden, dafür gibt es eine Aggressor Script-Datei (phant0m.cna) im Repository.
Die Fork-and-Inject-Methode wurde mit bdllspawn
im Ausführungstyp von Aggressor Script (phant0m.cna) für Cobalt Strike verwendet. Wenn Sie Phant0m in Ihren bestehenden Prozess einbinden und ausführen möchten, können Sie sich dieses Projekt (https://github.com/rxwx/cs-rdll-ipc-example) ansehen und es ganz einfach durchführen. Sie können den Code auch mit Donut in DLL und dann in Shellcode konvertieren.
HINWEIS: Das Projekt unterstützt nur die x64-Architektur.