Part 4 : Les comptes dans l’Active Directory
Cet article aborde les comptes de l’Active Directory que nous allons retrouver dans la base de données NTDS. Comme évoqué au cours du 2e volet de cette série d’article, les comptes sont des objets stockés dans la datatable.
Les types de compte
On peut distinguer trois types de comptes dans un Active Directory :
- Comptes utilisateurs : Ils ont généralement des noms reconnaissables qui correspondent au nom de l’utilisateur (exemple : p.nom). En entreprise, les comptes d’administration peuvent être marqués comme tels afin de les reconnaitre plus facilement (ex : p.nom-adm).
- Comptes machines : Ils sont généralement nommés selon la machine à laquelle ils correspondent et leur nom termine par un signe dollar « $ » (par exemple : « COMPUTERNAME$ ». Lorsqu’un domaine a une relation d’approbation avec un autre domaine, le nom de ce dernier apparait également sous la forme d’un compte machine.
- Comptes de service : Ces comptes sont souvent nommés d’après le service qu’ils font fonctionner. En fonction des usages, ils peuvent être des comptes de services managés (MSA(1), qui se termine par « $ »), des comptes machines ou des comptes utilisateurs pour faire fonctionner le service cible. Par exemple, un compte de service pour SQLServer pourrait s’appeler « SQLService ».
Les attributs
Lorsqu’on ouvre une base NTDS, les comptes sont associés à énormément d’attributs. D’un point de vue sécurité, voici ceux qui nous intéressent :
Propriété | Colonne | Description |
sAMAccountName | ATTm590045 | Le login du compte qui permet d’identifier l’utilisateur ou le service qui l’utilise. Ex : bastien.nom |
objectSID | ATTr589970 | Security Identifier(2). Identifiant unique pour chaque objet. Ex : S-1-5-21–7623811015-3361044348-030300820-1013 |
dBCSPwd | ATTk589879 | Empreinte du mot de passe au format LM. Cet attribut est chiffré. Cf. Part-3 : Les empreintes de mot de passe. |
unicodePwd | ATTk589914 | Empreinte du mot de passe au format NT. Cet attribut est chiffré. Cf. Part-3 : Les empreintes de mot de passe. |
pekList | ATTk590689 | Clés stockées (Password encryption key). Chiffrées comme les empreintes LM et NT. |
supplementalCredentials | ATTk589949 | Attribut chiffré (avec la même clé que les empreintes LM et NT) pouvant contenir la valeur en clair du mot de passe. |
servicePrincipalName | ATTm590595 | Service Principal Name (SPN) d’un compte de service. Ex : MSSQLSvc/COMPUTERNAME:1433 |
primarygroup | ATTj589922 | Le groupe primaire du compte. Exemple : RID 513 (utilisateur du domaine) ou RID 515 (ordinateur du domaine). |
logoncount | ATTj589993 | Le nombre de fois qu’un utilisateur s’est authentifié auprès du contrôleur de domaine. Cet attribut n’est pas répliqué (dans le cas où le domaine est constitué de plusieurs DC). |
badPwdCount | ATTj589836 | Le nombre de mots de passe invalides saisis. Cet attribut est réinitialisé lorsque l’utilisateur saisit le bon mot de passe ou après un certain temps défini dans les paramètres du domaine. Cet attribut n’est pas répliqué. |
description | ATTm13 | La description du compte. Cet attribut est souvent utilisé pour stocker des mots de passe par les administrateurs. Des outils(3) disponibles sur Internet permettent d’effectuer des vérifications automatisées. |
whenCreated | ATTl131074 | La date de création du compte |
whenChanged | ATTl131075 | La dernière fois que le compte a été modifié |
lastlogon | ATTq589876 | La dernière date de connexion du compte sur le contrôleur de domaine. Attention, ce champ n’est pas répliqué entre les différents contrôleurs de domaine. |
lastLogonTimestamp | ATTq591520 | La dernière date de connexion du compte sur le contrôleur de domaine. À la différence de lastlogon, celui-ci est répliqué par défaut uniquement si la valeur précédente est supérieure à 14 jours(4). |
accountExpires | ATTq589983 | Date à laquelle le compte ne pourra plus être utilisé (peut être vide). Lorsque le compte est expiré, il est toujours considéré comme activé dans la propriété « status ». |
pwdLastSet | ATTq589920 | La date du dernier changement de mot de passe |
userPrincipalName | ATTm590480 | Le nom complet du compte (login + domaine). Ex : bastien.nom@xmco.lan |
userAccountControl | ATTj589832 | Propriété du compte tel qu’activé, désactivé, verrouillé, absence d’expiration du mot de passe, etc. L’ensemble des propriétés sont disponibles sur le site de Microsoft. |
info | ATTm131153 | Attribut complémentaire à l’attribut « description » pouvant contenir des précisions sur le compte |
operatingSystem | ATTm590187 | Nom du système. Ex : Windows Server 2019 Standard |
operatingSystemVersion | ATTm590188 | Version du système. Ex : 10.0 (17763) |
operatingSystemServicePack | ATTm590189 | Information sur le Service pack. Ex : Service Pack 1. |
sIDHistory | ATTr590433 | Contient les SID précédents utilisés pour référencer l’objet si ce dernier a été déplacé depuis un autre domaine. |
adminCount | ATTj589974 | Attribut ayant une valeur vide, 0 et 1. Lorsque la valeur est égale à 1, l’utilisateur est, ou était, dans un groupe d’administration protégé. Plus d’informations sont disponibles dans cet article(5). |
Les comptes par défaut « built-in »
Lors de la création d’un domaine, trois comptes « Built-in » sont créés :
- Administrateur (RID 500) : compte administrateur de domaine par défaut ;
- Invité (RID 501) : compte permettant un accès limité à une machine du domaine. Par défaut, celui-ci est désactivé et son mot de passe est vide ;
- Krbtgt (RID 502) : compte de service dont le mot de passe est utilisé dans le processus d’authentification Kerberos. Ce compte est également désactivé par défaut et son mot de passe est généré de manière aléatoire.
Il est recommandé de ne pas utiliser le compte Administrateur pour administrer le domaine. En effet, ce compte non nominatif ne permet pas d’imputer les actions effectuées à un utilisateur. Ce compte doit être uniquement un compte de secours et son mot de passe doit être stocké de manière sécurisée et tracée.
Tips : Pour connaitre la date de création d’un domaine, il suffit de relever la date de création de l’un des trois comptes ci-dessus.
Le compte d’administration DSRM
Un compte moins connu appelé DSRM pour Directory Services Restore Mode est un compte local qui existe sur chaque contrôleur de domaine, permettant la restauration de l’Active Directory. Ce compte « brise-glace » n’est pas stocké dans la base de données NTDS.dit car celui-ci doit être accessible même si la base de données NTDS.dit ne peut pas être lue, comme c’est le cas lorsqu’un contrôleur de domaine démarre en mode DSRM. À noter que depuis une mise à jour KB961320, une option est proposée pour synchroniser le mot de passe du compte DSRM avec celui du compte administrateur built-in. Une technique de persistance pour un attaquant ayant compromis ce compte est décrite dans l’article suivant : https://adsecurity.org/?p=1714
Quel est le nombre de comptes maximum pour un AD ?
Lors de nos audits avec notre solution IAMBuster, nous avons audité des Active Directory jusqu’à plus de 250 000 comptes et pour un nombre total de SID d’environ 500 000. Cela peut sembler beaucoup mais le service Active Directory depuis Windows Server 2012 peut gérer un peu plus de deux milliards de SID dans la vie d’un domaine selon la documentation officielle(6). Cette limitation provient du fait que l’identifiant relatif (RID) attribué à chaque objet (comptes, groupes, etc.) est limité sur 31 bits (soit maximum le nombre entier non signée 2 147 483 647) et qu’il n’est pas réutilisé.
S-1-5-21-2718885639-921538116-1870948965-96387
Exemple d’un SID d’un objet avec en gras le RID
L’analyse des objets « comptes” est donc indispensable lors des audits de la partie IAM des Active Directory. Elle permet ainsi d’identifier les défauts de sécurité, les problèmes d’hygiène et d’organisation d’un domaine.
Les attributs des comptes ci-dessus permettent d’effectuer un ensemble de contrôle de sécurité tels que :
Points de contrôle | Attributs permettant de répondre |
Est-ce qu’un compte est toujours utilisé ? | lastLogonTimestamp |
Est-ce qu’un compte a changé son mot de passe depuis sa création ? | whenCreated, pwdLastSet |
Mon domaine possède-t-il des systèmes obsolètes ? | operatingSystem, operatingSystemVersion, operatingSystemServicePack |
Mon domaine a-t-il des comptes utilisateurs exposant un SPN ? | servicePrincipalName |
Des comptes utilisateurs proviennent-ils d’un autre domaine ? | sIDHistory |
Existe-t-il des comptes qui n’ont pas d’expiration de mot de passe ? | userAccountControl |
Est-ce que des comptes utilisateurs ont encore un mot de passe sous un format LM | DBCSPwd |
La pré-authentification Kerberos est-elle activée sur l’ensemble des comptes ? | userAccountControl |
Combien de comptes sont bloqués ou désactivés ? | userAccountControl |
Est-ce qu’un compte est approuvé pour la délégation Kerberos ? | userAccountControl |
La « master key » de mon domaine a-t-elle été modifiée récemment ? | pwdLastSet du compte Krbtgt |
Exemple de graphique extrait d’IAMBuster exploitant les dates de changement de mot de passe et les dates de dernière connexion des utilisateurs
- Managed Service Accounts : https://learn.microsoft.com/en-us/azure/active-directory/fundamentals/service-accounts-standalone-managed
- https://learn.microsoft.com/en-US/windows-server/identity/ad-ds/manage/understand-security-identifiers
- https://github.com/xalicex/AD-description-password-finder
- https://social.technet.microsoft.com/wiki/contents/articles/22461.understanding-the-ad-account-attributes-lastlogon-lastlogontimestamp-and-lastlogondate.aspx
- https://specopssoft.com/support/en/password-reset/understanding-privileged-accounts-and-adminsdholder.htm
- https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc756101(v=ws.10)?redirectedfrom=MSDN