Checklist d'investigation d'une persistance WMI
Checklist pas à pas face à une persistance WMI : requêtes en direct, dépôt, événements 5860 et 5861, Sysmon 19-21, traces d'exécution et nettoyage sûr.
En bref. Collectez d'abord le dépôt, examinez ensuite l'hôte en direct, puis corrélez. Les objets indiquent ce qui s'exécute et quand ; Microsoft-Windows-WMI-Activity/Operational (événement 5861) et Sysmon (19–21) indiquent quand ils ont été enregistrés ; Prefetch, Amcache et la télémétrie des processus indiquent s'ils se sont exécutés. Ne nettoyez qu'une fois les preuves préservées.
1. Préserver le dépôt
Copiez C:\Windows\System32\wbem\Repository depuis un cliché instantané (shadow copy) avant de toucher à WMI : comment collecter le dépôt WMI. Supprimer un abonnement, installer un logiciel ou reconstruire le dépôt peut écraser des enregistrements supprimés que vous n'avez pas encore lus.
2. Examiner l'hôte en direct
Listez ce que WMI exécute actuellement, dans les espaces de noms habituels :
'root/subscription','root/cimv2','root/default' | ForEach-Object {
$ns = $_
'__EventFilter','__EventConsumer','__FilterToConsumerBinding' | ForEach-Object {
Get-CimInstance -Namespace $ns -ClassName $_ -ErrorAction SilentlyContinue
}
} | Format-List *
Sysinternals Autoruns dispose d'un onglet WMI offrant la même vue en direct. Les deux ne montrent que les objets actifs et s'appuient sur un service WMI qu'un attaquant peut contrôler.
3. Analyser les fichiers collectés
Déposez le dossier Repository dans WMI Parser. Vérifiez, dans l'ordre :
- Les liaisons qui ne sont pas des objets Windows par défaut. Les abonnements SCM Event Log et BVT sont attendus, à condition que leur contenu corresponde (détails).
- L'action du consommateur : ligne de commande, texte ou fichier de script, et chemins. Le PowerShell encodé, les binaires sous
C:\ProgramData,C:\Users\…ou%TEMP%, et les consommateurs de script méritent une lecture attentive. - Le déclencheur du filtre : durée de fonctionnement (se déclenche après chaque démarrage), ouverture de session, minuteries, démarrage de processus ou événements de périphériques.
- Le
CreatorSIDde chaque objet : quel compte l'a enregistré. - Les objets récupérés : liaisons supprimées, versions antérieures, consommateurs orphelins. Ils montrent ce qui a existé et ce qui a été nettoyé (fonctionnement de la récupération).
- Les espaces de noms autres que
root\subscription.
4. Corréler avec les journaux d'événements
| Journal | Événement | Ce qu'il apporte |
|---|---|---|
| Microsoft-Windows-WMI-Activity/Operational | 5861 | Un consommateur permanent lié à un filtre : espace de noms, filtre, consommateur et leur contenu |
| Microsoft-Windows-WMI-Activity/Operational | 5860 | Un abonnement temporaire (n'existe que pendant l'exécution de son processus) |
| Microsoft-Windows-WMI-Activity/Operational | 5857 | Un fournisseur WMI chargé, avec le chemin de sa DLL |
| Sysmon | 19, 20, 21 | Filtre, consommateur et liaison créés ou supprimés, avec l'utilisateur |
| Security | 4688 | Création de processus (si activée) : processus enfants de WmiPrvSE.exe et scrcons.exe |
Le dépôt lui-même ne contient aucun horodatage de création documenté pour ses objets ; ce sont ces événements qui permettent de les dater. Les deux FILETIME que WMI Parser affiche pour chaque en-tête d'instance sont des pistes à confronter à ces événements.
5. Rechercher des traces d'exécution
Un abonnement prouve une configuration, pas une exécution. Pour la charge utile du consommateur, vérifiez Prefetch, Amcache, ShimCache, SRUM et la télémétrie EDR ; pour les scripts, l'arborescence des processus sous scrcons.exe ; pour les lignes de commande, les processus dont le parent est WmiPrvSE.exe. Alignez leurs horodatages sur les redémarrages (pour les déclencheurs liés à la durée de fonctionnement) ou sur les ouvertures de session (pour les déclencheurs d'ouverture de session).
6. Vérifier les éléments voisins
- Fichiers MOF et AutoRecover : un
.mofcompilé avec#pragma autorecoverest rejoué lors de la reconstruction du dépôt. ExaminezC:\Windows\System32\wbem\AutoRecoveret la valeurAutorecover MOFssousHKLM\SOFTWARE\Microsoft\Wbem\CIMOM. - Classes personnalisées : données ou code dissimulés dans les propriétés d'une classe définie par l'attaquant, en dehors de la triade de l'abonnement.
- Autres hôtes : les mêmes noms de filtre et de consommateur sur plusieurs machines indiquent un déploiement à distance.
7. Nettoyer en toute sécurité
Une fois les preuves préservées et le périmètre connu, supprimez les trois objets dans l'espace de noms où ils résident, en commençant par la liaison :
$ns = 'root/subscription'
Get-CimInstance -Namespace $ns -ClassName __FilterToConsumerBinding | Where-Object { $_.Filter.Name -eq 'IntelPerfMonitor' } | Remove-CimInstance
Get-CimInstance -Namespace $ns -ClassName CommandLineEventConsumer -Filter "Name='IntelPerfMonitor'" | Remove-CimInstance
Get-CimInstance -Namespace $ns -ClassName __EventFilter -Filter "Name='IntelPerfMonitor'" | Remove-CimInstance
Remplacez les noms par les vôtres (ceux-ci proviennent de l'exemple fictif). Supprimez ensuite la charge utile vers laquelle pointait le consommateur, puis relancez la requête en direct pour confirmer.
FAQ
Quel ID d'événement signale une nouvelle persistance WMI ?
L'événement 5861 du journal Microsoft-Windows-WMI-Activity/Operational est enregistré lorsqu'un consommateur d'événements permanent est lié à un filtre. Sysmon, s'il est configuré, ajoute les événements 19, 20 et 21 pour les filtres, les consommateurs et les liaisons.
Comment supprimer une persistance WMI ?
Après la collecte des preuves, supprimez la liaison, puis le consommateur et le filtre avec Get-CimInstance … | Remove-CimInstance dans l'espace de noms où ils résident, puis supprimez la charge utile vers laquelle pointait le consommateur.
La requête en direct suffit-elle ?
Non. Elle ne montre que les objets actifs de l'espace de noms interrogé, jamais les objets supprimés, et elle s'appuie sur le service WMI d'un hôte potentiellement compromis. Analysez également le dépôt collecté.