Aller au contenu

Multi-domaines, arborescences et forêts Active Directory

Dans une architecture Active Directory d’entreprise, les identités et les ressources sont organisées selon trois niveaux hiérarchiques :

  1. Domaine : l’unité administrative de base contenant son propre annuaire (partition de domaine dans ntds.dit), ses stratégies de sécurité (Default Domain Policy), ses comptes et ses contrôleurs de domaine (DC).
  2. Arbre de domaines (tree) : une suite hiérarchique de domaines partageant un espace de noms DNS continu (ex: corp.ad.sec et emea.corp.ad.sec) reliés automatiquement par des approbations bidirectionnelles transitives parent-enfant.
  3. Forêt (forest) : l’instance de sécurité suprême et globale. Elle regroupe un ou plusieurs arbres de domaines. Tous les domaines d’une même forêt partagent un schéma commun (Schema Partition), une configuration commune (Configuration Partition) et un Catalogue Global commun (GC - Global Catalog).

Face à un incident survenant dans un domaine enfant ou satellite :

  • L’illusion du cloisonnement : les équipes réseau et système pensent souvent que compromettre filiale.corp.local ne menace pas le domaine racine corp.local. En réalité, un administrateur du domaine enfant détient les droits d’écriture sur des objets partagés et peut forger des tickets inter-domaines (sIDHistory, Golden Ticket inter-domaine) pour conquérir le domaine racine.
  • Réplication et visibilité des traces : la partition de domaine n’est pas répliquée sur les contrôleurs de domaine des autres domaines de la forêt. Si un compte utilisateur du domaine A est créé ou compromis, ses événements d’authentification locale ou de modification d’objet n’apparaîtront que sur les DC du domaine A. En revanche, le Catalogue Global (GC, port 3268/3269) réplique un ensemble partiel d’attributs (PAS - Partial Attribute Set) sur toute la forêt.
  • Détermination du périmètre de compromission (blast radius) : dès qu’un attaquant obtient les privilèges Domain Admins dans n’importe quel domaine d’une forêt, l’investigateur doit immédiatement considérer l’ensemble des domaines de la forêt comme potentiellement compromis.

Le fichier de base de données ntds.dit de chaque DC est structuré en plusieurs contextes de nommage (NC - Naming Contexts) :

┌──────────────────────────────────────────────┐
│ FORÊT ACTIVE DIRECTORY │
├──────────────────────────────────────────────┤
│ 1. Schema NC (Répliqué sur TOUTE la forêt) │
│ 2. Configuration NC (Répliqué TOUTE forêt) │
└──────────────────────┬───────────────────────┘
│
┌─────────────────────────┴─────────────────────────┐
▼ ▼
┌──────────────────────────────┐ ┌──────────────────────────────┐
│ Domaine Racine: corp.local │ │ Domaine Enfant: emea.corp │
├──────────────────────────────┤ ├──────────────────────────────┤
│ 3. Domain NC (corp.local) │◄──Approbi.───►│ 3. Domain NC (emea.corp) │
│ (Répliqué uniquement DC │ Parent- │ (Répliqué uniquement DC │
│ de corp.local) │ Enfant │ de emea.corp) │
└──────────────────────────────┘ └──────────────────────────────┘
  1. Partition schéma : définit toutes les classes d’objets (utilisateurs, ordinateurs, groupes) et leurs attributs. Unique pour toute la forêt. Modifiable uniquement sur le rôle FSMO Schema Master.
  2. Partition configuration : contient la topologie physique de la forêt (sites AD, sous-réseaux, partitions applicatives, connexions de réplication, relations d’approbation). Unique pour toute la forêt.
  3. Partition domaine : contient tous les objets créés dans le domaine spécifique (utilisateurs, machines, groupes, OUs). Chaque domaine possède sa propre partition de domaine isolée.
  4. Catalogue global (GC) : service hébergé par certains DC (par défaut au moins le premier DC de la forêt) qui conserve une copie complète de sa propre partition de domaine et une copie en lecture seule du Partial Attribute Set de toutes les autres partitions de domaine de la forêt.

  • Découvrir l’ensemble des domaines et de la forêt depuis n’importe quel poste joint : un compte utilisateur standard peut interroger le DNS ou LDAP (Configuration NC) pour cartographier l’intégralité des domaines de la forêt, leurs relations d’approbation et l’emplacement de tous les DC.
  • Accéder aux ressources cross-domaines autorisées : si un groupe d’un domaine racine est ajouté dans la DACL d’un partage d’un sous-domaine, l’authentification Kerberos inter-domaine s’opère de façon totalement transparente grâce aux referrals Kerberos.
  • Escalader horizontalement puis verticalement au sein de la forêt : un attaquant maîtrisant le hash krbtgt d’un sous-domaine peut forger un ticket inter-domaine contenant le SID du groupe Enterprise Admins (RID 519) du domaine racine via l’attribut sIDHistory (si le filtrage de SID n’est pas activé, or intra-forêt il ne l’est pas par défaut).

  • Isoler de façon étanche deux domaines d’une même forêt : il est techniquement impossible de garantir qu’un administrateur du domaine enfant ne puisse pas compromettre le domaine parent sans briser le fonctionnement même de la forêt.
  • Trouver les journaux de sécurité d’un domaine sur le DC d’un autre domaine : si un attaquant effectue du Password Spraying contre les utilisateurs de emea.corp.local, les événements 4625 (échec d’authentification) ne seront jamais enregistrés sur les DC de corp.local ou apac.corp.local.
  • Répliquer les mots de passe et hashs NTLM hors de leur domaine : la partition de domaine contenant les hashs de mots de passe n’est répliquée qu’entre DC du même domaine. Le GC ne contient pas les attributs de mot de passe (unicodePwd, dBCSPwd).

