Svchost est essentiel dans la mise en œuvre de processus de services dits partagés, dans lesquels un certain nombre de services peuvent partager un processus afin de réduire la consommation de ressources. Le regroupement de plusieurs services en un seul processus préserve les ressources informatiques, et cette considération était particulièrement préoccupante pour les concepteurs NT car la création de processus Windows prend plus de temps et consomme plus de mémoire que dans d'autres systèmes d'exploitation, par exemple dans la famille Unix. 1
Cela signifie brièvement cela ; Sur les systèmes d'exploitation Windows, svchost.exe gère les services et les services s'exécutent réellement sous svchost.exe en tant que threads. Phant0m cible le service Event Log et, trouvant le processus responsable du service Event Log, il détecte et tue les threads responsables du service Event Log. Ainsi, bien que le service Event Log semble être en cours d'exécution dans le système (parce que Phant0m n'a pas tué le processus), il ne s'exécute pas réellement (car Phant0m a tué les threads) et le système ne collecte pas de journaux.
Phant0m utilise deux options différentes pour détecter l'ID de processus du service de journal des événements. La première consiste à détecter via le SCM (Service Control Manager) et la seconde consiste à détecter via WMI (Windows Management Instrumentation). Avec quelle méthode vous souhaitez que Phant0m détecte l'ID de processus du service Journal des événements, modifiez les lignes suivantes dans le fichier main.cpp.
Par exemple, si vous souhaitez que l'ID de processus soit détecté via SCM, vous devez le modifier comme suit. (Ne définissez pas toutes les valeurs en même temps, définissez uniquement la technique souhaitée.)
// 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.
Par exemple, si vous souhaitez que les threads soient supprimés à l'aide de la Technique-1, vous devez les modifier comme suit. (Ne définissez pas toutes les valeurs en même temps, définissez uniquement la technique souhaitée.)
// 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 utilise deux options différentes pour détecter et tuer les threads du service Event Log.
Lorsque chaque service est enregistré sur un ordinateur exécutant Windows Vista ou version ultérieure, le gestionnaire de contrôle des services (SCM) attribue une balise numérique unique au service (par ordre croissant). Ensuite, au moment de la création du service, la balise est affectée au TEB du thread de service principal. Cette balise sera ensuite propagée à chaque thread créé par le thread de service principal. Par exemple, si le thread de service Foo crée un thread de travail RPC (remarque : les threads de travail RPC n'utilisent pas le mécanisme de pool de threads plus tard), ce thread aura le numéro de service du service Foo. 2
Ainsi, dans cette technique, Phant0m détectera les threads du service Event Log avec l'API NtQueryInformationThread pour obtenir l'adresse TEB du thread et lire le SubProcessTag à partir du TEB. Ensuite, il tue les threads liés au service Event Log. Les codes de cette technique se trouvent dans the technique_1.h
.
Dans cette technique, Phant0m détecte les noms des DLL associées aux threads. Le service de journal des événements Windows utilise wevtsvc.dll
. Le chemin complet est %WinDir%System32wevtsvc.dll
. Si le thread utilise cette DLL, il s'agit du thread du service de journal des événements Windows, puis Phant0m tue le thread. Les codes de cette technique se trouvent dans the technique_2.h
.
Vous pouvez utiliser Phant0m à la fois comme EXE autonome et comme DLL réfléchissante. Ouvrez le projet dans Microsoft Visual Studio, effectuez les réglages (sélectionnez les techniques de détection et de kill) et compilez. Vous pouvez également utiliser la version réfléchissante DLL avec Cobalt Strike, pour cela il existe un fichier Aggressor Script (phant0m.cna) dans le référentiel.
La méthode Fork et inject a été utilisée avec bdllspawn
dans le type d'exécution de Aggressor Script (phant0m.cna) pour Cobalt Strike. Si vous souhaitez injecter Phant0m dans votre processus existant et l'exécuter, vous pouvez consulter ce projet (https://github.com/rxwx/cs-rdll-ipc-example) et vous pouvez le faire facilement. Vous pouvez également convertir le code en DLL puis en Shellcode avec Donut.
REMARQUE : le projet prend uniquement en charge l'architecture x64.