Introduction aux vulnérabilités des Property Sets Active Directory
Active Directory constitue l'épine dorsale de la gestion des identités dans les environnements Windows d'entreprise. Cependant, une fonctionnalité méconnue expose potentiellement votre organisation à des risques de sécurité significatifs : la capacité native des utilisateurs à modifier certains attributs de leur propre compte.
Risque de sécurité
Par défaut, tout utilisateur authentifié peut modifier plus de 70 attributs de son compte AD via le Property Set "Personal-Information". Cette capacité peut compromettre la gouvernance des identités et les mécanismes d'autorisation basés sur ces attributs.
Cette configuration par défaut représente un angle mort dans la sécurité AD, particulièrement problématique dans les architectures hybrides avec synchronisation vers Microsoft Entra ID et les environnements utilisant des groupes dynamiques.
Architecture des Property Sets dans Active Directory
Mécanisme technique des Property Sets
Les Property Sets constituent des regroupements logiques d'attributs d'objets AD. Chaque attribut peut appartenir à zéro ou un Property Set, cette appartenance étant définie par l'attribut attributeSecurityGUID qui correspond au rightsGUID du Property Set.
1# Enumération des Property Sets disponibles2Get-ADObject -SearchBase "CN=Extended-Rights,CN=Configuration,DC=domain,DC=com" -Filter {objectClass -eq "controlAccessRight"} | Select-Object Name, DisplayName, rightsGuidLe Property Set Personal-Information présente une ACE (Access Control Entry) spécifique accordant des droits d'écriture à l'autorité SELF, permettant ainsi à tout utilisateur authentifié de modifier ses propres attributs appartenant à ce regroupement.
Analyse des permissions SELF
1# Vérification des permissions SELF sur un utilisateur2$UserDN = "CN=user,OU=Users,DC=domain,DC=com"3$ACL = Get-ACL "AD:$UserDN"4$ACL.Access | Where-Object {$_.IdentityReference -match "SELF" -and $_.ActiveDirectoryRights -match "WriteProperty"}Outils d'exploitation
Les utilisateurs peuvent exploiter cette fonctionnalité via de nombreux outils : PowerShell, Apache Directory Studio, ADExplorer, ou même l'outil intégré Windows rundll32.exe dsquery,OpenQueryWindow.
Inventaire technique des attributs exposés
Script d'énumération PowerShell
Pour identifier précisément les attributs concernés dans votre environnement :
1function Get-ADPropertySet {2 param(3 [Parameter(Mandatory=$true)]4 [string]$PropertySetName5 )6 7 $ConfigContext = (Get-ADRootDSE).configurationNamingContext8 $PropertySet = Get-ADObject -SearchBase "CN=Extended-Rights,$ConfigContext" -Filter {Name -eq $PropertySetName}9 10 if ($PropertySet) {11 $Attributes = Get-ADObject -SearchBase "CN=Schema,$ConfigContext" -Filter {attributeSecurityGUID -eq $PropertySet.rightsGuid} -Properties lDAPDisplayName,attributeSecurityGUID12 return $Attributes | Select-Object lDAPDisplayName, attributeSecurityGUID13 }14}15 16# Utilisation17Get-ADPropertySet -PropertySetName "Personal-Information"Attributs critiques selon la version AD
| Version AD | Nombre d'attributs | Attributs critiques ajoutés |
|---|---|---|
| 2008 R2 | ~45 | Attributs de base (téléphone, adresse) |
| 2012/2012 R2 | ~65 | msDS-cloudExtensionAttribute1-20, msDS-GeoCoordinates* |
| 2016-2025 | ~70 | msDS-ExternalDirectoryObjectId |
| 2016-2025 + Exchange | ~71 | publicDelegates |
Les attributs les plus sensibles incluent :
- msDS-cloudExtensionAttribute1 à msDS-cloudExtensionAttribute20 : Utilisés pour la synchronisation hybride
- streetAddress, l (city), c (country), st : Informations géographiques
- physicalDeliveryOfficeName : Localisation physique
- msDS-ExternalDirectoryObjectId : Identifiant de synchronisation Entra ID
Impacts sur la gouvernance des identités
Scénarios d'exploitation
Reconnaissance des groupes dynamiques Exchange
Un utilisateur malveillant peut identifier les critères des groupes de distribution dynamiques :
1Connect-ExchangeOnline2Get-DynamicDistributionGroupMember -Identity "Groupe-Sensible" | Get-User | Select-Object DisplayName, City, DepartmentModification d'attributs pour infiltration
Après identification des critères, l'utilisateur peut modifier ses attributs pour rejoindre le groupe :
1# Via ADSI Edit ou PowerShell avec des droits utilisateur standard2Set-ADUser -Identity $env:USERNAME -City "Paris" -Department "Finance"Escalade de privilèges
L'appartenance au groupe dynamique peut octroyer des accès supplémentaires aux ressources sensibles.
Reconnaissance via Azure Hound
Pour les environnements hybrides, les attaquants peuvent utiliser Azure Hound pour cartographier les groupes dynamiques Entra ID :
1# Énumération des groupes dynamiques2./azurehound.exe list -u "user@domain.com" -p "password" -t "tenant.onmicrosoft.com" -o tenant.json3 4# Extraction des règles d'appartenance5jq '.data[] | select(.kind == "AZGroup" and .data.membershipRule != null) | .data.displayName, .data.membershipRule' tenant.jsonImpact critique
Cette technique permet l'identification des critères d'appartenance aux groupes sensibles sans privilèges administratifs, facilitant les attaques d'escalade de privilèges.
Stratégies de mitigation technique
Méthode 1 : Restriction des accès PowerShell Exchange
1# Création d'une politique de restriction Exchange PowerShell2New-RoleAssignmentPolicy -Name "RestrictedUsers" -IsDefault:$false3Set-RoleAssignmentPolicy -Identity "Default Role Assignment Policy" -Roles @()4 5# Application aux utilisateurs non-administrateurs6Get-User -Filter {IsInRoles -eq $false} | Set-User -RoleAssignmentPolicy "RestrictedUsers"Méthode 2 : Suppression d'attributs du Property Set
Précaution critique
La modification du schéma AD est irréversible. Testez impérativement en environnement de développement et assurez-vous de disposer de sauvegardes complètes.
Script de suppression sécurisée
1function Remove-ADAttributeFromPropertySet {2 [CmdletBinding(SupportsShouldProcess, ConfirmImpact='High')]3 param(4 [Parameter(Mandatory=$true)]5 [string[]]$ADProperties,6 [switch]$Simulation7 )8 9 $ConfigContext = (Get-ADRootDSE).configurationNamingContext10 $SchemaContext = (Get-ADRootDSE).schemaNamingContext11 12 foreach ($Property in $ADProperties) {13 try {14 $AttributeObject = Get-ADObject -SearchBase "CN=Schema,$ConfigContext" -Filter {lDAPDisplayName -eq $Property} -Properties attributeSecurityGUID15 16 if ($AttributeObject.attributeSecurityGUID) {17 if ($Simulation) {18 Write-Host "[SIMULATION] Suppression de l'attribut $Property du Property Set" -ForegroundColor Yellow19 } elseif ($PSCmdlet.ShouldProcess($Property, "Suppression du Property Set")) {20 Set-ADObject -Identity $AttributeObject.DistinguishedName -Clear attributeSecurityGUID21 Write-Host "Attribut $Property supprimé avec succès du Property Set" -ForegroundColor Green22 }23 } else {24 Write-Warning "L'attribut $Property n'appartient à aucun Property Set"25 }26 } catch {27 Write-Error "Erreur lors de la modification de l'attribut $Property : $($_.Exception.Message)"28 }29 }30}Suppression ciblée des attributs sensibles
Simulation préalable
1# Test de suppression sans modification réelle2$SensitiveAttributes = @(3 "msDS-cloudExtensionAttribute1",4 "msDS-cloudExtensionAttribute2",5 "msDS-cloudExtensionAttribute3",6 "streetAddress",7 "l",8 "physicalDeliveryOfficeName"9)10 11Remove-ADAttributeFromPropertySet -ADProperties $SensitiveAttributes -SimulationApplication des modifications
1# Suppression effective après validation2Remove-ADAttributeFromPropertySet -ADProperties $SensitiveAttributes -Confirm:$falseVérification post-modification
1# Contrôle de l'efficacité2Get-ADPropertySet -PropertySetName "Personal-Information" | Where-Object {$_.AttributeLDAPDisplayName -in $SensitiveAttributes}Attributs à préserver
Recommandations de sécurité
Conservez ces attributs dans le Property Set Personal-Information car leur modification par les utilisateurs est fonctionnellement justifiée :
- userCertificate : Requis pour l'authentification par certificat
- msDS-FailedInteractiveLogonCount : Métadonnées de sécurité système
- msDS-ExternalDirectoryObjectId : Critique pour la synchronisation hybride
Surveillance et détection
Audit des modifications d'attributs
1# Configuration de l'audit des modifications d'objets2auditpol /set /subcategory:"Directory Service Changes" /success:enable /failure:enable3 4# Script de surveillance PowerShell5Get-WinEvent -FilterHashtable @{LogName='Security'; ID=5136} | 6Where-Object {$_.Message -match "Personal-Information"} | 7Select-Object TimeCreated, @{Name='User';Expression={($_.Message -split '\r?\n' | Select-String 'Account Name:').ToString().Split(':')[1].Trim()}}, @{Name='Attribute';Expression={($_.Message -split '\r?\n' | Select-String 'Attribute:').ToString().Split(':')[1].Trim()}}Monitoring via Microsoft Sentinel
1// KQL pour détection des modifications suspectes2SecurityEvent3| where EventID == 51364| where EventData contains "Personal-Information"5| extend User = extract(@"Account Name:\s*([^\r\n]+)", 1, EventData)6| extend Attribute = extract(@"Attribute:\s*([^\r\n]+)", 1, EventData)7| extend ObjectDN = extract(@"Object DN:\s*([^\r\n]+)", 1, EventData)8| where User !in ("SYSTEM", "NETWORK SERVICE")9| summarize Count = count() by User, Attribute, bin(TimeGenerated, 1h)10| where Count > 10 // Seuil de détectionConclusion et recommandations architecturales
La sécurisation des Property Sets Active Directory nécessite une approche multicouche combinant :
- Audit technique complet de vos attributs sensibles
- Suppression ciblée des attributs critiques du Property Set Personal-Information
- Surveillance continue des modifications d'attributs
- Révision des groupes dynamiques basés sur des attributs modifiables
Approche DevSecOps
Intégrez ces contrôles dans vos pipelines d'infrastructure as code (Terraform, Bicep) pour maintenir la cohérence de sécurité across environments.
Cette vulnérabilité, bien que peu documentée, représente un vecteur d'attaque significatif dans les environnements hybrides modernes. Sa mitigation proactive renforce considérablement la posture de sécurité de votre infrastructure Microsoft 365.
