
Bypassa Credential Guard applicando una patch a WDigest.dll utilizzando solo funzioni NTAPI
NativeBypassCredGuard è uno strumento progettato per bypassare Credential Guard applicando una patch a WDigest.dll utilizzando esclusivamente funzioni NTAPI (esportate da ntdll.dll). È disponibile in due versioni: C# e C++.
Lo strumento individua il pattern "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" nel file WDigest.dll su disco (come spiegato nel primo post della sezione References, il pattern è presente in questo file in tutte le versioni di Windows), quindi calcola gli indirizzi di memoria necessari e infine applica una patch al valore di due variabili all'interno di WDigest.dll: g_fParameter_UseLogonCredential (a 1) e g_IsCredGuardEnabled (a 0).
Questo forza la memorizzazione delle credenziali in chiaro in memoria, garantendo che da quel momento in poi le credenziali vengano salvate in testo chiaro ogni volta che gli utenti accedono. Di conseguenza, la prossima volta che il processo LSASS viene dumpato, potrebbe contenere password in chiaro.
Le funzioni NTAPI utilizzate sono:

Utilizzando solo funzioni NTAPI, è possibile rimappare la libreria ntdll.dll per bypassare gli hook in modalità utente e i meccanismi di sicurezza, che è una funzionalità opzionale dello strumento. Se utilizzata, una versione pulita di ntdll.dll viene ottenuta da un processo creato in modalità sospesa.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
Opzione (obbligatoria):
Remap ntdll (opzionale):
Leggere i valori (senza rimappatura di ntdll):
NativeBypassCredGuard.exe check

Applicare la patch ai valori (con rimappatura di ntdll):
NativeBypassCredGuard.exe patch true

Lo strumento è progettato per sistemi a 64 bit, quindi deve essere compilato come binario a 64 bit
Non funzionerà se non è possibile aprire un handle a lsass o se la struttura PEB non è leggibile. Per quanto riguarda quest'ultimo punto, puoi optare per l'uso di kernel32!LoadLibrary per caricare WDigest.dll nel tuo processo e ottenere il suo indirizzo di base, invece di usare ntdll!NtReadVirtualMemory e ntdll!NtQueryInformationProcess per ottenerlo dal processo lsass (trovi il codice per questa soluzione commentato nella versione C). Tuttavia useresti una funzione non esportata da ntdll.dll ma da kernel32.dll, e probabilmente sarebbe strano che un processo carichi quella DLL :)
0x3rhy ha creato un file BOF basato su questo progetto: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass di itm4n - Una grande analisi da cui ho preso il pattern per cercare la sezione .text della DLL
WDigest: Digging the dead from the grave di neuralhax - Un blog sorprendente che dimostra che è possibile usare altri valori per g_fParameter_UseLogonCredential; non l'ho ancora testato, ma puoi giocare con la variabile useLogonCredential_Value
Exploring Mimikatz - Part 1 - WDigest di xpn - Fantastico post sul reverse-engineering e la spiegazione della cache delle credenziali WDigest