
Extension de débogage pour la réponse aux incidents et la criminalistique numérique
SwishDbgExt est une extension de débogage Microsoft WinDbg qui étend l'ensemble des commandes disponibles de Microsoft WinDbg, mais corrige et améliore également les commandes existantes. Cette extension a été développée par Matt Suiche (@msuiche) – n'hésitez pas à nous contacter à [email protected] pour demander plus de fonctionnalités, proposer de contribuer et/ou signaler des bogues.
SwishDbgExt vise à faciliter la vie des développeurs noyau, des dépanneurs et des experts en sécurité grâce à une série de commandes de débogage, de réponse aux incidents et de forensic mémoire. Étant une extension de débogage WinDbg, elle peut être utilisée sur des sessions de débogage noyau locales ou distantes, des sessions en direct générées par Microsoft LiveKd, mais aussi sur des vidages sur incident Microsoft générés par un écran bleu de la mort ou des utilitaires hybrides tels que Comae DumpIt.
Plus d'informations sur https://blog.comae.io/comae-2016-contest-swishdbgext-features-3c9a63c62209#.tnt1b9usx
Vous pouvez soit copier l'extension WinDbg dans le dossier WinDbg correspondant (x86 ou x64), soit la charger manuellement à l'aide de la commande !load comme ci-dessous. Veuillez noter que vous ne pouvez pas avoir d'espaces ou de guillemets dans le chemin complet vers la dll cible à charger.
!load X:\FullPath\SwishDbgExt.dll
###Exemple:
kd> !load E:\projects\labs\SwishDbgExt\bin\x64\SwishDbgExt.dll;
SwishDbgExt v0.7.0 (Nov 2 2016) - Incident Response & Digital Forensics Debugging Extension
SwishDbgExt Copyright (C) 2016 Comae Technologies FZE - http://www.comae.io
SwishDbgExt Copyright (C) 2014-2016 Matthieu Suiche (@msuiche)
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
Si vous souhaitez mettre à jour votre modèle WinDbg avec un modèle plus compatible DML, vous pouvez importer directement le fichier windbg_template.reg joint au package.
Affiche des informations sur les commandes d'extension disponibles.
Cette commande vous donnera la liste de toutes les commandes si vous ne spécifiez aucun argument, et la liste des paramètres d'une commande existante si elle est spécifiée comme argument.
Affiche les fonctions de rappel
Recherche les code caves utilisés
Affiche l'historique des commandes de la console
Affiche les informations d'identification de l'utilisateur (basé sur mimikatz de gentilwiki)
Affiche la liste des pilotes. !ms_drivers affiche une liste des pilotes actuellement chargés. Dans cet exemple, voici quelques-uns des pilotes chargés au moment du crash dans ce vidage noyau : Avec cette commande, nous pouvons également visualiser des informations IRP détaillées concernant un pilote : Dans l'image ci-dessus, nous pouvons voir l'emplacement de la pile d'E/S spécifique au pilote dans l'IRP de e1cexpress.sys. Nous pouvons y voir des codes de fonction tels que IRP_MJ_CREATE qui ouvre l'objet périphérique cible, indiquant qu'il est présent et disponible pour les opérations d'E/S.
Vide l'espace mémoire sur le disque
Affiche les workers en file d'attente Ex.
!exqueue ne fonctionne pas correctement sur Windows 8, donc une version fonctionnelle a dû être implémentée. Tout comme la commande d'origine, celle-ci affiche la file d'attente des threads de travail.
Réinitialise la segmentation dans WinDbg (Correction de "16.kd>")
Affiche la GDT.
!ms_gdt affiche la Global Descriptor Table. Notez que sur x64, chaque sélecteur est plat (de 0x0000000000000000 à 0xFFFFFFFFFFFFFFFF). Cette commande peut être particulièrement utile pour vérifier tout hook suspecté de la GDT, car tenter de le faire sur x64 provoquera un bug check. Cela est dû au fait que x64 interdit le hook de la GDT.
Affiche la liste des ruches du registre.
ms_hivelist affiche une liste des ruches du registre. Nous pouvons regarder directement dans une ruche (\Registry\Machine\Software par exemple) pour voir ses sous-clés, valeurs, etc :

