TL;DR: Introduction à l'attaque "Pass-The-PRT"
L'attaque "Pass-the-PRT" cible le Primary Refresh Token (PRT), un artefact clé de l'authentification Microsoft Entra. Le PRT est un jeton JWT (JSON Web Token) émis pour les brokers à jetons Microsoft internes, permettant l'authentification unique (SSO) sur les applications de ces appareils.
Un attaquant qui récupère le cookie PRT après la compromission d'un poste utilisateur peut se connecter à la session o365 de la victime, sans connaître son mot de passe et en contournant l'authentification MFA.
Un simple accès au context utilisateur est suffisant pour récupérer le cookie, les droits administrateur ne sont pas nécessaire.
Le cookie PRT
En décodant l'en-tête et le corps du JWT, voici à quoi ressemble le cookie PRT (aussi appelé x-ms-RefreshTokenCredential) :
{
"alg": "HS256",
"ctx": "oYKjPJyCZN92Vtigt/f8YlVYCLoMu383"
}
{
"refresh_token": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAZ18nQkT-eD6Hqt7sf5QY0iWPSssZOto]<...>VhcDew7XCHAVmCutIod8bae4YFj8o2OOEl6JX-HIC9ofOG-1IOyJegQBPce1WS-ckcO1gIOpKy-m-JY8VN8xY93kmj8GBKiT8IAA",
"is_primary": "true",
"win_ver": "10.0.19041.4474",
"windows_api_version": "2.0.1",
"x_client_platform": "windows",
"request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA"
}
Le véritable jeton PRT (Primary refresh token) correspond à l'élément refresh_token qui est chiffré par une clé d'Azure AD, ce qui rend son contenu indéchiffrable. Pour s'assurer que le cookie reste lié à la session de connexion à laquelle il est destiné, le champ request_nonce est transmis à partir de la page logon.microsoftonline.com.
Afin de tester la récupération de ce cookie dans notre lab, la première étape va être de créer un compte outlook pour obtenir une licence d’essaie sur office 365. Ensuite, il va être nécessaire de joindre un compte professionnel, ajouter la machine à Entra ID puis récupérer le token PRT pour bypasser l’authentification SSO de microsoft.
Mise en place d'un lab local
1/ Créer un compte outlook
Créer un simple compte outlook via ce lien : https://aka.ms/ciam-free-trial
2/ S’enregistrer sur l’essai de Office 365 Business avec le compte outlook
La version d’office 365 Business dispose de la licence entraID, ce qui permettra de tester le SSO sur les applications office 365.
Il est nécessaire d’ajouter ses infos personnelles :
-
Continuer avec l’adresse mail outlook créer lors de la première étape
-
Numéro de téléphone
-
Numéro de carte bancaire virtuelle (Veillez à bien penser à geler ou supprimer votre carte bancaire virtuelle)
Ensuite il sera nécessaire de configurer le compte avec l’adresse mail outlook créer précédemment. Dans notre cas, c’est Ballpoint75@outlook.fr
La version d’essai de Microsoft office 365 Business est confirmée.
3/ Joindre l’appareil à microsoft Entra
Maintenant, il est nécessaire de lié notre compte office business à microsoft Entra ID
-
Ajout d’un compte depuis Paramètres>Comptes>Accès Professionnel ou Scolaire>Joindre un compte à microsoft entra ID
-
Confirmer la liaison avec l’organisation
-
Cliquer sur changer d’utilisateur ==>Se connecter à la session avec les informations de l’organisation
Si vous n'arrivez pas à choisir "joindre un compte à microsoft entra ID", il faut supprimer le compte qui est déjà lié.
4/ Vérification de la présence du jeton PRT
A ce stade, le jeton PRT doit être configuré ! La commande suivante permet de vérifier les paramètres de la liaison et du bon fonctionnement des paramètres lié au SSO.
Il sera nécessaire de récupérer le tenantID car celui-ci sera nécessaire pour générer le cookie permettant de contourner l’authentification SSO.
Dsregcmd.exe /status
Vérifier que les options suivantes sont à Yes :
-
AzureAdJoined
-
AzureAdPrt
5/ Utiliser la suite office 365 (Version d’essai)
Il sera important d’installer la suite office 365 si vous ne l’avez pas sur votre machine virtuelle.
Il faudra se connecter avec le compte entra ID et cela confirmera et activera le SSO si toutes les étapes ont correctement été réalisé.
Problème de génération avec Mimikatz
Depuis octobre 2020, il n'est plus possible d'utiliser un cookie PRT sans nonce. Par conséquent, le nonce doit être récupéré afin de générer un PRT valide.
De ce fait la première méthode qui consiste à utiliser mimikatz pour récupérer le cookie PRT via le module cloudapkd ne fonctionne plus :
En vérifiant le contenu du cookie final et depuis le code source des packages mimikatz, on peut s’apercevoir de l’absence de la valeur nonce dans le module cloudap du projet.
En comparaison, un cookie final valide dispose bien de la valeur nonce :
L’outil RoadToken permet de générer le bon cookie PRT (voir la section suivante).
Utiliser RoadToken
Pour utiliser l’outil RoadToken, il sera nécessaire d’utiliser le tenant ID pour générer la valeur nonce, ce qui nous permettra de générer un cookie PRT valide pour contourner l’authentification SSO.
Il y a plusieurs options pour récupérer le tenant ID, en voici 2 :
-
Utiliser la commande
dsregcmd.exe /status
-
Naviguer sur le lien : https://login.microsoftonline.com/<domain_name>/.well-known/openid-configuration
Ensuite, le script powershell suivant va permettre de récupérer la valeur nonce. Pour ce fait, il faudra remplacer la variable TenantID par celui que l’on a récupéré ci-dessus.
$TenantId = "<victim_tenant_id>"
$URL = "https://login.microsoftonline.com/$TenantId/oauth2/token"
$Params = @{
"URI" = $URL
"Method" = "POST"
}
$Body = @{
"grant_type" = "srv_challenge"
}
$Result = Invoke-RestMethod @Params -UseBasicParsing -Body $Body
$Result.Nonce
Une fois la valeur nonce récupérée, il faut compiler le projet RoadToken (https://github.com/dirkjanm/ROADtoken). Pour compiler le projet, il faudra installer visual studio 2022 ==> Ouvrir le fichier .sln ==> Construire le projet.
Une fois le projet compilé, exécutez RoadToken avec la valeur récupéré
.\ROADToken.exe $Result.Nonce
L’outil nous retourne le cookie PRT qui permet de contourner l’authentification microsoft SSO. Il suffit d'utiliser ce cookie dans un navigateur :
-
Allez sur https://login.microsoftonline.com, effacez tous les cookies pour login.microsoftonline.com et entrez un nouveau cookie.
-
Assurez vous d’avoir modifié les informations correctement au sein du cookie.
Name: x-ms-RefreshTokenCredential
Value: [Paste prt output cookie]
Path: /
HttpOnly: Set to True (checked)
-
Recharger la page et L’authentification MFA a été contourné.
Conclusion
Le contournement de jeton PRT permet à un attaquant ayant accès une simple session utilisateur de récupérer le tenantID pour générer une valeur nonce. Avec ces informations, il peut créer un cookie PRT afin d’accéder à la session office 365 en contournant l’authentification MFA.
Cette attaque est d’autant plus redoutable si elle est couplé à un accès physique, type flipper zéro en utilisant le module BadUSB. Tout le processus peut être automatisé.
Il n'y a pas vraiment de correction pour ce type de vulnérabilité. Il est conseillé pour la plupart des entreprises concerné par l’authentification Microsoft Entra de monitorer l’utilisation des tokens et de lever des alertes lors de l’utilisation des binaires comme dsregcmd
.
En cas d’alerte, il faut réinitialiser immédiatement le mot de passe du compte utilisateur pour invalider le cookie.