Confusion fréquenteRéalité forensique vérifiable
« Nous avons deux domaines séparés dans la même forêt, donc la compromission du domaine B n’affecte pas le domaine A. »Faux. La forêt est la seule frontière de sécurité. L’accès T0 à un domaine quelconque confère la possibilité technique de compromettre toute la forêt.
« J’ai analysé les logs du DC racine, aucune création de compte suspecte n’apparaît. »La création de compte dans un domaine enfant n’est loguée que sur le DC du domaine enfant concerné. Les DC racine ignorent cette activité locale.
« Le Catalogue Global contient toutes les informations de tous les domaines. »Le GC ne stocke qu’un sous-ensemble d’attributs (PAS). Par exemple, les hashs de mots de passe ou l’attribut msDS-KeyCredentialLink ne sont pas dans le GC.

Lors d’une attaque par ransomware, le poste d’un commercial de la filiale suisse (ch.megacorp.local) est compromis. L’attaquant exécute un dump LSASS et obtient les identifiants d’un Domain Admin local à ch.megacorp.local.

L’analyste DFIR constate :

  1. Sur les DC de ch.megacorp.local, l’attaquant effectue un DCSync et extrait le hash NTLM du compte krbtgt de ch.megacorp.local.
  2. L’attaquant forge un TGT Kerberos inter-domaine en injectant dans sIDHistory le SID S-1-5-21-ROOT-519 correspondant au groupe Enterprise Admins du domaine racine megacorp.local.
  3. L’attaquant présente ce ticket au DC du domaine racine. En l’absence de SID Filtering au sein de la même forêt, le DC racine valide le ticket et accorde à l’attaquant un accès total à tous les DC de tous les pays du groupe.

  1. Active Directory configuration naming context :
    • Objet CN=Partitions,CN=Configuration,DC=root,DC=local : liste tous les domaines légitimes de la forêt (crossRef objects).
  2. Événements sur les DC du domaine enfant :
    • Event ID 4662 (Directory service access) : lecture de l’objet krbtgt ou droits étendus de réplication (DCSync : DS-Replication-Get-Changes-All).
  3. Événements sur les DC du domaine racine :
    • Event ID 4769 (Kerberos service ticket requested) : demande de TGS pour krbtgt/root.local émise par un compte provenant d’un domaine enfant.
    • Event ID 4624 (logon type 3) : connexion réseau SMB/RPC vers les DC racine utilisant un compte du sous-domaine avec des privilèges anormaux.

  1. Identifier la hiérarchie complète de la forêt : Exécuter [System.DirectoryServices.ActiveDirectory.Forest]::GetCurrentForest() pour cartographier les arbres, les domaines et les catalogues globaux.
  2. Extraire la liste des contrôleurs de domaine par domaine : Collecter la liste exacte des DC pour chaque domaine afin de ne pas omettre de sources d’événements 4624/4625/4768/4769 lors de la collecte forensique.
  3. Vérifier l’activation du SID filtering intra-forêt : Vérifier si le filtre de SID a été manuellement durci sur les approbations intra-forêt (netdom trust <Domain> /filterSIDs:Yes).

  • PowerView / ActiveDirectory PowerShell :
    Fenêtre de terminal
    Get-ADForest | Select-Object Name, RootDomain, Domains, GlobalCatalogs
    Get-ADDomain -Identity "emea.corp.local" | Select-Object NetBIOSName, DomainSID, ReadOnlyReplicaDirectoryServers
  • BloodHound / SharpHound : Collecte des relations cross-domaines (--collectionmethods All,Trusts) pour visualiser les chemins d’escalade d’un domaine satellite vers le domaine racine.

  • Le domaine est une frontière administrative, la forêt est la frontière de sécurité.
  • La compromission d’un contrôleur de domaine dans n’importe quel domaine d’une forêt équivaut à la compromission de l’ensemble de la forêt.
  • Les logs de sécurité des domaines ne sont pas répliqués entre eux : chaque domaine doit faire l’objet d’une collecte d’artefacts distincte.