Affiche la IDT.
!ms_idt affiche la table des descripteurs d'interruptions. Tout comme la GDT, si la IDT est hookée sur un système x64, cela provoquera un bug check. Cela est dû au fait que Microsoft a implémenté (programmatiquement) une prévention du hook de la IDT avec un pilote en mode noyau qui intercepterait normalement les appels à la IDT et ajouterait son propre traitement. C'est pourquoi, dans l'image ci-dessus, il y a 'Non' partout où l'on peut voir.
Analyse un espace mémoire et retourne un Indice de Score de Malware (MSI) - (basé sur le travail de Frank Boldewin)
Scanne le Master Boot Record (MBR)
Affiche les informations réseau (sockets, connexions, ...)
Affiche la liste des objets
Affiche la liste des processus.
!ms_process est une version améliorée de !process et !dml_proc.. L'une des choses intéressantes, comme vous pouvez le remarquer ci-dessous, est l'utilisation du DML (Debugger Markup Language) avec les commandes. Toutes les commandes soulignées sont en fait des liens vers des commandes. Comme exemple ci-dessous, vous pouvez voir la sortie de /vads /scan, pour scanner les VAD (Virtual Address Descriptors). Vous pouvez remarquer qu'une colonne donne l'« Indice de Score de Malware » qui peut être utile pour détecter des shellcodes ou du heap-spray. Dans la capture d'écran ci-dessous, vous pouvez voir un score anormalement élevé dans plusieurs VAD – dû à l'utilisation du heap spray. En cliquant simplement sur le score, l'algorithme de scan s'exécutera. L'algorithme de scan est basé sur l'utilitaire OfficeMalScanner de Frank Boldewin. Et il vous renvoie des informations sur l'emplacement du shellcode : L'option /scan peut également être utilisée sur les fonctions exportées pour savoir si l'EAT (Export Address Table) a été patchée ou si le prologue de la fonction a été modifié. Des tests similaires sont disponibles pour la SSDT (!ms_ssdt).
Lit le bloc de contrôle de clé
Lit le nœud de clé.
La commande WinDbg !reg a été une source de frustration pendant longtemps, en raison de certains bogues. C'est pourquoi SwishDbgExt a ses propres fonctions d'exploration du registre pour essayer de rendre l'accès aux données du registre aussi simple que possible.
Lit la valeur de la clé
Scanne et affiche les hooks NDIS suspects
Affiche la liste des services
Affiche les fonctions de la table des descripteurs de services (SDT).
!ms_ssdt affiche la System Service Dispatch Table. Cette commande est extrêmement utile dans l'investigation de hooks suspects de rootkit via ce qu'on appelle la Manipulation Directe d'Objets Noyau (DKOM). Si vous voyez une routine de bas niveau qui est hookée (comme nt!NtEnumerateKey), cela peut vous aider dans votre analyse concernant une éventuelle infection par rootkit.
Affiche les informations relatives au Store Manager (ReadyBoost).
Cette commande permet de lister le cache ReadyBoost actuel (nécessite USB 3.0) utilisé par le système d'exploitation, mais aussi d'afficher les journaux des pages mémoire gérées par le store manager. Paramètre : /cache
Affiche la liste des KTIMER.
!ms_timers affiche la structure KTIMER, qui est une structure opaque représentant et contenant divers objets de minuterie. Cette commande peut être utile pour déterminer quels pilotes ont créé quels objets de minuterie, quels pilotes ont appelé quelles routines, etc.
Affiche la liste des VACBs en cache
Active/Désactive le mode verbeux
Ce qui suit est basé sur les recherches publiées par Alex Ionescu et disponibles ici : https://github.com/ionescu007/lxss/
Cette fonctionnalité est disponible sur Windows 10+ en tant que fonctionnalité facultative installable via la commande PowerShell suivante :
Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
Vous pouvez en savoir plus sur le Sous-système Windows pour Linux aux liens suivants :
Windows Subsystem for Linux Overview.
Instance 0xFFFFE704EEB8F010
GUID: {E29032FD-35D3-4C53-AB68-6BCEBDA7176F}
State: (1) [STARTED]
Creation Flags: 00000001
GlobalData: 0xFFFFF802ED4138A0
Root Handle: 80000834
Temp Handle: 80000838
Job Handle: 8000083c
Token: 80000818
Event Handle: 800008bc
Map Paths (0): 0xFFFFE704EF437920
VFS Context: 0xFFFFE704EEFC4710
Memory Flags: 0x2
Last PID: 35
Thread Groups: 3
Session 0xFFFFE704EDB79EC0
Instance: 0xFFFFE704EEB8F010
Console inode: 0x0
Foreground PID: -1
Process Group 0xFFFFE704EDB79AE0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EDB79EC0
Thread Group 0xFFFFE704EF4F8000
Binary Path: /init
Thread(s): 1
Owner Process Group: 0xFFFFE704EDB79AE0
Flags: 0x00000000
Main Thread: 0xFFFFE704EF5CC010
Arguments (006 bytes): 0x00007FFFC081D6E0
Process 0xFFFFE704EF2F1D70
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84EF800
NT Process Handle: 0xFFFFFFFF80000F58
VDSO Address: 0x00007FFFC0849000
Stack Address: 0x00007FFFC001E000
Session 0xFFFFE704EF5DB830
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF32D7A0
Foreground PID: 2
Process Group 0xFFFFE704EF5EF970
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF5DB830
Thread Group 0xFFFFE704EF5EE000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704EF5EF970
Flags: 0x0000000C
Main Thread: 0xFFFFE704EF5F8010
Arguments (010 bytes): 0x00007FFFDF34E418
Process 0xFFFFE704EDEF6EC0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E84E6800
NT Process Handle: 0xFFFFFFFF80000D9C
VDSO Address: 0x00007FFFDF883000
Stack Address: 0x00007FFFDEB4F000
Session 0xFFFFE704EF0A8ED0
Instance: 0xFFFFE704EEB8F010
Console inode: 0xFFFFE704EF06B9C0
Foreground PID: 19
Process Group 0xFFFFE704F059CBC0
Instance: 0xFFFFE704EEB8F010
Session: 0xFFFFE704EF0A8ED0
Thread Group 0xFFFFE704EDE51000
Binary Path: /bin/bash
Thread(s): 1
Owner Process Group: 0xFFFFE704F059CBC0
Flags: 0x0000000C
Main Thread: 0xFFFFE704EDC78090
Arguments (010 bytes): 0x00007FFFF78CFB78
Process 0xFFFFE704F06389B0
Instance: 0xFFFFE704EEB8F010
NT Process Object: 0xFFFFAE05E618D800
NT Process Handle: 0xFFFFFFFF80001650
VDSO Address: 0x00007FFFF7C99000
Stack Address: 0x00007FFFF70D0000
Scanne la mémoire d'un processus avec des règles yara.
Scanne la mémoire d'un processus.
!ms_yarascan /pid 0x228 /yarafile /yarafile C:\Rules.yar
Scanne la mémoire de tous les processus.
!for_each_process "r? @$t0 = (nt!_EPROCESS *) @#Process; .process /r /p @$t0; !ms_yarascan /pid @@C++(@$t0->UniqueProcessId) /yarafile C:\\Rules.yar"
MsPEImageFile contient les informations communes de base utilisées par les binaires Windows (PE) et a été dérivé en trois classes différentes :