
Contourner Credential Guard en patchant WDigest.dll en utilisant uniquement les fonctions NTAPI
NativeBypassCredGuard est un outil conçu pour contourner Credential Guard en patchant WDigest.dll en utilisant uniquement des fonctions NTAPI (exportées par ntdll.dll). Il est disponible en deux déclinaisons : C# et C++.
L'outil localise le motif "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" dans le fichier WDigest.dll sur disque (comme expliqué dans le premier article de la section Références, le motif est présent dans ce fichier sur toutes les versions de Windows), puis calcule les adresses mémoire nécessaires, et finalement patch la valeur de deux variables dans WDigest.dll : g_fParameter_UseLogonCredential (à 1) et g_IsCredGuardEnabled (à 0).
Cela force le stockage des identifiants en clair en mémoire, garantissant qu'à partir de ce moment les identifiants sont stockés en clair à chaque connexion des utilisateurs. Par conséquent, la prochaine fois que le processus LSASS sera dumpé, il pourra contenir des mots de passe en clair.
Les fonctions NTAPI utilisées sont :

En utilisant uniquement des fonctions NTAPI, il est possible de remapper la bibliothèque ntdll.dll pour contourner les hooks en mode utilisateur et les mécanismes de sécurité, ce qui est une fonctionnalité optionnelle de l'outil. Si elle est utilisée, une version propre de ntdll.dll est obtenue à partir d'un processus créé en mode suspendu.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
Option (requise) :
Remap ntdll (optionnel) :
Lire les valeurs (sans remappage de ntdll) :
NativeBypassCredGuard.exe check

Modifier les valeurs (avec remappage de ntdll) :
NativeBypassCredGuard.exe patch true

L'outil est conçu pour les systèmes 64 bits, il doit donc être compilé en binaire 64 bits
Il ne fonctionnera pas s'il est impossible d'ouvrir un handle sur lsass ou si la structure PEB n'est pas lisible. Concernant ce dernier point, vous pouvez opter pour l'utilisation de kernel32!LoadLibrary pour charger WDigest.dll dans votre processus afin d'obtenir son adresse de base, plutôt que d'utiliser ntdll!NtReadVirtualMemory et ntdll!NtQueryInformationProcess pour l'obtenir depuis le processus lsass (le code pour cela est commenté dans la version C). Mais vous utiliseriez alors une fonction non exportée par ntdll.dll mais par kernel32.dll, et il est probablement étrange qu'un processus charge cette DLL :)
0x3rhy a créé un fichier BOF basé sur ce projet : BypassCredGuard-BOF
Revisiting a Credential Guard Bypass par itm4n - Une excellente analyse d'où j'ai tiré le motif pour rechercher la section .text de la DLL
WDigest: Digging the dead from the grave par neuralhax - Un blog incroyable qui prouve qu'il est possible d'utiliser d'autres valeurs pour g_fParameter_UseLogonCredential, je ne l'ai pas encore testé mais vous pouvez jouer avec la variable useLogonCredential_Value
Exploring Mimikatz - Part 1 - WDigest par xpn - Un superbe article de blog sur la rétro-ingénierie et l'explication de la mise en cache des identifiants WDigest