Az - Pass the PRT
Last updated
Last updated
Στην ενότητα Κατάσταση SSO, θα πρέπει να δείτε το AzureAdPrt
να έχει τιμή YES.
Στην ίδια έξοδο μπορείτε επίσης να δείτε αν η συσκευή είναι ενταγμένη στο Azure (στο πεδίο AzureAdJoined
):
Το μπισκότο PRT ονομάζεται πραγματικά x-ms-RefreshTokenCredential
και είναι ένα JSON Web Token (JWT). Ένα JWT περιέχει 3 μέρη, τη κεφαλίδα, το φορτίο και τη υπογραφή, διαχωρισμένα με ένα .
και όλα κωδικοποιημένα σε url-safe base64. Ένα τυπικό μπισκότο PRT περιέχει την ακόλουθη κεφαλίδα και σώμα:
Το πραγματικό Κύριο Ανανεωτικό Διακριτικό (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 ζητώντας δεδομένα SSO από το LSASS. Αυτό μπορεί να γίνει όπως οι εφαρμογές native που ζητούν διακριτικά από τον Διαχειριστή Λογαριασμών Web (token broker). Ο WAM περνά το αίτημα στο LSASS, το οποίο ζητά διακριτικά χρησιμοποιώντας υπογεγραμμένη δήλωση PRT. Ή μπορεί να γίνει με ροές βασισμένες σε πρόγραμμα περιήγησης (web) όπου ένα cookie PRT χρησιμοποιείται ως κεφαλίδα για την αυθεντικοποίηση αιτημάτων στις σελίδες σύνδεσης Azure AS.
Ως ΣΥΣΤΗΜΑ μπορείτε να κλέψετε το PRT αν δεν προστατεύεται από το TPM ή να αλληλεπιδράσετε με τα κλειδιά PRT στο LSASS χρησιμοποιώντας κρυπτογραφικές διεπαφές.
Για περισσότερες πληροφορίες σχετικά με αυτόν τον τρόπο ελέγξτε αυτήν την ανάρτηση. Το ROADtoken θα εκτελέσει το BrowserCore.exe
από τον σωστό κατάλογο και θα το χρησιμοποιήσει για να αποκτήσει ένα cookie PRT. Αυτό το cookie μπορεί στη συνέχεια να χρησιμοποιηθεί με τα ROADtools για αυθεντικοποίηση και απόκτηση μόνιμου ανανεωτικού διακριτικού.
Για να δημιουργήσετε ένα έγκυρο cookie PRT, το πρώτο πράγμα που χρειάζεστε είναι ένα μοναδικό δείγμα. Μπορείτε να το πάρετε με:
Ή χρησιμοποιώντας το roadrecon:
Τότε μπορείτε να χρησιμοποιήσετε το roadtoken για να λάβετε ένα νέο PRT (εκτελέστε το εργαλείο από ένα διεργασία του χρήστη για επίθεση):
Στη συνέχεια, μπορείτε να χρησιμοποιήσετε το δημιουργημένο cookie για να δημιουργήσετε τα αναγνωριστικά και να συνδεθείτε χρησιμοποιώντας το Azure AD Graph ή το Microsoft Graph:
Get-AADIntUserPRTToken
λαμβάνει το PRT του χρήστη από τον υπολογιστή που είναι εγγεγραμμένος στο Azure AD ή στον υβριδικά εγγεγραμμένο στον υπολογιστή. Χρησιμοποιεί το BrowserCore.exe
για να λάβει το PRT token.
Ή αν έχετε τις τιμές από το Mimikatz μπορείτε επίσης να χρησιμοποιήσετε το AADInternals για τη δημιουργία ενός τοκέν:
Πηγαίνετε στο https://login.microsoftonline.com, διαγράψτε όλα τα cookies για το login.microsoftonline.com και εισάγετε ένα νέο cookie.
Στη συνέχεια, πηγαίνετε στο 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. Αυτά είναι κρίσιμα για τη δημιουργία του 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 για να το αποκρυπτογραφήσετε. Μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές για να το κάνετε:
Τώρα θέλετε να αντιγράψετε και τις δύο τιμές του Context:
Και την τιμή του παράγωγου κλειδιού:
Τέλος, μπορείτε να χρησιμοποιήσετε όλες αυτές τις πληροφορίες για τη δημιουργία cookies PRT:
Πηγαίνετε στο 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 με: