Kerberos en Active Directory
Pour ce premier « vrai » article, le sujet sera le fonctionnement de Kerberos, l’un des protocoles d’authentification au cœur d’Active Directory. Le comprendre permet de comprendre une bonne partie des attaques sur celui-ci (AS-REP roasting, Kerberoasting, Golden et Silver Tickets, etc.). L’objectif de cet article est surtout d’expliquer :
- comment un utilisateur prouve son identité sans envoyer son mot de passe ;
- pourquoi copier un ticket ne suffit pas à s’en servir (et où un attaquant va donc le chercher) ;
- qui chiffre quoi, avec quelle clé ;
- ce qu’un attaquant regarde à chaque étape.
Cet article doit beaucoup à celui de Pixis sur hackndo, qui m’a permis de comprendre de nombreuses bases d’Active Directory lorsque j’ai débuté le pentest. Je ne peux donc que vous recommander d’aller le lire et de profiter de son contenu comme j’ai pu le faire il y a quelques années.
Les animations sont censées se suffire à elles-mêmes. Lancez-les une par une et zappez le texte, il est là pour détailler si l’on veut tout comprendre depuis zéro.
Maintenant, allons-y pour l’explication !
Le problème : ouvrir un partage sans donner son mot de passe
Alice, comptable dans l’entreprise, veut ouvrir le partage \\FS01\compta depuis son poste. Le serveur doit savoir à qui il a affaire, avec deux contraintes :
- le mot de passe d’Alice ne doit jamais circuler sur le réseau, même chiffré ;
- FS01 ne doit pas avoir à connaître le mot de passe de tous les utilisateurs du domaine.
Kerberos résout ce problème avec un tiers de confiance, le KDC (Key Distribution Center). Dans un domaine Active Directory, c’est le contrôleur de domaine qui joue ce rôle. Le parcours se fait en trois temps :
- Alice se fait reconnaître par le KDC, une seule fois, et reçoit un justificatif ;
- avec ce justificatif, elle demande un ticket pour le service qui l’intéresse ;
- elle présente ce ticket au service.
Ces trois échanges portent des noms qu’on retrouve partout (dans Wireshark, dans les outils, dans les journaux) : AS (Authentication Service), TGS (Ticket-Granting Service) et AP (Application). Le justificatif obtenu au premier échange s’appelle le TGT (Ticket-Granting Ticket).
Chaque animation se lit étape par étape, avec les boutons ◀ ▶ ou les flèches du clavier. Une boîte au bord coloré est chiffrée avec la clé de la même couleur : tant qu’elle est hachurée, son contenu est illisible, et elle ne s’ouvre que chez un acteur qui possède cette clé.
Une image pour fixer les idées : un grand hôtel, avec une piscine, une salle de sport, un spa et un restaurant.
- La réception : prouver son identité. En arrivant, Alice présente sa carte d’identité. Le réceptionniste vérifie qu’elle est bien cliente de l’hôtel et lui remet une carte de résident, qui prouve qu’elle a été identifiée. C’est l’échange AS, et la carte de résident, c’est le TGT.
- La conciergerie : demander un accès. Alice veut aller au spa. Elle présente sa carte de résident au concierge, qui la vérifie et lui remet un pass valable pour le spa, et pour lui seul. C’est l’échange TGS, et le pass, c’est le ticket de service.
- Le spa : utiliser son accès. À l’entrée du spa, l’employé vérifie que le pass est valide et qu’il correspond bien au spa, puis laisse entrer Alice, sans appeler la conciergerie. C’est l’échange AP.
- Et la piscine ? Pas besoin de repasser à la réception avec sa carte d’identité : Alice retourne à la conciergerie avec sa carte de résident et obtient un nouveau pass, pour la piscine cette fois.
La réception et la conciergerie sont deux guichets du même acteur, le KDC : c’est lui qui distribue à la fois les TGT et les tickets de service.
L’image a une limite : une carte ou un pass, ça se vole. En Kerberos, présenter un ticket ne suffit pas, il faut aussi prouver qu’on en est le propriétaire légitime. C’est tout l’objet de la section « Pourquoi copier un ticket ne suffit pas ».
Qui connaît quelle clé
Kerberos repose entièrement sur des clés secrètes partagées : c’est du chiffrement symétrique, la même clé chiffre et déchiffre. Chaque compte du domaine, utilisateur ou machine, possède une clé dérivée de son mot de passe, et ne connaît que sa propre clé. Le KDC, lui, les connaît toutes, plus une qui n’appartient qu’à lui : celle du compte spécial krbtgt.
Tout le reste découle de là : le KDC peut écrire à n’importe qui un message que seul ce destinataire saura lire, et un destinataire qui arrive à ouvrir un message chiffré avec sa clé sait qu’il a été écrit par le KDC (ou par lui-même).
Une seule clé par compte, vraiment ?
Pour simplifier, les animations montrent une clé par compte. En réalité, un compte en a plusieurs, une par algorithme de chiffrement : une clé RC4, qui n’est autre que le hash NT du mot de passe, et des clés AES, dérivées du mot de passe avec un sel (formé du nom du domaine et du compte). Le client et le KDC s’accordent sur l’algorithme à chaque échange.
La clé krbtgt est le secret le plus précieux du domaine : avec elle, on peut fabriquer soi-même un TGT au nom de n’importe qui, avec les groupes de son choix. C’est le Golden Ticket. Comme cette clé ne quitte jamais les contrôleurs de domaine, il faut d’abord les avoir compromis pour l’obtenir : le Golden Ticket est une technique de persistance, pas d’intrusion.
Étape 1 (AS) : obtenir un TGT
Suivons Alice, elle vient de taper son mot de passe à l’ouverture de session : son poste en a dérivé sa clé, et ne se servira plus du mot de passe lui-même.
KRB_AS_REQ : prouver qu’on connaît son secret
Alice demande un TGT au KDC. Sa requête contient son nom (en clair) et l’heure actuelle (chiffrée avec sa propre clé). Cette heure chiffrée est la pré-authentification : seul quelqu’un qui connaît la clé d’Alice a pu la produire.
À la réception de ce message, le KDC récupère la clé d’Alice dans sa base et déchiffre l’horodatage. S’il obtient une heure proche de la sienne (5 minutes d’écart tolérées par défaut), la demande vient bien de quelqu’un qui connaît le secret d’Alice. Sinon, elle est rejetée (c’est l’une des raisons pour lesquelles les horloges d’un domaine doivent rester synchronisées).
KRB_AS_REP : deux parties pour deux lecteurs
Ensuite, le KDC génère au hasard une clé de session, valable le temps du TGT, puis répond avec deux parties :
- une partie pour Alice, chiffrée avec la clé d’Alice, qui contient la clé de session ;
- le TGT, chiffré avec la clé
krbtgt. Il contient le nom d’Alice, la période de validité du TGT, la même clé de session et le PAC, qui décrit les groupes d’Alice (on l’ouvrira à l’étape 3).
À ce stade, on peut se demander : pourquoi deux parties ? Parce qu’il y a deux lecteurs. La première est pour Alice, tout de suite. Le TGT est pour le KDC lui-même, plus tard : c’est une note qu’il s’adresse à lui-même et qu’il confie au client. Alice ne peut pas la lire, elle la garde telle quelle pour la présenter à sa prochaine demande. Grâce à elle, le KDC n’a pas besoin de se souvenir d’Alice entre deux échanges.
La partie pour Alice est chiffrée avec une clé dérivée de son mot de passe. Si un compte a la pré-authentification désactivée (option Do not require Kerberos preauthentication), n’importe qui peut demander une AS-REP à son nom, sans rien prouver, puis tester des mots de passe hors ligne contre cette partie chiffrée : c’est l’AS-REP roasting. Le principe est le même pour quelqu’un qui capture un AS-REQ sur le réseau : l’horodatage chiffré se prête aux mêmes essais.
Pourquoi copier un ticket ne suffit pas
Le TGT voyage sur le réseau. Un attaquant qui écoute le trafic peut donc en récupérer une copie. Que peut-il en faire ?
Rien, grâce à la clé de session. Chaque fois qu’elle présente un ticket, Alice y joint un authentifiant : son nom et l’heure, chiffrés avec la clé de session. Le ticket dit « voici Alice » ; l’authentifiant ajoute « et c’est bien moi qui le présente, la preuve : je connais la clé qui va avec ».
Or la clé de session n’a jamais circulé qu’à l’intérieur de boîtes fermées : avec la clé d’Alice dans l’AS-REP, et avec la clé krbtgt dans le TGT. L’attaquant qui a copié le trafic ne peut donc ni fabriquer un authentifiant neuf, ni lire les réponses du KDC, chiffrées elles aussi avec cette clé.
Retenez cette paire : un ticket ne sert à rien sans sa clé de session. Les deux échanges suivants appliquent exactement ce principe.
Sur le réseau, la clé de session est protégée. Sur le poste, en revanche, le cache Kerberos garde chaque ticket avec sa clé de session, pour que le système puisse s’en servir. Un attaquant administrateur du poste peut extraire les deux de la mémoire (du processus LSASS) et les réinjecter sur sa propre machine : c’est le pass-the-ticket.
Étape 2 (TGS) : demander un ticket pour un service
KRB_TGS_REQ : présenter son TGT
Alice veut maintenant utiliser le service de partage de fichiers de FS01, appelé CIFS. Elle envoie au KDC :
- son TGT, tel quel ;
- le nom du service visé, son SPN (Service Principal Name) :
CIFS/FS01; - un authentifiant, chiffré avec la clé de session.
Le KDC ouvre le TGT avec la clé krbtgt, y lit l’identité d’Alice et la clé de session, puis déchiffre l’authentifiant avec cette clé. Si les deux concordent et que l’heure est récente, la demande vient bien du détenteur légitime du TGT. À aucun moment la clé d’Alice n’intervient : le TGT en tient lieu pendant toute sa durée de validité (10 heures par défaut).
KRB_TGS_REP : un ticket pour FS01
Le KDC cherche ensuite quel compte porte le SPN CIFS/FS01 : ici, le compte machine FS01$. Il prépare, sur le même modèle que l’AS-REP :
- un ticket de service destiné à FS01 : nom du service, identité d’Alice, PAC et une nouvelle clé de session, le tout chiffré avec la clé de
FS01$; - une partie pour Alice, chiffrée avec la première clé de session, qui contient la nouvelle.
L’AS et le TGS ont la même forme : le KDC renvoie un ticket que le client ne peut pas lire, plus une clé de session que lui seul peut lire. Seule change la clé qui protège la partie du client : sa propre clé pour l’AS, la clé de session pour le TGS.
Le ticket de service est chiffré avec la clé du compte qui porte le SPN, et n’importe quel utilisateur du domaine peut demander un ticket pour n’importe quel SPN. Pour un compte machine, rien à en tirer : son mot de passe est aléatoire. Mais si le SPN est porté par un compte de service dont le mot de passe a été choisi par un humain (svc_sql, par exemple), on peut demander le ticket puis tester des mots de passe hors ligne contre lui : c’est le Kerberoasting.
Étape 3 (AP) : être reconnue, puis autorisée
KRB_AP_REQ : présenter le ticket au service
Alice envoie à FS01 le ticket de service et un nouvel authentifiant, chiffré avec la seconde clé de session. FS01 ouvre le ticket avec sa propre clé, sans appeler le KDC : en dehors de lui, seul le KDC connaît cette clé, donc seul le KDC a pu fabriquer ce ticket. Il y trouve la clé de session, déchiffre l’authentifiant et vérifie : même nom, heure récente, et un authentifiant qu’il n’a pas déjà reçu (il garde en mémoire ceux des dernières minutes, pour qu’une requête copiée ne puisse pas être rejouée). Alice est authentifiée.
Le PAC : qui est Alice, pour Windows
Kerberos dit qui est Alice, pas ce qu’elle a le droit de faire. Pour cela, Windows ajoute au ticket le PAC (Privilege Attribute Certificate) : le SID d’Alice, ceux de ses groupes, et des signatures qui empêchent de les modifier. Le KDC l’a rempli à la création du TGT, puis l’a recopié dans le ticket de service.
FS01 compare ces SID aux permissions du partage et des fichiers (les ACL), et décide. Le PAC ne donne aucun droit par lui-même : un ticket parfaitement valide n’ouvre que ce que les ACL autorisent. Et comme les groupes sont figés à la création du TGT, un utilisateur ajouté à un groupe doit obtenir un nouveau TGT (en pratique, rouvrir sa session) pour que cela compte.
Enfin, si le client demande l’authentification mutuelle, le serveur prouve à son tour son identité, en renvoyant une KRB_AP_REP chiffrée avec la clé de session : seul le vrai FS01 a pu ouvrir le ticket et en sortir cette clé.
FS01 fait confiance à tout ticket qui s’ouvre avec sa clé. Un attaquant qui a volé la clé de FS01$ peut donc fabriquer lui-même un ticket pour ce service, au nom de n’importe qui et avec le PAC de son choix, sans jamais parler au KDC : c’est le Silver Ticket. La signature du KDC dans le PAC ne peut pas être imitée sans la clé krbtgt, mais le serveur ne la fait pas toujours vérifier.
Le voir sur un vrai poste
Le parcours complet, d’un trait : Alice ouvre sa session, puis le partage de FS01. Le TGT obtenu au début reste en cache : tant qu’il est valide, il suffit, avec sa clé de session, pour demander d’autres tickets sans repasser par le mot de passe.
Le cache de tickets avec klist
Sur un poste du domaine, klist affiche le cache Kerberos de la session. L’expérience est simple : on vide le cache, on accède au partage, puis on regarde ce qui est revenu.
klist purgedir \\FS01\comptaklistDeux tickets doivent apparaître. Le TGT, dont le serveur est krbtgt/LAB.LOCAL, et le ticket de service, pour cifs/FS01.lab.local. Chacun indique ses heures de début et de fin, et son type de chiffrement : AES-256-CTS-HMAC-SHA1-96 sur un domaine récent, RSADSI RC4-HMAC si RC4 est encore utilisé. Windows a redemandé un TGT tout seul, sans redemander le mot de passe : il garde la clé d’Alice en mémoire pour la durée de la session.
dir \\192.168.1.20\compta n’utiliserait pas Kerberos : un ticket se demande pour un nom de service (le SPN), et par défaut il n’en existe pas pour une adresse IP. Windows se rabat alors sur NTLM.
Ce qu’il faut retenir
| Élément | Chiffré avec | Lisible par |
|---|---|---|
| Horodatage de pré-authentification (AS-REQ) | clé d’Alice | Alice, KDC |
| Partie client de l’AS-REP (clé de session 1) | clé d’Alice | Alice, KDC |
| TGT | clé krbtgt | KDC seul |
| Authentifiant du TGS-REQ | clé de session 1 | Alice, KDC |
| Partie client du TGS-REP (clé de session 2) | clé de session 1 | Alice, KDC |
| Ticket de service | clé de FS01$ | FS01, KDC |
| Authentifiant de l’AP-REQ, AP-REP | clé de session 2 | Alice, FS01 |
Le mot de passe ne circule jamais : il sert une fois, sur le poste, à dériver une clé. Ensuite :
- chaque message n’est lisible que par ceux qui doivent le lire ;
- chaque ticket prouve qu’il a été fabriqué par un détenteur de la bonne clé ;
- aucun ticket ne sert sans sa clé de session.
C’est tout pour cet article, qui voulait présenter les bases de Kerberos (et mentionner certaines des attaques liées). J’espère que le contenu n’était pas trop indigeste et que les animations ont pu rendre sa compréhension plus simple.