Az - Pass the PRT
Last updated
Last updated
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Στην ενότητα SSO State, θα πρέπει να δείτε το AzureAdPrt
ρυθμισμένο σε ΝΑΙ.
Στην ίδια έξοδο μπορείτε επίσης να δείτε αν η συσκευή είναι συνδεδεμένη στο Azure (στο πεδίο AzureAdJoined
):
Το cookie PRT ονομάζεται στην πραγματικότητα x-ms-RefreshTokenCredential
και είναι ένα JSON Web Token (JWT). Ένα JWT περιέχει 3 μέρη, το header, το payload και την υπογραφή, χωρισμένα με ένα .
και όλα κωδικοποιημένα σε url-safe base64. Ένα τυπικό cookie PRT περιέχει το εξής header και σώμα:
Το πραγματικό 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).
Επομένως, ακόμη και αν το PRT δεν μπορεί να εξαχθεί επειδή βρίσκεται μέσα στο TPM, είναι δυνατόν να καταχραστεί το LSASS για να ζητήσει παραγόμενα κλειδιά από νέα contexts και να χρησιμοποιήσει τα παραγόμενα κλειδιά για να υπογράψει Cookies.
Ως κανονικός χρήστης είναι δυνατόν να ζητήσετε τη χρήση PRT ζητώντας από το LSASS δεδομένα SSO. Αυτό μπορεί να γίνει όπως οι εγγενείς εφαρμογές που ζητούν tokens από τον Web Account Manager (token broker). Ο WAM μεταβιβάζει το αίτημα στο LSASS, το οποίο ζητά tokens χρησιμοποιώντας υπογεγραμμένη δήλωση PRT. Ή μπορεί να γίνει με ροές βασισμένες σε πρόγραμμα περιήγησης (web) όπου ένα PRT cookie χρησιμοποιείται ως header για την αυθεντικοποίηση αιτημάτων στις σελίδες σύνδεσης Azure AS.
Ως SYSTEM θα μπορούσατε να κλέψετε το PRT αν δεν προστατεύεται από TPM ή να αλληλεπιδράσετε με τα κλειδιά PRT στο LSASS χρησιμοποιώντας κρυπτογραφικές APIs.
Για περισσότερες πληροφορίες σχετικά με αυτόν τον τρόπο ελέγξτε αυτήν την ανάρτηση. Το ROADtoken θα εκτελέσει το BrowserCore.exe
από τον σωστό κατάλογο και θα το χρησιμοποιήσει για να αποκτήσει ένα PRT cookie. Αυτό το cookie μπορεί στη συνέχεια να χρησιμοποιηθεί με τα ROADtools για να αυθεντικοποιηθεί και να αποκτηθεί ένα μόνιμο refresh token.
Για να δημιουργήσετε ένα έγκυρο PRT cookie, το πρώτο πράγμα που χρειάζεστε είναι ένα nonce. Μπορείτε να το αποκτήσετε με:
Ή χρησιμοποιώντας roadrecon:
Τότε μπορείτε να χρησιμοποιήσετε roadtoken για να αποκτήσετε ένα νέο PRT (τρέξτε το εργαλείο από μια διαδικασία του χρήστη που θέλετε να επιτεθείτε):
Ως oneliner:
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το παραγόμενο cookie για να παράγετε tokens για να συνδεθείτε χρησιμοποιώντας Azure AD Graph ή Microsoft Graph:
Get-AADIntUserPRTToken
λαμβάνει το PRT token του χρήστη από τον υπολογιστή που είναι συνδεδεμένος στο Azure AD ή Hybrid. Χρησιμοποιεί το BrowserCore.exe
για να αποκτήσει το PRT token.
Ή αν έχετε τις τιμές από το Mimikatz μπορείτε επίσης να χρησιμοποιήσετε το AADInternals για να δημιουργήσετε ένα token:
Μεταβείτε στο https://login.microsoftonline.com, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.
Then go to https://portal.azure.com
Τα υπόλοιπα θα πρέπει να είναι τα προεπιλεγμένα. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται, αν το κάνει, μπορεί να έχετε κάνει ένα λάθος και θα πρέπει να περάσετε ξανά από τη διαδικασία. Αν δεν το κάνει, θα είστε εντάξει.
Το 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 αποκτώνται. Αυτά είναι κρίσιμα για τη δημιουργία του cookie PRT. Συγκεκριμένα, το παράγωγο κλειδί χρησιμοποιείται για την υπογραφή του JWT (JSON Web Token) που συνιστά το cookie. Μια ολοκληρωμένη εξήγηση αυτής της διαδικασίας έχει παρασχεθεί από τον Dirk-jan, προσβάσιμη εδώ.
Σημειώστε ότι αν το PRT είναι μέσα στο TPM και όχι μέσα στο lsass
το mimikatz δεν θα μπορέσει να το εξάγει.
Ωστόσο, θα είναι δυνατό να πάρετε ένα κλειδί από ένα παράγωγο κλειδί από ένα πλαίσιο από το TPM και να το χρησιμοποιήσετε για να υπογράψετε ένα cookie (ελέγξτε την επιλογή 3).
You can find an in depth explanation of the performed process to extract these details in here: https://dirkjanm.io/digging-further-into-the-primary-refresh-token/
Αυτό δεν θα λειτουργήσει ακριβώς μετά τις διορθώσεις του Αυγούστου 2021 για να αποκτήσετε τα PRT tokens άλλων χρηστών, καθώς μόνο ο χρήστης μπορεί να αποκτήσει το PRT του (ένας τοπικός διαχειριστής δεν μπορεί να έχει πρόσβαση στα PRT άλλων χρηστών), αλλά μπορεί να έχει πρόσβαση στο δικό του.
You can use mimikatz to extract the PRT:
(Images from https://blog.netwrix.com/2023/05/13/pass-the-prt-overview)
Αντιγράψτε το μέρος που είναι επισημασμένο Prt και αποθηκεύστε το.
Εξαγάγετε επίσης το κλειδί συνεδρίας (το KeyValue
του πεδίου ProofOfPossesionKey
) το οποίο μπορείτε να δείτε επισημασμένο παρακάτω. Αυτό είναι κρυπτογραφημένο και θα χρειαστεί να χρησιμοποιήσουμε τα DPAPI masterkeys μας για να το αποκρυπτογραφήσουμε.
Αν δεν δείτε κανένα δεδομένο PRT, μπορεί να είναι ότι δεν έχετε κανένα PRT επειδή η συσκευή σας δεν είναι συνδεδεμένη στο Azure AD ή μπορεί να τρέχετε μια παλιά έκδοση των Windows 10.
Για να αποκρυπτογραφήσετε το κλειδί συνεδρίας, πρέπει να ανυψώσετε τα δικαιώματά σας σε SYSTEM για να εκτελείστε υπό το πλαίσιο του υπολογιστή ώστε να μπορείτε να χρησιμοποιήσετε το DPAPI masterkey για να το αποκρυπτογραφήσετε. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για να το κάνετε αυτό:
Τώρα θέλετε να αντιγράψετε και την τιμή Context:
Και την τιμή του παραγόμενου κλειδιού:
Τέλος, μπορείτε να χρησιμοποιήσετε όλες αυτές τις πληροφορίες για να δημιουργήσετε PRT cookies:
Πηγαίνετε στο https://login.microsoftonline.com, καθαρίστε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.
Στη συνέχεια, πηγαίνετε στο https://portal.azure.com
Το υπόλοιπο θα πρέπει να είναι τα προεπιλεγμένα. Βεβαιωθείτε ότι μπορείτε να ανανεώσετε τη σελίδα και το cookie δεν εξαφανίζεται, αν το κάνει, μπορεί να έχετε κάνει λάθος και θα πρέπει να περάσετε ξανά από τη διαδικασία. Αν δεν το κάνει, θα είστε εντάξει.
Ανανεώστε πρώτα το PRT, το οποίο θα αποθηκευτεί στο roadtx.prt
:
Τώρα μπορούμε να ζητήσουμε tokens χρησιμοποιώντας τον διαδραστικό περιηγητή με roadtx browserprtauth
. Αν χρησιμοποιήσουμε την εντολή roadtx describe
, βλέπουμε ότι το access token περιλαμβάνει μια αξίωση MFA επειδή το PRT που χρησιμοποίησα σε αυτή την περίπτωση είχε επίσης μια αξίωση MFA.
Έχοντας το πλαίσιο και το παραγόμενο κλειδί που εξήχθη από το mimikatz, είναι δυνατόν να χρησιμοποιηθεί το roadrecon για να παραχθεί ένα νέο υπογεγραμμένο cookie με:
Μάθετε & εξασκηθείτε στο AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Μάθετε & εξασκηθείτε στο GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)