Prérequis

Hello ! o/

Kerberos est le protocole d’authentification en Active Directory. Ce protocole sert à avoir accès aux services de l’AD. Il est divisé en plusieurs étapes:

Vous pouvez le voir comme un parc d’attraction vraiment chelou: vous avez plusieurs stands un peu partout dans le parc qui vous permettent d’avoir un ticket pour accéder à des tickets pour les attractions. Donc vous revenez au même stand de tickets pour demander un ticket pour une attraction grâce au ticket qu’on vous a donné juste avant. On vous donne un nouveau ticket pour accéderà l’attraction: vous vous hâtez avant qu’il ne soit plus valide, vous le donnez au mec qui gère l’attraction, il le vérifie et enfin vous laisse accéder à l’attraction.

Ces étapes sont en réalités définies comme ceci:

Source: Obtaining a Service Ticket

Source: Kerberos Network Authentication Service (V5) Synopsis

Pour référence à cet article, munissez vous de la RFC 4120

Authentication Service (AS)

La phase AS de Kerberos permet de s’authentifier auprès du KDC/DC. Ensuite, le KDC/DC offre au client un TGT (Ticket-Granting-Ticket) et une clef de session. C’est du TCP donc on a le classique “3 handshakes” SYN-SYNACK-ACK sur le port 88 (TCP/88).

Kerberos Authentication Service Request (KRB_AS_REQ)

En premier lieu, le client se connecte sur le réseau en tapant sont login et son password. Le client Kerberos sur la machine de l’utilisateur convertit le mot de passe utilisateur en clef de chiffrement symétrique.

On peut aussi utiliser un clef publique en guise de mot de passe, c’est au autre mécanisme d’authentification comme pkinit (RFC 4556) (donc par une clef PKI)

Votre client Kerberos envoie donc une demande de TGT au KDC avec comme payload:

