Az - Pass the PRT
Qu'est-ce qu'un PRT
Az - Primary Refresh Token (PRT)Vérifiez si vous avez un PRT
Dans la section État SSO, vous devriez voir AzureAdPrt
réglé sur OUI.
Dans le même résultat, vous pouvez également voir si le dispositif est joint à Azure (dans le champ AzureAdJoined
):
Cookie PRT
Le cookie PRT est en fait appelé x-ms-RefreshTokenCredential
et c'est un JSON Web Token (JWT). Un JWT contient 3 parties, le header, le payload et la signature, divisées par un .
et toutes encodées en base64 sûr pour les URL. Un cookie PRT typique contient l'en-tête et le corps suivants :
Le Primary Refresh Token (PRT) réel est encapsulé dans le refresh_token
, qui est chiffré par une clé sous le contrôle d'Azure AD, rendant son contenu opaque et indéchiffrable pour nous. Le champ is_primary
signifie l'encapsulation du primary refresh token dans ce token. Pour s'assurer que le cookie reste lié à la session de connexion spécifique pour laquelle il était destiné, le request_nonce
est transmis depuis la page logon.microsoftonline.com
.
Flux de cookie PRT utilisant TPM
Le processus LSASS enverra au TPM le KDF context, et le TPM utilisera la session key (récupérée lorsque l'appareil a été enregistré dans AzureAD et stockée dans le TPM) et le contexte précédent pour dériver une clé, et cette clé dérivée est utilisée pour signer le cookie PRT (JWT).
Le KDF context est un nonce d'AzureAD et le PRT créant un JWT mélangé avec un context (octets aléatoires).
Par conséquent, même si le PRT ne peut pas être extrait car il est situé à l'intérieur du TPM, il est possible d'abuser de LSASS pour demander des clés dérivées de nouveaux contextes et utiliser les clés générées pour signer des cookies.
Scénarios d'abus de PRT
En tant qu'utilisateur régulier, il est possible de demander l'utilisation du PRT en demandant à LSASS des données SSO. Cela peut être fait comme les applications natives qui demandent des tokens au Web Account Manager (token broker). WAM passe la demande à LSASS, qui demande des tokens en utilisant une assertion PRT signée. Ou cela peut être fait avec des flux basés sur le navigateur (web) où un cookie PRT est utilisé comme en-tête pour authentifier les demandes aux pages de connexion Azure AS.
En tant que SYSTEM, vous pourriez voler le PRT s'il n'est pas protégé par TPM ou interagir avec les clés PRT dans LSASS en utilisant des API cryptographiques.
Exemples d'attaque Pass-the-PRT
Attaque - ROADtoken
Pour plus d'informations sur cette méthode consultez ce post. ROADtoken exécutera BrowserCore.exe
depuis le bon répertoire et l'utilisera pour obtenir un cookie PRT. Ce cookie peut ensuite être utilisé avec ROADtools pour s'authentifier et obtenir un refresh token persistant.
Pour générer un cookie PRT valide, la première chose dont vous avez besoin est un nonce. Vous pouvez obtenir cela avec :
Ou en utilisant roadrecon :
Ensuite, vous pouvez utiliser roadtoken pour obtenir un nouveau PRT (exécutez l'outil à partir d'un processus de l'utilisateur à attaquer) :
Comme oneliner:
Ensuite, vous pouvez utiliser le cookie généré pour générer des jetons afin de vous connecter en utilisant Azure AD Graph ou Microsoft Graph :
Attack - Using roadrecon
Attack - Using AADInternals and a leaked PRT
Get-AADIntUserPRTToken
obtient le jeton PRT de l'utilisateur à partir de l'ordinateur joint à Azure AD ou Hybrid. Utilise BrowserCore.exe
pour obtenir le jeton PRT.
Allez sur https://login.microsoftonline.com, supprimez tous les cookies pour login.microsoftonline.com et entrez un nouveau cookie.
Ensuite, allez sur https://portal.azure.com
Le reste devrait être par défaut. Assurez-vous de pouvoir actualiser la page et que le cookie ne disparaisse pas, si c'est le cas, vous avez peut-être fait une erreur et devez recommencer le processus. Si ce n'est pas le cas, vous devriez être bon.
Attaque - Mimikatz
Étapes
Le PRT (Primary Refresh Token) est extrait de LSASS (Local Security Authority Subsystem Service) et stocké pour une utilisation ultérieure.
La clé de session est extraite ensuite. Étant donné que cette clé est initialement émise puis ré-encryptée par l'appareil local, elle nécessite une décryption à l'aide d'une clé maître DPAPI. Des informations détaillées sur DPAPI (Data Protection API) peuvent être trouvées dans ces ressources : HackTricks et pour comprendre son application, consultez Pass-the-cookie attack.
Après la décryption de la clé de session, la clé dérivée et le contexte pour le PRT sont obtenus. Ceux-ci sont cruciaux pour la création du cookie PRT. Plus précisément, la clé dérivée est utilisée pour signer le JWT (JSON Web Token) qui constitue le cookie. Une explication complète de ce processus a été fournie par Dirk-jan, accessible ici.
Notez que si le PRT est à l'intérieur du TPM et non à l'intérieur de lsass
mimikatz ne pourra pas l'extraire.
Cependant, il sera possible d'obtenir une clé à partir d'une clé dérivée d'un contexte du TPM et de l'utiliser pour signer un cookie (voir option 3).
Vous pouvez trouver une explication approfondie du processus effectué pour extraire ces détails ici : https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
Cela ne fonctionnera pas exactement après les correctifs d'août 2021 pour obtenir les tokens PRT d'autres utilisateurs car seul l'utilisateur peut obtenir son PRT (un administrateur local ne peut pas accéder aux PRT d'autres utilisateurs), mais peut accéder au sien.
Vous pouvez utiliser mimikatz pour extraire le PRT :
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
Copiez la partie étiquetée Prt et enregistrez-la.
Extrayez également la clé de session (la KeyValue
du champ ProofOfPossesionKey
) que vous pouvez voir surlignée ci-dessous. Celle-ci est chiffrée et nous devrons utiliser nos clés maîtresses DPAPI pour la déchiffrer.
Si vous ne voyez aucune donnée PRT, cela pourrait être que vous n'avez pas de PRTs parce que votre appareil n'est pas joint à Azure AD ou que vous utilisez une ancienne version de Windows 10.
Pour décrypter la clé de session, vous devez élever vos privilèges à SYSTEM pour exécuter sous le contexte de l'ordinateur afin de pouvoir utiliser la clé maîtresse DPAPI pour la déchiffrer. Vous pouvez utiliser les commandes suivantes pour ce faire :
Option 1 - Full Mimikatz
Maintenant, vous voulez copier à la fois la valeur du Context :
Et la valeur de la derived key :
Enfin, vous pouvez utiliser toutes ces informations pour générer des cookies PRT :
Allez sur https://login.microsoftonline.com, supprimez tous les cookies pour login.microsoftonline.com et entrez un nouveau cookie.
Ensuite, allez sur https://portal.azure.com
Le reste devrait être par défaut. Assurez-vous de pouvoir actualiser la page et que le cookie ne disparaisse pas, si c'est le cas, vous avez peut-être fait une erreur et devez recommencer le processus. Si ce n'est pas le cas, vous devriez être bon.
Option 2 - roadrecon utilisant PRT
Renouvelez d'abord le PRT, ce qui le sauvegardera dans
roadtx.prt
:
Maintenant, nous pouvons demander des jetons en utilisant le navigateur interactif avec
roadtx browserprtauth
. Si nous utilisons la commanderoadtx describe
, nous voyons que le jeton d'accès inclut une revendication MFA car le PRT que j'ai utilisé dans ce cas avait également une revendication MFA.
Option 3 - roadrecon utilisant des clés dérivées
Ayant le contexte et la clé dérivée extraits par mimikatz, il est possible d'utiliser roadrecon pour générer un nouveau cookie signé avec :
Références
Last updated