
Umgehung von Credential Guard durch Patchen von WDigest.dll ausschließlich mit NTAPI-Funktionen.
NativeBypassCredGuard ist ein Tool, das dazu entwickelt wurde, Credential Guard zu umgehen, indem es WDigest.dll ausschließlich mit NTAPI-Funktionen (exportiert von ntdll.dll) patcht. Es ist in zwei Varianten verfügbar: C# und C++.
Das Tool sucht das Muster "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" in der Datei WDigest.dll auf der Festplatte (wie im ersten Beitrag im Abschnitt Referenzen erläutert, ist das Muster in dieser Datei in allen Windows-Versionen vorhanden), berechnet dann die notwendigen Speicheradressen und patcht schließlich den Wert zweier Variablen innerhalb von WDigest.dll: g_fParameter_UseLogonCredential (auf 1) und g_IsCredGuardEnabled (auf 0).
Dies erzwingt die Speicherung von Anmeldeinformationen im Klartext im Speicher und stellt sicher, dass Anmeldeinformationen ab diesem Zeitpunkt bei jeder Benutzeranmeldung im Klartext gespeichert werden. Infolgedessen kann der LSASS-Prozess beim nächsten Dump Passwörter im Klartext enthalten.
Die verwendeten NTAPI-Funktionen sind:

Durch die ausschließliche Verwendung von NTAPI-Funktionen ist es möglich, die Bibliothek ntdll.dll neu zu mappen (remap), um User-Mode-Hooks und Sicherheitsmechanismen zu umgehen. Dies ist eine optionale Funktion des Tools. Wenn sie verwendet wird, wird eine saubere Version von ntdll.dll aus einem Prozess gewonnen, der im angehaltenen Modus (suspended mode) erstellt wurde.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
Option (erforderlich):
ntdll neu mappen (optional):
Werte lesen (ohne ntdll-Remapping):
NativeBypassCredGuard.exe check

Werte patchen (mit ntdll-Remapping):
NativeBypassCredGuard.exe patch true

Das Tool ist für 64-Bit-Systeme ausgelegt und muss daher als 64-Bit-Binary kompiliert werden.
Es funktioniert nicht, wenn kein Handle auf lsass geöffnet werden kann oder wenn die PEB-Struktur nicht lesbar ist. Für Letzteres kannst du dich dafür entscheiden, kernel32!LoadLibrary zum Laden von WDigest.dll in deinen Prozess zu verwenden, um die Basisadresse zu erhalten, anstatt ntdll!NtReadVirtualMemory und ntdll!NtQueryInformationProcess zu verwenden, um sie aus dem lsass-Prozess zu bekommen (der entsprechende Code ist in der C-Version auskommentiert). Du würdest dann jedoch eine Funktion verwenden, die nicht von ntdll.dll, sondern von kernel32.dll exportiert wird, und es ist wahrscheinlich ungewöhnlich, dass ein Prozess diese DLL lädt :)
0x3rhy hat eine auf diesem Projekt basierende BOF-Datei erstellt: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass von itm4n – Eine großartige Analyse, aus der ich das Muster für die Suche im .text-Abschnitt der DLL übernommen habe.
WDigest: Digging the dead from the grave von neuralhax – Ein erstaunlicher Blog, der beweist, dass es möglich ist, andere Werte für g_fParameter_UseLogonCredential zu verwenden. Ich habe es noch nicht getestet, aber du kannst mit der Variablen useLogonCredential_Value herumspielen.
Exploring Mimikatz - Part 1 - WDigest von xpn – Fantastischer Blogbeitrag, der WDigest-Credential-Caching per Reverse Engineering erklärt.