Persistance avec les ACLs2 minute(s) de lecture

Cet article traitera d’une méthode exotique de persistance en Active Directory qui utilise la DACL. Si cette dernière et son fonctionnement vous sont totalement inconnus je vous recommande de lire la partie sur l’exploitation la DACL. Les exemples qui seront fait utiliseront PowerView et un usage relativement avancé de PowerShell.

Discrétion

Avant d’étudier les différentes techniques, il est nécessaire de comprendre comment il est possible de cacher un objet dans un Active Directory. Que se passerait-il si une fois un compte à privilège obtenu, on décide d’ajouter une ACE interdisant à tout le monde de lire les enfants de l’OU parente ? On cacherait donc notre utilisateur, des autres objets qui essayeraient de lire les objets dans notre OU. Ce qui peut être fait comme ceci:

$User = Get-DomainUser PersistenceUser
$UserOU = $User.distinguishedname.SubString($User.distinguishedname.IndexOf("OU="))
$RawObject = Get-DomainOU -Raw -Identity $UserOU
$TargetObject = $RawObject.GetDirectoryEntry()

$ACE = New-ADObjectAccessControlEntry -InheritanceType All -AccessControlType Deny -PrincipalIdentity "S-1-1-0" -Right ListChildren # SID par defaut désignant everyone

$TargetObject.PSBase.ObjectSecurity.AddAccessRule($ACE)
$TargetObject.PSBase.CommitChanges()

Si l’on souhaite retirer les droits de potentiels administrateurs, la même méthode peut être utilisée, seulement en changeant le droit de ListChildren à GenericAll. Cependant, il reste toujours des techniques pour un administrateur de détruire notre persistance. Pour réduire encore plus le pouvoir de ces derniers, il est possible de changer le propriétaire de l’OU et de notre objet avec Set-DomainObjectOwner.

Avec DCSync

La méthode la plus simple consiste à laisser des droits très importants à un utilisateur compromis. L’idéal étant le droit DCSync qui autorise la réplication des hash du contrôleur de domaine. Cette technique à l’avantage d’être simple et très efficace. Cependant, bien que l’attaque DCSync ait tendance à être plutôt discrète, il est tout à fait possible de repérer cette dernière. De surcroît, il est aussi très aisé de déterminer quel utilisateur (ou groupe) possède ce droit, ce qui ne favorise pas la discrétion de la persistance et il est logiquement simple de la retirer. Une fois avoir obtenu l’accès à un compte avec privilège (ou possédant WriteDACL sur le domaine), on utilise PowerView de la sorte:

Add-DomainObjectAcl -PrincipalIdentity PersistenceUser -Rights DCSync DC=contoso,DC=local

Puis on extrait les hash en utilisant au choix mimikatz ou secretsdump.py de impacket (si vous ne connaissez pas impacket je vous recommande activement la vidéo de ProcessusThief sur ce sujet https://lestutosdeprocessus.fr/tuto-fr-les-outils-impacket-par-processus/ qui est pour le moins très complète). Avec mimikatz, l’exploitation ressemble à ceci:

lsadump::dcsync /user:krbtgt /domain:contoso.local

Avec AdminSDHolder

AdminSDHolder est un objet un peu particulier puisqu’il protège les groupes de sécurité d’éventuelles modifications non-désirées. Ainsi il a la capacité de restaurer et de modifier ces derniers. L’idée de cette persistance est de s’ajouter une ACL nous permettant dans le future de modifier, via AdminSDHolder, les membres des groupes d’administration, nous permettant ainsi de retrouver un contexte élevé. AdminSDHolder possède un chemin LDAP identique par défaut dans tous les domaines: CN=AdminSDHolder,CN=System,DC=contoso,DC=local. Pour créer la porte dérobée il suffit d’ajouter une ACL depuis un compte à privilège sur cet objet:

Add-DomainObjectAcl -TatgetIdentity "CN=AdminSDHolder,CN=System,DC=contoso,DC=local" -PrincipalIdentity PersistenceUser -Rights All

Puis nous cachons notre utilisateur avec les méthodes présentées. Pour exploiter notre persistance, il faut retrouver un accès en tant que PersistenceUser, puis choisir un compte administrateur faisant partie du groupe “Domain Admins” et d’arbitrairement changer son mot de passe avec Set-DomainUserPassword par exemple.

Conclusion

Dans cet article nous avons donc vu comment utiliser les ACLs comme moyen de persistance qui a l’avantage d’être plutôt discret. D’autres méthodes existent mais nécessitent la présence de technologie particulière installée dans l’environnement. Pour aller plus loin je vous conseille le papier de SpecterOps sur le sujet intitulé An Ace up the sleeve. J’espère que cet article vous aura plu.

Leave a Reply