Az - Pass the PRT
Cos'è un PRT
pageAz - Primary Refresh Token (PRT)Verifica se hai un PRT
Nella sezione Stato SSO, dovresti vedere che AzureAdPrt
è impostato su YES.
Nella stessa output puoi anche vedere se il dispositivo è connesso ad Azure (nel campo AzureAdJoined
):
Cookie PRT
Il cookie PRT è in realtà chiamato x-ms-RefreshTokenCredential
ed è un JSON Web Token (JWT). Un JWT contiene 3 parti, l'intestazione, il payload e la firma, divisi da un .
e tutti codificati in base64 in modo sicuro per l'URL. Un tipico cookie PRT contiene l'intestazione e il corpo seguenti:
Il Primary Refresh Token (PRT) effettivo è incapsulato all'interno del refresh_token
, che è crittografato da una chiave sotto il controllo di Azure AD, rendendo il suo contenuto opaco e non decifrabile per noi. Il campo is_primary
indica l'incapsulamento del primary refresh token all'interno di questo token. Per garantire che il cookie rimanga legato alla sessione di accesso specifica per cui era destinato, il request_nonce
viene trasmesso dalla pagina logon.microsoftonline.com
.
Flusso del Cookie PRT utilizzando TPM
Il processo LSASS invierà al TPM il contesto KDF, e il TPM utilizzerà la session key (raccolta quando il dispositivo è stato registrato in AzureAD e memorizzata nel TPM) e il contesto precedente per derivare una chiave, e questa chiave derivata viene utilizzata per firmare il cookie PRT (JWT).
Il contesto KDF è un nonce da AzureAD e il PRT che crea un JWT mescolato con un contesto (byte casuali).
Pertanto, anche se il PTR non può essere estratto perché si trova all'interno del TPM, è possibile abusare di LSASS per richiedere chiavi derivate da nuovi contesti e utilizzare le chiavi generate per firmare i Cookie.
Scenari di Abuso del PRT
Come utente regolare è possibile richiedere l'uso del PRT chiedendo a LSASS i dati SSO. Questo può essere fatto come le app native che richiedono token dal Gestore Account Web (token broker). WAM passa la richiesta a LSASS, che richiede token utilizzando un'asserzione PRT firmata. Oppure può essere fatto con flussi basati su browser (web) dove un cookie PRT viene utilizzato come intestazione per autenticare le richieste alle pagine di accesso di Azure AS.
Come SYSTEM potresti rubare il PRT se non protetto dal TPM o interagire con le chiavi PRT in LSASS utilizzando le API crittografiche.
Esempi di Attacchi Pass-the-PRT
Attacco - ROADtoken
Per ulteriori informazioni su questo metodo controlla questo post. ROADtoken eseguirà BrowserCore.exe
dalla directory corretta e lo utilizzerà per ottenere un cookie PRT. Questo cookie può quindi essere utilizzato con ROADtools per autenticare e ottenere un token di aggiornamento persistente.
Per generare un cookie PRT valido la prima cosa di cui hai bisogno è un nonce. Puoi ottenerlo con:
Oppure utilizzando roadrecon:
Quindi puoi utilizzare roadtoken per ottenere un nuovo PRT (esegui lo strumento da un processo dell'utente da attaccare):
Come oneliner:
Quindi puoi utilizzare il cookie generato per generare token per effettuare l'accesso utilizzando Azure AD Graph o Microsoft Graph:
Attacco - Utilizzando roadrecon
Attacco - Utilizzando AADInternals e PTR trapelato
Get-AADIntUserPRTToken
ottiene il token PRT dell'utente dal computer con Azure AD o Hybrid join. Utilizza BrowserCore.exe
per ottenere il token PRT.
Oppure, se hai i valori da Mimikatz, puoi anche utilizzare AADInternals per generare un token:
Vai su https://login.microsoftonline.com, elimina tutti i cookie per login.microsoftonline.com e inserisci un nuovo cookie.
Quindi vai su https://portal.azure.com
Il resto dovrebbe essere impostato sui valori predefiniti. Assicurati di poter aggiornare la pagina senza che il cookie scompaia, se scompare, potresti aver commesso un errore e dovrai ripetere il processo. Se non scompare, sei a posto.
Attacco - Mimikatz
Passaggi
Il PRT (Primary Refresh Token) viene estratto da LSASS (Local Security Authority Subsystem Service) e memorizzato per utilizzi successivi.
Successivamente viene estratta la Session Key. Dato che questa chiave viene emessa inizialmente e poi ri-cifrata dal dispositivo locale, è necessaria la decrittazione utilizzando una masterkey DPAPI. Informazioni dettagliate su DPAPI (Data Protection API) possono essere trovate in queste risorse: HackTricks e per una comprensione della sua applicazione, fare riferimento all'attacco Pass-the-cookie.
Dopo la decrittazione della Session Key, vengono ottenute la chiave derivata e il contesto per il PRT. Questi sono cruciali per la creazione del cookie PRT. In particolare, la chiave derivata viene utilizzata per firmare il JWT (JSON Web Token) che costituisce il cookie. Una spiegazione dettagliata di questo processo è stata fornita da Dirk-jan, accessibile qui.
Nota che se il PRT è all'interno del TPM e non all'interno di lsass
, mimikatz non sarà in grado di estrarlo.
Tuttavia, sarà possibile ottenere una chiave da una chiave derivata da un contesto dal TPM e usarla per firmare un cookie (controllare l'opzione 3).
Puoi trovare una spiegazione dettagliata del processo eseguito per estrarre questi dettagli qui: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
Questo non funzionerà esattamente dopo le correzioni di agosto 2021 per ottenere i token PRT di altri utenti poiché solo l'utente può ottenere il proprio PRT (un amministratore locale non può accedere ai PRT di altri utenti), ma può accedere al proprio.
Puoi utilizzare mimikatz per estrarre il PRT:
Copia la parte etichettata come Prt e salvala.
Estrai anche la chiave di sessione (il KeyValue
del campo ProofOfPossesionKey
che puoi vedere evidenziato di seguito. Questo è crittografato e avremo bisogno di utilizzare i nostri masterkey DPAPI per decifrarlo.
Se non vedi dati PRT potrebbe essere che non hai PRT perché il tuo dispositivo non è connesso ad Azure AD oppure potrebbe essere che stai eseguendo una vecchia versione di Windows 10.
Per decrittare la chiave di sessione devi elevare i tuoi privilegi a SYSTEM per eseguire nel contesto del computer e poter utilizzare il masterkey DPAPI per decifrarlo. Puoi utilizzare i seguenti comandi per farlo:
Opzione 1 - Mimikatz Completo
Ora vuoi copiare sia il valore del contesto:
E il valore della chiave derivata:
Infine puoi utilizzare tutte queste informazioni per generare i cookie PRT:
Vai su https://login.microsoftonline.com, elimina tutti i cookie per login.microsoftonline.com e inserisci un nuovo cookie.
Quindi vai su https://portal.azure.com
Il resto dovrebbe essere impostato come predefinito. Assicurati di poter aggiornare la pagina senza che il cookie scompaia, se scompare, potresti aver commesso un errore e dovrai ripetere il processo. Se non scompare, sei a posto.
Opzione 2 - roadrecon utilizzando PTR
Rinnova prima il PRT, che verrà salvato in
roadtx.prt
:
Ora possiamo richiedere token utilizzando il browser interattivo con
roadtx browserprtauth
. Se utilizziamo il comandoroadtx describe
, vediamo che il token di accesso include una richiesta MFA perché il PRT che ho usato in questo caso aveva anche una richiesta MFA.
Opzione 3 - roadrecon utilizzando chiavi derivate
Avendo il contesto e la chiave derivata dumpati da mimikatz, è possibile utilizzare roadrecon per generare un nuovo cookie firmato con:
Riferimenti
Last updated