
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.