(TAOMF) Gestion des services Windows

L'ensemble des articles tagués TAOMF ont été écrit à partir d'un ensemble de notes prises suite à la lecture du livre "The Art Of Memory Forensic" écrit par Michael Hale Ligh, Andrew Case, Jamie Levy et Aaron Walters.

Tout les crédits de ces articles leur reviennent donc de droits. Par ailleurs je vous invite vraiment à lire ce livre qui est une mine colossale d'informations.


Les services sont des processus qui tournent en tâche de fond. Généralement il n'est pas possible d’interagir directement avec eux mais ils restent très utiles lorsque l'on cherche à gagner en persistance sur une machine.

Sur un système Windows il est possible de lister l'ensemble des services installés en parcourant la clé de registre HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services:

Chaque clé contient un ensemble de clés qui définissent le type de service à lancer ou encore  si ce service est lié à un binaire ou une DLL. Tous ces services sont orchestrés par un processus: services.exe. Au démarrage, le SCM (Service Control Manager) commencera pas parcourir la clé de registre dont nous venons de parler et lancer tous les services configurés pour se lancer automatiquement. Étant donné que certains services reposent sur d'autres services il y a une sorte de dépendances ce qui fait que, par exemple, l'OS doit s'assurer que le service network a correctement démarré avant de lancer le service RDP.

Il y a quelques commandes à connaître pour interagir pleinement avec les services:

  • sc create: permet de créer un service
  • sc start: permet de lancer un service
  • sc stop: permet d'arrêter un service

Le script batch suivant référence l'ensemble des commandes batch à entrer afin de créer et lancer un service correctement:

@echo off
set SERVICENAME="MyService"
set BINPATH="C:\windows\system32\MyService.dll"
sc create "%SERVICENAME%" binPath= "%SystemRoot%\system32\svchost.exe -k %SERVICENAME%" type= share start= auto
reg add "HKLM\System\CurrentControlSet\Services\%SERVICENAME%\Parameters" /v ServiceDll /t REG_EXPAND_SZ /d "%BINPATH%" /f
reg add "HKLM\Software\Microsoft\Windows NT\CurrentVersion\SvcHost" /v %SERVICENAME% /t REG_MULTI_SZ /d "%SERVICENAME%\0" /f
sc start %SERVICENAME%

Under the hood, la commande sc create et sc start ne font rien d'autres qu'un appel aux fonction CreateService et StartService de l'API Windows. On notera qu'il est possible de créer et manager un service directement depuis WMI.
Le souci c'est que l'appel direct aux fonctions CreateService et StartService sont, la plupart du temps, monitoré par les anti virus. Un bon moyen pour bypass ce genre de monitoring est d’appeler directement une fonction via son syscall. On pourra aussi créer un service manuellement en ajoutant nous mêmes les clés de registre puis en faisant appel à l'interface NdrClientCall2 (interface RPC utilisée par la fonction StartService). Pour lancer un service relatif à un driver kernel on pourra faire appel à la fonction NtLoadDriver. Dans tous les cas, ces méthodes ne généreront pas de logs et les structures relatives à ces services ne seront pas stockées dans le SCM ce qui rendra l'analyse forensic un peu plus compliquée.Il ne nous restera plus qu'à supprimer les clés de registre relatives à notre service pour supprimer la plupart des traces de notre malware.

Dans la foulée, les malwares auront aussi tendances à désactiver certains services tels que Windows Defender ou encore Wscsvc (Windows Security Center Service). Pour cela on pourra faire appel à la fonction ControlService de l'API Windows (utilisée par la commande sc stop).Pour obtenir des informations relatives à l'état d'un service on pourra se servir de la commande sc query. Cette dernière nous indiquera si le service est en route, à quoi il sert et surtout quel est le binaire utilisé par ce service. Si ce service tourne avec des droits administrateurs mais qu'il est mal configuré, un attaquant pourra s'en servir pour élever ses privilèges.

Au niveau de l'analyse forensic, les structures stockant les informations relatives à un service sont liées les unes aux autres par une double liste chaînée. Ces structures contiennent toutes une "signature" (sErv ou serH) ce qui permet de les détecter rapidement dans un dump mémoire.Il existe trois structures non documentées relatives aux services Windows:

  • _SERVICE_HEADER (dans laquelle se trouve le tag sErv ou serH)
  • _SERVICE_RECORD (ancienne structure utilisée sous Windows XP et 2003)
  • _SERVICE_PROCESS (contient les informations relatives au processus)

Une manière de lister les services seraient de parcourir la double liste chaînée qui les lient les uns aux autres. Cependant, comme pour les processus ou les DLL's, un malware pourrait tout à faire se défaire de la liste en faisant pointer son Blink et son Flink vers les structures précédentes et suivantes.

Le module svcscan de volatility utilise l'approche dont nous avons parlé plus tôt qui consiste à crawler la RAM à la recherche des tags sErv et serH ce qui permettra de détecter tous les services qui ont été démarrés par le SCM.

Quid des services démarrées autrement ? Eh bien si les clés de registre relatives à ces services n'ont pas été supprimé il nous suffira de les lister puis de vérifier les timestamps de création/modification.

Un autre moyen un peu plus stealthy de gagner en persistance consiste à hijacker un service. Pour cela il suffira de déterminer quel binaire est utilisé par le service puis le remplacer (que ce soit sur le disque ou directement en modifiant la clé de registre appropriée) par un binaire custom malicieux.