26 KiB
OAuth για Account Takeover
Μάθετε το hacking του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!
Άλλοι τρόποι για να υποστηρίξετε το HackTricks:
- Αν θέλετε να δείτε την εταιρεία σας να διαφημίζεται στο HackTricks ή να κατεβάσετε το HackTricks σε μορφή PDF ελέγξτε τα ΣΧΕΔΙΑ ΣΥΝΔΡΟΜΗΣ!
- Αποκτήστε το επίσημο PEASS & HackTricks swag
- Ανακαλύψτε The PEASS Family, τη συλλογή μας από αποκλειστικά NFTs
- Εγγραφείτε στη 💬 ομάδα Discord ή στη ομάδα telegram ή ακολουθήστε μας στο Twitter 🐦 @carlospolopm.
- Μοιραστείτε τα hacking tricks σας υποβάλλοντας PRs στα HackTricks και HackTricks Cloud αποθετήρια του github.
Βασικές Πληροφορίες
Το OAuth προσφέρει διάφορες εκδόσεις, με βασικές πληροφορίες προσβάσιμες στην τεκμηρίωση του OAuth 2.0. Αυτή η συζήτηση επικεντρώνεται κυρίως στο ευρέως χρησιμοποιούμενο τύπο απόδοσης κωδικού εξουσιοδότησης OAuth 2.0, παρέχοντας ένα πλαίσιο εξουσιοδότησης που επιτρέπει σε μια εφαρμογή να έχει πρόσβαση ή να εκτελεί ενέργειες στον λογαριασμό ενός χρήστη σε μια άλλη εφαρμογή (ο εξουσιοδοτητής).
Ας υποθέσουμε ένα υποθετικό ιστότοπο https://example.com, σχεδιασμένο για να προβάλλει όλες τις αναρτήσεις σας στα κοινωνικά δίκτυα, συμπεριλαμβανομένων των ιδιωτικών. Για να το επιτύχει αυτό, χρησιμοποιείται το OAuth 2.0. Ο https://example.com θα ζητήσει την άδειά σας για να έχει πρόσβαση στις αναρτήσεις σας στα κοινωνικά δίκτυα. Συνεπώς, θα εμφανιστεί μια οθόνη συγκατάθεσης στο https://socialmedia.com, που περιγράφει τις άδειες που ζητούνται και τον προγραμματιστή που κάνει το αίτημα. Μετά την εξουσιοδότησή σας, το https://example.com αποκτά τη δυνατότητα να έχει πρόσβαση στις αναρτήσεις σας εκ μέρους σας.
Είναι σημαντικό να κατανοήσετε τα εξής στοιχεία εντός του πλαισίου OAuth 2.0:
- κάτοχος πόρων: Εσείς, ως χρήστης/οντότητα, εξουσιοδοτείτε την πρόσβαση στον πόρο σας, όπως οι αναρτήσεις του λογαριασμού σας στα κοινωνικά δίκτυα.
- διακομιστής πόρων: Ο διακομιστής που διαχειρίζεται τα αυθεντικοποιημένα αιτήματα μετά την ασφαλή λήψη ενός
access token
εκ μέρους τουκατόχου πόρων
, π.χ. https://socialmedia.com. - εφαρμογή πελάτης: Η εφαρμογή που ζητάει εξουσιοδότηση από τον
κάτοχο πόρων
, όπως το https://example.com. - διακομιστής εξουσιοδότησης: Ο διακομιστής που εκδίδει τα
access tokens
στηνεφαρμογή πελάτη
μετά την επιτυχή αυθεντικοποίηση τουκατόχου πόρων
και την ασφαλή εξουσιοδότηση, π.χ. https://socialmedia.com. - client_id: Ένα δημόσιο, μοναδικό αναγνωριστικό για την εφαρμογή.
- client_secret: Ένα εμπιστευτικό κλειδί, γνωστό μόνο στην εφαρμογή και στον διακομιστή εξουσιοδότησης, που χρησιμοποιείται για τη δημιουργία
access_tokens
. - response_type: Μια τιμή που καθορίζει τον τύπο του ζητούμενου token, όπως
code
. - scope: Το επίπεδο πρόσβασης που ζητά η
εφαρμογή πελάτης
από τονκάτοχο πόρων
. - redirect_uri: Η URL στην οποία ανακατευθύνεται ο χρήστης μετά την εξουσιοδότηση. Αυτή πρέπει συνήθως να συμφωνεί με την προ-καταχωρημένη URL ανακατεύθυνσης.
- state: Ένα παράμετρος για να διατηρεί δεδομένα κατά την ανακατεύθυνση του χρήστη προς και από τον διακομιστή εξουσιοδότησης. Η μοναδικότητά του είναι κρίσιμη για να λειτουργεί ως μηχανισμός προστασίας CSRF.
- grant_type: Μια παράμετρος που υποδηλώνει τον τύπο απόδοσης και τον τύπο του token που θα επιστραφεί.
- code: Ο κωδικός εξουσιοδότησης από τον
διακομιστή εξουσιοδότησης
, που χρησιμοποιείται σε συνδυασμό με τοclient_id
και το `
https://socialmedia.com/auth
?response_type=code
&client_id=example_clientId
&redirect_uri=https%3A%2F%2Fexample.com%2Fcallback
&scope=readPosts
&state=randomString123
-
Στη συνέχεια, σας παρουσιάζεται μια σελίδα συναίνεσης.
-
Ακολουθώντας την έγκρισή σας, τα Κοινωνικά Δίκτυα στέλνουν μια απάντηση στο
redirect_uri
με τις παραμέτρουςcode
καιstate
:
https://example.com?code=uniqueCode123&state=randomString123
- Το https://example.com χρησιμοποιεί αυτόν τον
code
, μαζί με τοclient_id
και τοclient_secret
του, για να κάνει ένα αίτημα στον διακομιστή για να λάβει έναaccess_token
εκ μέρους σας, επιτρέποντας την πρόσβαση στις άδειες που συμφωνήσατε:
POST /oauth/access_token
Host: socialmedia.com
...{"client_id": "example_clientId", "client_secret": "example_clientSecret", "code": "uniqueCode123", "grant_type": "authorization_code"}
- Τέλος, η διαδικασία ολοκληρώνεται όταν το https://example.com χρησιμοποιεί το
access_token
σας για να κάνει ένα αίτημα API στα Κοινωνικά Μέσα για πρόσβαση.
Ευπάθειες
Ανοικτή redirect_uri
Η redirect_uri
είναι κρίσιμη για την ασφάλεια στις υλοποιήσεις OAuth και OpenID, καθώς καθορίζει πού αποστέλλονται ευαίσθητα δεδομένα, όπως κωδικοί εξουσιοδότησης, μετά την εξουσιοδότηση. Εάν δεν έχει ρυθμιστεί σωστά, μπορεί να επιτρέψει σε επιτιθέμενους να ανακατευθύνουν αυτά τα αιτήματα σε κακόβουλους διακομιστές, επιτρέποντας την ανάληψη του λογαριασμού.
Οι τεχνικές εκμετάλλευσης ποικίλλουν ανάλογα με τη λογική επικύρωσης του διακομιστή εξουσιοδότησης. Μπορούν να κυμαίνονται από αυστηρή αντιστοίχιση μονοπατιού έως την αποδοχή οποιουδήποτε URL εντός του καθορισμένου τομέα ή υποκαταλόγου. Οι συνηθισμένες μεθόδοι εκμετάλλευσης περιλαμβάνουν ανοικτές ανακατευθύνσεις, διάβασμα μονοπατιού, εκμετάλλευση αδύναμων regexes και ενσωμάτωση HTML για κλοπή διακριτικού.
Εκτός από την redirect_uri
, άλλοι παράμετροι OAuth και OpenID όπως οι client_uri
, policy_uri
, tos_uri
και initiate_login_uri
είναι επίσης ευάλωτοι σε επιθέσεις ανακατεύθυνσης. Αυτές οι παράμετροι είναι προαιρετικές και η υποστήριξή τους ποικίλλει ανάμεσα στους διακομιστές.
Για όσους στοχεύουν έναν διακομιστή OpenID, το σημείο ανακάλυψης (**.well-known/openid-configuration**
) συχνά περιλαμβάνει σημαντικές πληροφορίες ρύθμισης όπως οι registration_endpoint
, request_uri_parameter_supported
και require_request_uri_registration
. Αυτές οι λεπτομέρειες μπορούν να βοηθήσουν στον εντοπισμό του σημείου εγγραφής και άλλων συγκεκριμένων ρυθμίσεων του διακομιστή.
XSS στην υλοποίηση ανακατεύθυνσης
Όπως αναφέρεται σε αυτήν την αναφορά ανακάλυψης ευπαθειών https://blog.dixitaditya.com/2021/11/19/account-takeover-chain.html, είναι πιθανόν να είναι δυνατή η αντανάκλαση του URL ανακατεύθυνσης στην απόκριση του διακομιστή μετά την εξουσιοδότηση του χρήστη, είναι ευάλωτος σε XSS. Δυνητικό φορτίο για δοκιμή:
https://app.victim.com/login?redirectUrl=https://app.victim.com/dashboard</script><h1>test</h1>
CSRF - Εσφαλμένη χειρισμός της παραμέτρου κατάστασης
Στις υλοποιήσεις OAuth, η κακή χρήση ή παράλειψη της παραμέτρου state
μπορεί να αυξήσει σημαντικά τον κίνδυνο επιθέσεων Cross-Site Request Forgery (CSRF). Αυτή η ευπάθεια προκύπτει όταν η παράμετρος state
είτε δεν χρησιμοποιείται, χρησιμοποιείται ως στατική τιμή ή δεν επικυρώνεται σωστά, επιτρέποντας στους επιτιθέμενους να παρακάμψουν τις προστασίες CSRF.
Οι επιτιθέμενοι μπορούν να εκμεταλλευτούν αυτό παρεμβαίνοντας στη διαδικασία εξουσιοδότησης για να συνδέσουν τον λογαριασμό τους με τον λογαριασμό ενός θύματος, οδηγώντας σε πιθανές κατακτήσεις λογαριασμού. Αυτό είναι ιδιαίτερα κρίσιμο σε εφαρμογές όπου το OAuth χρησιμοποιείται για σκοπούς ελέγχου ταυτότητας.
Πραγματικά παραδείγματα αυτής της ευπάθειας έχουν καταγραφεί σε διάφορες προκλήσεις CTF και πλατφόρμες χάκερ, αναδεικνύοντας τις πρακτικές της συνέπειες. Το πρόβλημα επεκτείνεται επίσης σε ενσωματώσεις με υπηρεσίες τρίτων όπως Slack, Stripe και PayPal, όπου οι επιτιθέμενοι μπορούν να ανακατευθύνουν ειδοποιήσεις ή πληρωμές στους λογαριασμούς τους.
Ο σωστός χειρισμός και η επικύρωση της παραμέτρου state
είναι ζωτικής σημασίας για την προστασία από CSRF και την ασφάλεια της ροής του OAuth.
Προ-κατάκτηση λογαριασμού
-
Χωρίς επαλήθευση email κατά τη δημιουργία λογαριασμού: Οι επιτιθέμενοι μπορούν να δημιουργήσουν προληπτικά έναν λογαριασμό χρησιμοποιώντας το email του θύματος. Εάν το θύμα αργότερα χρησιμοποιήσει μια υπηρεσία τρίτου για την είσοδο, η εφαρμογή μπορεί να συνδέσει ακούσια αυτόν τον λογαριασμό τρίτου με τον προ-δημιουργημένο λογαριασμό του επιτιθέμενου, οδηγώντας σε μη εξουσιοδοτημένη πρόσβαση.
-
Εκμετάλλευση ανεπαρκούς επαλήθευσης email στο OAuth: Οι επιτιθέμενοι μπορεί να εκμεταλλευτούν υπηρεσίες OAuth που δεν επαληθεύουν τα email καταχωρίζοντας τον εαυτό τους στην υπηρεσία και στη συνέχεια αλλάζοντας το email του λογαριασμού σε αυτό του θύματος. Αυτή η μέθοδος αντιμετωπίζει παρόμοιο κίνδυνο μη εξουσιοδοτημένης πρόσβασης στον λογαριασμό, παρόμοιο με το πρώτο σενάριο, αλλά μέσω διαφορετικού διανύσματος επίθεσης.
Αποκάλυψη Μυστικών
Η εντοπισμός και η προστασία των μυστικών παραμέτρων OAuth είναι ζωτικής σημασίας. Ενώ το client_id
μπορεί να αποκαλυφθεί με ασφάλεια, η αποκάλυψη του client_secret
συνεπάγεται σημαντικούς κινδύνους. Εάν το client_secret
διαρρεύσει, οι επιτιθέμενοι μπορούν να εκμεταλλευτούν την ταυτότητα και την εμπιστοσύνη της εφαρμογής για να κλέψουν τα access_tokens
των χρηστών και προσωπικές πληροφορίες.
Μια συνηθισμένη ευπάθεια προκύπτει όταν οι εφαρμογές χειρίζονται λανθασμένα την ανταλλαγή του κωδικού εξουσιοδότησης για ένα access_token
στην πλευρά του πελάτη αντί για την πλευρά του διακομιστή. Αυτό το λάθος οδηγεί στην αποκάλυψη του client_secret
, επιτρέποντας στους επιτιθέμενους να δημιουργήσουν access_tokens
υπό την εμφάνιση της εφαρμογής. Επιπλέον, μέσω κοινωνικής μηχανικής, οι επιτιθέμενοι μπορούν να αναβαθμίσουν τα δικαιώματα προσθέτοντας επιπλέον εύρος στην εξουσιοδότηση OAuth, εκμεταλλευόμενοι περαιτέρω την εμπιστοσύνη της εφαρμογής.
Επίθεση με βίαιη δοκιμή του κρυφού κλειδιού του πελάτη
Μπορείτε να προσπαθήσετε να δοκιμάσετε βίαια το κρυφό κλειδί του πελάτη ενός πάροχου υπηρεσιών με τον πάροχο ταυτότητας για να προσπαθήσετε να κλέψετε λογαριασμούς.
Το αίτημα για τη βίαιη δοκιμή μπορεί να μοιάζει με:
POST /token HTTP/1.1
content-type: application/x-www-form-urlencoded
host: 10.10.10.10:3000
content-length: 135
Connection: close
code=77515&redirect_uri=http%3A%2F%2F10.10.10.10%3A3000%2Fcallback&grant_type=authorization_code&client_id=public_client_id&client_secret=[bruteforce]
Αποκάλυψη Κώδικα + Κατάσταση μέσω του Κεφαλίδας Αναφοράς (Referer Header)
Αφού ο πελάτης έχει τον κώδικα και την κατάσταση (state), αν αυτά αντανακλώνται μέσα στον Κεφαλίδα Αναφοράς (Referer header) όταν περιηγείται σε μια διαφορετική σελίδα, τότε υπάρχει ευπάθεια.
Αποθήκευση Κλειδιού Πρόσβασης στο Ιστορικό του Προγράμματος Περιήγησης
Πηγαίνετε στο ιστορικό του προγράμματος περιήγησης και ελέγξτε αν το κλειδί πρόσβασης είναι αποθηκευμένο εκεί.
Αιώνιος Κωδικός Εξουσιοδότησης
Ο κωδικός εξουσιοδότησης πρέπει να ισχύει μόνο για κάποιο χρονικό διάστημα για να περιοριστεί το παράθυρο χρόνου όπου ένας επιτιθέμενος μπορεί να τον κλέψει και να τον χρησιμοποιήσει.
Κωδικός Εξουσιοδότησης/Ανανέωσης που δεν συνδέεται με τον πελάτη
Αν μπορείτε να αποκτήσετε τον κωδικό εξουσιοδότησης και να τον χρησιμοποιήσετε με έναν διαφορετικό πελάτη, τότε μπορείτε να αναλάβετε τον έλεγχο άλλων λογαριασμών.
Ευτυχισμένες Διαδρομές, XSS, Iframes & Αποστολή Μηνυμάτων για αποκάλυψη κωδικού και κατάστασης
AWS Cognito
Σε αυτήν την αναφορά για ευρήματα από το πρόγραμμα ανταμοιβής ευρετηρίου σφαλμάτων: https://security.lauritz-holtmann.de/advisories/flickr-account-takeover/ μπορείτε να δείτε ότι το token που παρέχει το AWS Cognito στον χρήστη μπορεί να έχει επαρκείς δικαιώματα για να αντικαταστήσει τα δεδομένα του χρήστη. Επομένως, αν μπορείτε να αλλάξετε το ηλεκτρονικό ταχυδρομείο του χρήστη με ένα διαφορετικό ηλεκτρονικό ταχυδρομείο, μπορείτε να αναλάβετε τους λογαριασμούς άλλων ατόμων.
# Read info of the user
aws cognito-idp get-user --region us-east-1 --access-token eyJraWQiOiJPVj[...]
# Change email address
aws cognito-idp update-user-attributes --region us-east-1 --access-token eyJraWQ[...] --user-attributes Name=email,Value=imaginary@flickr.com
{
"CodeDeliveryDetailsList": [
{
"Destination": "i***@f***.com",
"DeliveryMedium": "EMAIL",
"AttributeName": "email"
}
]
}
Για περισσότερες λεπτομέρειες σχετικά με το πώς να καταχραστείτε το AWS Cognito, ελέγξτε:
{% embed url="https://cloud.hacktricks.xyz/pentesting-cloud/aws-pentesting/aws-unauthenticated-enum-access/aws-cognito-unauthenticated-enum" %}
Κατάχρηση διαπιστευτηρίων άλλων εφαρμογών
Όπως αναφέρεται σε αυτήν την ανάλυση, οι ροές OAuth που αναμένουν να λάβουν το token (και όχι έναν κωδικό) μπορεί να είναι ευάλωτες αν δεν ελέγχουν αν το token ανήκει στην εφαρμογή.
Αυτό συμβαίνει επειδή ένας επιτιθέμενος μπορεί να δημιουργήσει μια εφαρμογή που υποστηρίζει το OAuth και να συνδεθεί με το Facebook (για παράδειγμα) στη δική του εφαρμογή. Έπειτα, αφού ένα θύμα συνδεθεί με το Facebook στην εφαρμογή του επιτιθέμενου, ο επιτιθέμενος μπορεί να λάβει το OAuth token του χρήστη που δόθηκε στην εφαρμογή του, και να το χρησιμοποιήσει για να συνδεθεί στην εφαρμογή OAuth του θύματος χρησιμοποιώντας το token του θύματος.
{% hint style="danger" %} Συνεπώς, αν ο επιτιθέμενος καταφέρει να πείσει τον χρήστη να δώσει πρόσβαση στη δική του εφαρμογή OAuth, θα μπορέσει να αναλάβει τον έλεγχο του λογαριασμού του θύματος σε εφαρμογές που αναμένουν ένα token και δεν ελέγχουν αν το token έχει χορηγηθεί στο αναγνωριστικό της εφαρμογής τους. {% endhint %}
Δύο συνδέσμοι και cookie
Σύμφωνα με αυτήν την ανάλυση, ήταν δυνατό να πείσει κάποιο θύμα να ανοίξει μια σελίδα με ένα returnUrl που να δείχνει στον επιτιθέμενο κεντρικό υπολογιστή. Αυτές οι πληροφορίες θα αποθηκευόντουσαν σε ένα cookie (RU) και σε ένα επόμενο βήμα το παράθυρο επιβεβαίωσης θα ζητούσε από τον χρήστη αν θέλει να δώσει πρόσβαση στον επιτιθέμενο κεντρικό υπολογιστή.
Για να παρακάμψετε αυτό το παράθυρο επιβεβαίωσης, ήταν δυνατό να ανοίξετε ένα καρτέλα για να ξεκινήσετε τη ροή OAuth που θα έθετε αυτό το RU cookie χρησιμοποιώντας το returnUrl, να κλείσετε την καρτέλα πριν εμφανιστεί το παράθυρο επιβεβαίωσης και να ανοίξετε μια νέα καρτέλα χωρίς αυτήν την τιμή. Έτσι, το παράθυρο επιβεβαίωσης δεν θα ενημερώνει για τον επιτιθέμενο κεντρικό υπολογιστή, αλλά το cookie θα έχει οριστεί σε αυτόν, έτσι το token θα αποσταλεί στον επιτιθέμενο κεντρικό υπολογιστή κατά την ανακατεύθυνση.
Παράμετροι SSRF
Ελέγξτε αυτήν την έρευνα για περισσότερες λεπτομέρειες σχετικά με αυτήν την τεχνική.
Η Δυναμική Εγγραφή Πελάτη στο OAuth λειτουργεί ως ένας λιγότερο προφανής, αλλά κρίσιμος διάνοια για ευπάθειες ασφαλείας, ειδικά για επιθέσεις Server-Side Request Forgery (SSRF). Αυτό το σημείο παρέχει στους διακομιστές OAuth λεπτομέρειες σχετικά με τις εφαρμογές πελατών, συμπεριλαμβανομένων ευαίσθητων διευθύνσεων URL που μπορούν να εκμεταλλευθούν.
Κύρια σημεία:
- Η Δυναμική Εγγραφή Πελάτη συνήθως αντιστοιχίζεται στο
/register
και δέχεται λεπτομέρειες όπωςclient_name
,client_secret
,redirect_uris
και διευθύνσεις URL για λογότυπα ή σύνολα κλειδιών JSON (JWKs) μέσω αιτήσεων POST. - Αυτή η λειτουργία συμμορφώνεται με τις προδιαγραφές που ορίζονται στα RFC7591 και OpenID Connect Registration 1.0, οι οποίες περιλαμβάνουν παραμέτρους που είναι ευάλωτες σε SSRF.
- Η διαδικασία εγγραφής μπορεί να αποκαλύψει κατά λάθος τους διακομιστές σε SSRF με διάφορους τρόπους:
logo_uri
: