
Evade Credential Guard parcheando WDigest.dll utilizando únicamente funciones NTAPI
NativeBypassCredGuard es una herramienta diseñada para eludir Credential Guard parcheando WDigest.dll utilizando únicamente funciones NTAPI (exportadas por ntdll.dll). Está disponible en dos variantes: C# y C++.
La herramienta localiza el patrón "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" en el archivo WDigest.dll en disco (como se explica en el primer artículo de la sección Referencias, el patrón está presente en este archivo en todas las versiones de Windows), luego calcula las direcciones de memoria necesarias y, finalmente, parchea el valor de dos variables dentro de WDigest.dll: g_fParameter_UseLogonCredential (a 1) y g_IsCredGuardEnabled (a 0).
Esto fuerza el almacenamiento de credenciales en texto plano en memoria, asegurando que a partir de ese momento las credenciales se almacenen en texto claro cada vez que los usuarios inicien sesión. Como resultado, la próxima vez que se vuelque el proceso LSASS, este puede contener contraseñas en texto plano.
Las funciones NTAPI utilizadas son:

Utilizando únicamente funciones NTAPI, es posible reasignar la librería ntdll.dll para eludir los hooks en modo usuario y los mecanismos de seguridad, lo cual es una característica opcional de la herramienta. Si se utiliza, se obtiene una versión limpia de ntdll.dll de un proceso creado en modo suspendido.
NativeBypassCredGuard.exe <OPCIÓN> <REMAP-NTDLL>
Opción (obligatoria):
Remap ntdll (opcional):
Leer valores (sin reasignación de ntdll):
NativeBypassCredGuard.exe check

Parchear valores (con reasignación de ntdll):
NativeBypassCredGuard.exe patch true

La herramienta está diseñada para sistemas de 64 bits, por lo que debe compilarse como un binario de 64 bits
No funcionará si no es posible abrir un identificador a lsass o si la estructura PEB no es legible. Con respecto a esto último, puedes optar por usar kernel32!LoadLibrary para cargar WDigest.dll en tu proceso y obtener su dirección base, en lugar de usar ntdll!NtReadVirtualMemory y ntdll!NtQueryInformationProcess para obtenerla del proceso lsass (tienes el código para esto comentado en la versión C). Pero estarías usando una función que no exporta ntdll.dll sino kernel32.dll, y probablemente sea extraño que un proceso cargue esa DLL :)
0x3rhy ha creado un archivo BOF basado en este proyecto: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass por itm4n - Un gran análisis del cual tomé el patrón para buscar en la sección .text de la DLL
WDigest: Digging the dead from the grave por neuralhax - Un blog increíble que demuestra que es posible usar otros valores para g_fParameter_UseLogonCredential, aún no lo he probado pero puedes jugar con la variable useLogonCredential_Value
Exploring Mimikatz - Part 1 - WDigest por xpn - Fantástico artículo de blog que explica e ingenia ingeniería inversa sobre el almacenamiento en caché de credenciales de WDigest