Champ Description
pvno Version du protocole Kerberos, actuellement 5
msg-type Type de message, ici KRB_AS_REQ
kdc-options Flags
cname Client/User Principal Name (CPN / UPN)) (exemple: utilisateur@domain.com
realm Kerberos Principal Name (KPM) / Windows domain name
sname Service Principal Name* (SPN), ici “krbtgt”
from Timestamp, c’est le starttime dont on parle dans la RFC
till Temps d’expiration de KRB_AS_REQ
rtime Temps d’expiration pour un ticket RENEWABLE
nonce Nombre random de type uint32_t généré par le client
etype Encryption Types: c’est les methodes de chiffrement acceptées par notre client
addresses Adresse du client, contient d’autres adresses si on passe par un proxy

Source: Kerberos Authentication - HackTricks

Kerberos Authentication Service Reply (KRB_AS_REP)

Le serveur d’authentification (KDC) reçoit donc les données. Il vérifie le cname et en extrait les clefs respectives, car oui il peut y avoir plusieurs clefs. Dans ce cas il prend celles définient par le champ etype de KRB_AS_REQ pour sélectionner la méthode de chiffrement à utiliser pour protéger une partie de KRB_AS_REP. Si il y a plusieurs valeurs dans etype, on prend la première valide.

Il est à noter que si votre Kerberos en AD utilise un système de chiffrement symétrique faible, il sera faillible à plusieurs attaques informatique. Vous avez plusieurs méthodes de chiffrement disponibles:

Le KDC renvoie plusieurs éléments de réponse:

En plus détaillé, ça fait:

Champ Description
padata Pre-Authentication Data
crealm Contient le nom du realm où le client s’est auth initialement
ticket Structure de donnée pour un ticket/authenticator
tkt-vno Version du format du ticket
realm Quel realm a fournit le ticket
enc-part Encrypted Part, chiffré symétriquement et uniquement lisible par le KDC
key Clef de session pour être passée du Kerberos à l’AP et au Client
transited Kerberos realms qui ont participé à l’authentification du client
authtime Timestamp de l’auth initiale
starttime Timestamp à partir duquel le ticket est valide
endtime Timestamp à partir duquel le ticket est invalide
renew-till Si RENEWABLE. Indique le maximum endtime pour un renouvellement, peut-être considéré comme le endtime absolu
caddr Adresses qui peuvent utiliser le ticket, si vide, n’importe quelle adresse peut utiliser le ticket
authorization-data Le PAC, c’est la liste des restrictions du ticket
enc-part Chiffré symétriquement et lisible par KDC et Client
last-req Timestamp de la dernière requête pour un TGT dans un contexte spécifique
lr-type last-req type, aide pour interpréter lr-value (contexte)
lr-value last-req value, timestamp
key-expiration Timestamp à partir duquel la clef secrète du client expire

Source: Kerberos Authentication - HackTricks

Ticket-Granting-Service (TGS)

Maintenant que notre client a son TGT avec ses droits inscrits dessus, il peut demander au KDC d’accéder aux services du réseau en demandant un TGS (Un ticket qui donne accès à un service) sous la forme d’un couple Clef de session/TGS.

Kerberos Ticket-Granting-Service Request (KRB_TGS_REQ)

Le client Kerberos de l’utilisateur demande donc au KDC sous la forme d’un KRB_TGS_REQ un TGS. Grosso merdo, le message consiste à donner :

Définition de l’authenticator

Champ Description
authenticator Chiffré avec la clef de session
authenticator-vno Version de l’authenticator
ck-sum checksum
cusec Client USeconds (micro seconds) du timestamp
ctime Timestamp du client
subkey Clef a utiliser pour KRB_TGS_REP, si vide: clef de session du TGT
seq-number Détecter les requêtes rejouées, agit un peu comme l’ACK de TCP
authorization-data restrictions additionnelles par rapport à celles du TGT

Ce qui change dans la requête c’est le flag ENC-TKT-IN-SKEY qui permet de dire au KDC qu’on ajoute le TGT à la requête dans le champ additional-tickets, ainsi qu’un champ optionnel enc-authorization-data.

Champ Description
enc-authorization-data PAC désiré, chiffré avec la clef de session (sinon clef TGT)
additional-tickets Tickets additionnels à la requête

Source: Kerberos Authentication - HackTricks

Kerberos Ticket-Granting-Service Reply (KRB_TGS_REP)

Le KDC reçoit le KRB_TGS_REQ. Il est processé pareillement que KRB_AS_REQ, mais avec plus de checks, ce qui est logique.. s’il y a plus de données, il y a plus de checks à faire. Par exemple on va comparer le TGT et l’Authenticator.. histoire de voir si le TGT appartient bien au client, donc on va comparer cname et key. Ensuite on check si le client a bien le droit d’accéder au sname grâce au PAC (authorization-data du ticket TGT)

La requête détaillée se trouve ci-dessous:

Champ Description
ticket:enc-part Chiffré symétriquement et lisible par KDC et le service/AP
enc-part Chiffré symétriquement et lisible par KDC et le Client

C’est son ticket d’entrée pour rentrer dans le service ! Hooray \o/ !

Source: Kerberos Authentication - HackTricks

Authentication Protocol (AP)

On y est ! Désormais le but est de créer une communication sécursiée avec le service et nous. Le service pourra déchiffrer notre TGS grâce à sa propre clef. On rappelle que le TGS permet d’authentifier le client sur le service.

Kerberos Authentication Protocol Request (KRB_AP_REQ)

Notre client doit faire le premier par vers le service. Par conséquent, grâce à la KRB_TGS_REP nous avons accès à la clef de session du service. On va donc générer nos nouveaux authentifiant pour le service: un authenticator chiffré avec la clef de session du service. On enverra à la suite notre TGS qu’on ne peut pas lire (mais le service oui).

Champ Description
authenticator Chiffré avec la clef de session du service

Source: Kerberos Authentication - HackTricks

Kerberos Authentication Protocol Reply (KRB_AP_REP)

Enfin, si tout est bon, c’est-à-dire après comparaison entre le TGS et l’authenticator, le client peut accéder au service. Attention cependant, le service peut demander confirmation du PAC au KDC. Dans le cas où le bit mutual-required(2) est mis dans ap-options, le service renverra bien un KRB_AP_REP.

Merci pour votre lecture :)

Liens utiles

Kerberos en Active Directory (Hackndo) Kerberos Authentication Obtaining a Service Ticket Authentication Service Exchange Kerberos Network Authentication Service (V5) Synopsis Kerberos Explained Kerberos (protocole) Are there any reasons for Kerberos being based on symmetric cryptography? Kerberos authentication explained RFC 4120 RFC 4120 FR