
Contornar o Credential Guard aplicando patch no WDigest.dll usando apenas funções NTAPI.
NativeBypassCredGuard é uma ferramenta projetada para contornar o Credential Guard aplicando patch no WDigest.dll usando apenas funções NTAPI (exportadas por ntdll.dll). Está disponível em duas versões: C# e C++.
A ferramenta localiza o padrão "39 ?? ?? ?? ?? 00 8b ?? ?? ?? ?? 00" no arquivo WDigest.dll em disco (como explicado no primeiro post da seção Referências, o padrão está presente neste arquivo em todas as versões do Windows), então calcula os endereços de memória necessários e, finalmente, aplica patch no valor de duas variáveis dentro do WDigest.dll: g_fParameter_UseLogonCredential (para 1) e g_IsCredGuardEnabled (para 0).
Isso força o armazenamento de credenciais em texto puro na memória, garantindo que, a partir desse ponto, as credenciais sejam armazenadas em texto claro sempre que os usuários fizerem login. Como resultado, na próxima vez que o processo LSASS for despejado, ele poderá conter senhas em texto puro.
As funções NTAPI usadas são:

Usando apenas funções NTAPI, é possível remapear a biblioteca ntdll.dll para contornar hooks em modo de usuário e mecanismos de segurança, o que é um recurso opcional da ferramenta. Se usado, uma versão limpa do ntdll.dll é obtida de um processo criado em modo suspenso.
NativeBypassCredGuard.exe <OPTION> <REMAP-NTDLL>
Opção (obrigatória):
Remapear ntdll (opcional):
Ler valores (sem remapeamento do ntdll):
NativeBypassCredGuard.exe check

Aplicar patch nos valores (com remapeamento do ntdll):
NativeBypassCredGuard.exe patch true

A ferramenta foi projetada para sistemas de 64 bits, portanto deve ser compilada como um binário de 64 bits
Não funcionará se não for possível abrir um handle para o lsass ou se a estrutura PEB não for legível. Em relação a esta última, você pode optar por usar kernel32!LoadLibrary para carregar o WDigest.dll no seu processo e obter seu endereço base, em vez de usar ntdll!NtReadVirtualMemory e ntdll!NtQueryInformationProcess para obtê-lo do processo lsass (você tem o código para isso comentado na versão C). Mas você estaria usando uma função não exportada por ntdll.dll, mas sim por kernel32.dll, e provavelmente seria estranho um processo carregar essa DLL :)
0x3rhy criou um arquivo BOF baseado neste projeto: BypassCredGuard-BOF
Revisiting a Credential Guard Bypass por itm4n - Uma ótima análise da qual tirei o padrão para pesquisar a seção .text da DLL
WDigest: Digging the dead from the grave por neuralhax - Um blog incrível que prova que é possível usar outros valores para g_fParameter_UseLogonCredential, ainda não testei, mas você pode brincar com a variável useLogonCredential_Value
Exploring Mimikatz - Part 1 - WDigest por xpn - Post fantástico no blog sobre engenharia reversa e explicação do cache de credenciais do WDigest