Az - Pass the PRT
Τι είναι ένα PRT
pageAz - Primary Refresh Token (PRT)Ελέγξτε εάν έχετε ένα PRT
Στην ενότητα SSO State, θα πρέπει να δείτε το AzureAdPrt
να έχει οριστεί σε YES.
Στην ίδια έξοδο μπορείτε επίσης να δείτε αν η συσκευή είναι ενταγμένη στο Azure (στο πεδίο AzureAdJoined
):
PRT Cookie
Το PRT cookie ονομάζεται πραγματικά x-ms-RefreshTokenCredential
και είναι ένα JSON Web Token (JWT). Ένα JWT περιέχει 3 μέρη, το header, το payload και τη υπογραφή, χωρισμένα με ένα .
και όλα κωδικοποιημένα σε url-safe base64. Ένα τυπικό PRT cookie περιέχει τα ακόλουθα header και body:
Το πραγματικό Primary Refresh Token (PRT) ενθυλακώνεται μέσα στο refresh_token
, το οποίο κρυπτογραφείται με ένα κλειδί υπό τον έλεγχο του Azure AD, καθιστώντας τα περιεχόμενά του αδιαφανή και αδυνατούμενα να αποκρυπτογραφηθούν από εμάς. Το πεδίο is_primary
υποδηλώνει την ενθυλάκωση του πρωτεύοντος refresh token μέσα σε αυτό το token. Για να διασφαλιστεί ότι το cookie παραμένει συνδεδεμένο με τη συγκεκριμένη συνεδρία σύνδεσης για την οποία προορίζεται, το request_nonce
μεταδίδεται από τη σελίδα logon.microsoftonline.com
.
Ροή του PRT Cookie χρησιμοποιώντας TPM
Η διεργασία 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. Μπορείτε να το πάρετε με:
Ή χρησιμοποιώντας το roadrecon:
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το roadtoken για να λάβετε ένα νέο PRT (εκτελέστε το εργαλείο από ένα διεργασία του χρήστη για επίθεση):
Όπως oneliner:
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το δημιουργημένο cookie για να δημιουργήσετε διαπιστευτήρια για να συνδεθείτε χρησιμοποιώντας το Azure AD Graph ή το Microsoft Graph:
Επίθεση - Χρήση του roadrecon
Επίθεση - Χρήση του AADInternals και ενός διαρρευμένου PTR
Το Get-AADIntUserPRTToken
αποκτά το PRT token του χρήστη από τον υπολογιστή που είναι εγγεγραμμένος στο Azure AD ή στο Hybrid. Χρησιμοποιεί το BrowserCore.exe
για να αποκτήσει το PRT token.
Ή αν έχετε τις τιμές από το Mimikatz, μπορείτε επίσης να χρησιμοποιήσετε το AADInternals για να δημιουργήσετε ένα διακριτικό:
Πηγαίνετε στη διεύθυνση https://login.microsoftonline.com, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.
Στη συνέχεια, μεταβείτε στη διεύθυνση https://portal.azure.com
Τα υπόλοιπα πρέπει να είναι οι προεπιλογές. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται. Αν συμβεί αυτό, μπορεί να έχετε κάνει κάποιο λάθος και θα πρέπει να επαναλάβετε τη διαδικασία. Αν δεν συμβεί, τότε είστε καλά.
Επίθεση - Mimikatz
Βήματα
Το PRT (Primary Refresh Token) εξάγεται από το LSASS (Local Security Authority Subsystem Service) και αποθηκεύεται για μελλοντική χρήση.
Στη συνέχεια, εξάγεται το Session Key. Δεδομένου ότι αυτό το κλειδί εκδίδεται αρχικά και στη συνέχεια επανακρυπτογραφείται από την τοπική συσκευή, απαιτείται αποκρυπτογράφηση χρησιμοποιώντας έναν DPAPI masterkey. Λεπτομερείς πληροφορίες για το DPAPI (Data Protection API) μπορούν να βρεθούν σε αυτούς τους πόρους: HackTricks και για κατανόηση της εφαρμογής του, ανατρέξτε στην επίθεση Pass-the-cookie.
Μετά την αποκρυπτογράφηση του Session Key, αποκτώνται το παράγωγο κλειδί και ο περιβάλλοντος για το PRT. Αυτά είναι κρίσιμα για τη δημιουργία του PRT cookie. Συγκεκριμένα, το παράγωγο κλειδί χρησιμοποιείται για την υπογραφή του JWT (JSON Web Token) που αποτελεί το cookie. Μια λεπτομερής εξήγηση αυτής της διαδικασίας παρέχεται από τον Dirk-jan, προσβάσιμη εδώ.
Σημειώστε ότι αν το PRT βρίσκεται μέσα στο TPM και όχι μέσα στο lsass
, το mimikatz δεν θα μπορεί να το εξάγει.
Ωστόσο, θα είναι δυνατό να αποκτηθεί ένα κλειδί από ένα παράγωγο κλειδί από ένα περιβάλλον του TPM και να χρησιμοποιηθεί για την υπογραφή ενός cookie (ελέγξτε την επιλογή 3).
Μπορείτε να χρησιμοποιήσετε το mimikatz για να εξάγετε το PRT:
(Εικόνες από https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
Αντιγράψτε το μέρος που έχει επισημανθεί ως Prt και αποθηκεύστε το.
Εξάγετε επίσης το κλειδί συνεδρίας (το KeyValue
του πεδίου ProofOfPossesionKey
) που μπορείτε να δείτε επισημασμένο παρακάτω. Αυτό είναι κρυπτογραφημένο και θα χρειαστούμε να χρησιμοποιήσουμε τα κλειδιά μας DPAPI για να το αποκρυπτογραφήσουμε.
Εάν δεν βλέπετε καμία δεδομένα PRT, μπορεί να σημαίνει ότι δεν έχετε κανένα PRT επειδή η συσκευή σας δεν είναι ενταγμένη στο Azure AD ή μπορεί να εκτελείτε μια παλαιότερη έκδοση των Windows 10.
Για να αποκρυπτογραφήσετε το κλειδί συνεδρίας, πρέπει να αυξήσετε τα δικαιώματά σας σε SYSTEM για να εκτελέσετε υπό το πλαίσιο του υπολογιστή και να μπορέσετε να χρησιμοποιήσετε το DPAPI masterkey για να το αποκρυπτογραφήσετε. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για να το κάνετε:
Επιλογή 1 - Πλήρες Mimikatz
Τώρα θέλετε να αντιγράψετε και τις δύο τιμές του Context:
Και την τιμή του παραγόμενου κλειδιού:
Τέλος, μπορείτε να χρησιμοποιήσετε όλες αυτές τις πληροφορίες για να δημιουργήσετε τα cookies PRT:
Πηγαίνετε στο https://login.microsoftonline.com, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.
Στη συνέχεια, μεταβείτε στη διεύθυνση https://portal.azure.com
Το υπόλοιπο πρέπει να είναι τα προεπιλεγμένα. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται. Αν συμβεί αυτό, μπορεί να έχετε κάνει κάποιο λάθος και θα πρέπει να επαναλάβετε τη διαδικασία. Αν δεν συμβεί αυτό, τότε είστε έτοιμοι.
Επιλογή 2 - roadrecon χρησιμοποιώντας PTR
Ανανεώστε πρώτα το PRT, το οποίο θα αποθηκευτεί στο
roadtx.prt
:
Τώρα μπορούμε να ζητήσουμε διαπιστευτήρια χρησιμοποιώντας το περιηγητή με την εντολή
roadtx browserprtauth
. Εάν χρησιμοποιήσουμε την εντολήroadtx describe
, βλέπουμε ότι το διαπιστευτήριο πρόσβασης περιλαμβάνει μια αίτηση MFA επειδή το PRT που χρησιμοποίησα σε αυτήν την περίπτωση είχε επίσης μια αίτηση MFA.
Επιλογή 3 - roadrecon χρησιμοποιώντας παραγώγισμένα κλειδιά
Έχοντας το πλαίσιο και το παραγώγισμένο κλειδί που αντλήθηκε από το mimikatz, είναι δυνατόν να χρησιμοποιηθεί το roadrecon για να δημιουργηθεί ένα νέο υπογεγραμμένο cookie με:
Αναφορές
Last updated