Cognito User Pools
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Μια πισίνα χρηστών είναι ένας κατάλογος χρηστών στο Amazon Cognito. Με μια πισίνα χρηστών, οι χρήστες σας μπορούν να συνδεθούν στην ιστοσελίδα ή την εφαρμογή κινητού σας μέσω του Amazon Cognito, ή να ομοσπονδιοποιηθούν μέσω ενός παρόχου ταυτότητας τρίτου μέρους (IdP). Είτε οι χρήστες σας συνδέονται απευθείας είτε μέσω τρίτου μέρους, όλα τα μέλη της πισίνας χρηστών έχουν ένα προφίλ καταλόγου που μπορείτε να αποκτήσετε πρόσβαση μέσω ενός SDK.
Οι πισίνες χρηστών παρέχουν:
Υπηρεσίες εγγραφής και σύνδεσης.
Μια ενσωματωμένη, προσαρμόσιμη διαδικτυακή διεπαφή για τη σύνδεση χρηστών.
Κοινωνική σύνδεση με Facebook, Google, Σύνδεση με Amazon και Σύνδεση με Apple, και μέσω παρόχων ταυτότητας SAML και OIDC από την πισίνα χρηστών σας.
Διαχείριση καταλόγου χρηστών και προφίλ χρηστών.
Χαρακτηριστικά ασφαλείας όπως η πολυπαραγοντική αυθεντικοποίηση (MFA), έλεγχοι για παραβιασμένα διαπιστευτήρια, προστασία από κατάληψη λογαριασμού και επαλήθευση τηλεφώνου και email.
Προσαρμοσμένες ροές εργασίας και μετανάστευση χρηστών μέσω ενεργοποιήσεων AWS Lambda.
Ο κωδικός πηγής των εφαρμογών θα περιέχει συνήθως επίσης το ID πισίνας χρηστών και το ID εφαρμογής πελάτη, (και μερικές φορές το μυστικό εφαρμογής;) που είναι απαραίτητα για έναν χρήστη να συνδεθεί σε μια Πισίνα Χρηστών Cognito.
Εγγραφή: Από προεπιλογή, ένας χρήστης μπορεί να εγγραφεί μόνος του, επομένως θα μπορούσε να δημιουργήσει έναν χρήστη για τον εαυτό του.
Αναγνώριση χρηστών: Η λειτουργία εγγραφής μπορεί να χρησιμοποιηθεί για να βρείτε ονόματα χρηστών που ήδη υπάρχουν. Αυτή η πληροφορία μπορεί να είναι χρήσιμη για την επίθεση brute-force.
Brute-force σύνδεση: Στην ενότητα Αυθεντικοποίηση έχετε όλες τις μεθόδους που έχει ένας χρήστης για να συνδεθεί, θα μπορούσατε να προσπαθήσετε να τις επιτεθείτε brute-force για να βρείτε έγκυρα διαπιστευτήρια.
Pacu, τώρα περιλαμβάνει τα modules cognito__enum
και cognito__attack
που αυτοματοποιούν την αναγνώριση όλων των πόρων Cognito σε έναν λογαριασμό και επισημαίνουν αδύναμες ρυθμίσεις, χαρακτηριστικά χρηστών που χρησιμοποιούνται για έλεγχο πρόσβασης, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και την κλιμάκωση προνομίων με βάση τροποποιήσιμα προσαρμοσμένα χαρακτηριστικά, χρησιμοποιήσιμα διαπιστευτήρια πισίνας ταυτότητας, ρόλους που μπορούν να αναληφθούν σε tokens ταυτότητας, κ.λπ.
Για μια περιγραφή των λειτουργιών των modules δείτε το μέρος 2 της δημοσίευσης στο blog. Για οδηγίες εγκατάστασης δείτε τη κύρια σελίδα Pacu.
Cognito Scanner είναι ένα εργαλείο CLI σε python που υλοποιεί διάφορες επιθέσεις στο Cognito, συμπεριλαμβανομένης της ανεπιθύμητης δημιουργίας λογαριασμού και του oracle λογαριασμού. Δείτε αυτόν τον σύνδεσμο για περισσότερες πληροφορίες.
CognitoAttributeEnum: Αυτό το σενάριο επιτρέπει την καταμέτρηση έγκυρων χαρακτηριστικών για χρήστες.
User Pools επιτρέπει από προεπιλογή να εγγραφούν νέοι χρήστες.
Μπορεί να βρείτε ένα σφάλμα που υποδεικνύει ότι πρέπει να παρέχετε περισσότερες λεπτομέρειες σχετικά με τον χρήστη:
Μπορείτε να παρέχετε τις απαραίτητες λεπτομέρειες με ένα JSON όπως:
Μπορείτε να χρησιμοποιήσετε αυτή τη λειτουργία επίσης για να καταγράψετε υπάρχοντες χρήστες. Αυτό είναι το μήνυμα σφάλματος όταν υπάρχει ήδη χρήστης με αυτό το όνομα:
Σημειώστε στην προηγούμενη εντολή πώς τα προσαρμοσμένα χαρακτηριστικά ξεκινούν με "custom:". Επίσης, γνωρίζετε ότι κατά την εγγραφή δεν μπορείτε να δημιουργήσετε νέα προσαρμοσμένα χαρακτηριστικά για τον χρήστη. Μπορείτε μόνο να δώσετε τιμή σε προεπιλεγμένα χαρακτηριστικά (ακόμα και αν δεν είναι υποχρεωτικά) και προσαρμοσμένα χαρακτηριστικά που έχουν καθοριστεί.
Ή απλά για να δοκιμάσετε αν υπάρχει ένα client id. Αυτό είναι το σφάλμα αν το client-id δεν υπάρχει:
Θα βρείτε αυτό το σφάλμα και δεν θα μπορείτε να εγγραφείτε ή να καταγράψετε χρήστες:
Cognito επιτρέπει να επιβεβαιώσετε έναν νέο χρήστη επιβεβαιώνοντας το email ή τον αριθμό τηλεφώνου του. Επομένως, κατά τη δημιουργία ενός χρήστη, συνήθως θα απαιτείται τουλάχιστον το όνομα χρήστη και ο κωδικός πρόσβασης και το email και/ή αριθμός τηλεφώνου. Απλώς ορίστε ένα που ελέγχετε ώστε να λάβετε τον κωδικό για να επιβεβαιώσετε τον νεοδημιουργηθέντα χρήστη λογαριασμό σας όπως αυτό:
Ακόμα και αν φαίνεται ότι μπορείτε να χρησιμοποιήσετε το ίδιο email και τον αριθμό τηλεφώνου, όταν χρειαστεί να επαληθεύσετε τον δημιουργημένο χρήστη, το Cognito θα παραπονεθεί για τη χρήση των ίδιων πληροφοριών και δεν θα σας επιτρέψει να επαληθεύσετε τον λογαριασμό.
Από προεπιλογή, ένας χρήστης μπορεί να τροποποιήσει την τιμή των χαρακτηριστικών του με κάτι σαν:
Μπορείτε να βρείτε προσαρμοσμένα χαρακτηριστικά να χρησιμοποιούνται (όπως το isAdmin
), καθώς από προεπιλογή μπορείτε να αλλάξετε τις τιμές των δικών σας χαρακτηριστικών, μπορεί να είστε σε θέση να κλιμακώσετε τα δικαιώματα αλλάζοντας την τιμή μόνοι σας!
Μπορείτε να το χρησιμοποιήσετε για να τροποποιήσετε το email και τον αριθμό τηλεφώνου ενός χρήστη, αλλά τότε, ακόμη και αν ο λογαριασμός παραμένει επαληθευμένος, αυτά τα χαρακτηριστικά είναι ορισμένα σε μη επαληθευμένη κατάσταση (πρέπει να τα επαληθεύσετε ξανά).
Δεν θα μπορείτε να συνδεθείτε με email ή αριθμό τηλεφώνου μέχρι να τα επαληθεύσετε, αλλά θα μπορείτε να συνδεθείτε με το όνομα χρήστη.
Σημειώστε ότι ακόμη και αν το email έχει τροποποιηθεί και δεν έχει επαληθευτεί, θα εμφανίζεται στο ID Token μέσα στο email
πεδίο και το πεδίο email_verified
θα είναι ψευδές, αλλά αν η εφαρμογή δεν ελέγχει αυτό, μπορεί να μπορέσετε να προσποιηθείτε άλλους χρήστες.
Επιπλέον, σημειώστε ότι μπορείτε να βάλετε οτιδήποτε μέσα στο name
πεδίο απλά τροποποιώντας το όνομα χαρακτηριστικού. Αν μια εφαρμογή ελέγχει αυτό το πεδίο για κάποιο λόγο αντί του email
(ή οποιουδήποτε άλλου χαρακτηριστικού) μπορεί να είστε σε θέση να προσποιηθείτε άλλους χρήστες.
Ούτως ή άλλως, αν για κάποιο λόγο αλλάξατε το email σας, για παράδειγμα σε ένα νέο που μπορείτε να αποκτήσετε πρόσβαση, μπορείτε να επιβεβαιώσετε το email με τον κωδικό που λάβατε σε αυτή τη διεύθυνση email:
Χρησιμοποιήστε phone_number
αντί για email
για να αλλάξετε/επιβεβαιώσετε έναν νέο αριθμό τηλεφώνου.
Ο διαχειριστής θα μπορούσε επίσης να ενεργοποιήσει την επιλογή για σύνδεση με ένα όνομα χρήστη που προτιμά ο χρήστης. Σημειώστε ότι δεν θα μπορείτε να αλλάξετε αυτή την τιμή σε οποιοδήποτε όνομα χρήστη ή preferred_username που χρησιμοποιείται ήδη για να προσποιηθείτε έναν διαφορετικό χρήστη.
Είναι δυνατόν να ανακτήσετε έναν κωδικό απλά γνωρίζοντας το όνομα χρήστη (ή το email ή το τηλέφωνο γίνονται αποδεκτά) και έχοντας πρόσβαση σε αυτό καθώς θα σταλεί εκεί ένας κωδικός:
Η απάντηση του διακομιστή θα είναι πάντα θετική, σαν να υπήρχε το όνομα χρήστη. Δεν μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να καταγράψετε χρήστες.
Με τον κώδικα μπορείτε να αλλάξετε τον κωδικό πρόσβασης με:
Για να αλλάξετε τον κωδικό πρόσβασης, πρέπει να γνωρίζετε τον προηγούμενο κωδικό πρόσβασης:
Μια ομάδα χρηστών υποστηρίζει διαφορετικούς τρόπους αυθεντικοποίησης σε αυτήν. Αν έχετε ένα όνομα χρήστη και κωδικό πρόσβασης, υπάρχουν επίσης διαφορετικές μέθοδοι που υποστηρίζονται για σύνδεση. Επιπλέον, όταν ένας χρήστης είναι αυθεντικοποιημένος στην ομάδα, δίνονται 3 τύποι διακριτικών: Το ID Token, το Access token και το Refresh token.
ID Token: Περιέχει αξιώσεις σχετικά με την ταυτότητα του αυθεντικοποιημένου χρήστη, όπως name
, email
και phone_number
. Το ID token μπορεί επίσης να χρησιμοποιηθεί για να αυθεντικοποιήσει τους χρήστες στους διακομιστές πόρων ή τις εφαρμογές διακομιστή σας. Πρέπει να επαληθεύσετε την υπογραφή του ID token πριν μπορέσετε να εμπιστευτείτε οποιαδήποτε αξίωση μέσα στο ID token αν το χρησιμοποιείτε σε εξωτερικές εφαρμογές.
Το ID Token είναι το διακριτικό που περιέχει τις τιμές των χαρακτηριστικών του χρήστη, ακόμη και τις προσαρμοσμένες.
Access Token: Περιέχει αξιώσεις σχετικά με τον αυθεντικοποιημένο χρήστη, μια λίστα με τις ομάδες του χρήστη και μια λίστα με τα scopes. Ο σκοπός του access token είναι να εξουσιοδοτήσει τις λειτουργίες API στο πλαίσιο του χρήστη στην ομάδα χρηστών. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το access token για να παρέχετε πρόσβαση στον χρήστη σας για να προσθέσει, να αλλάξει ή να διαγράψει χαρακτηριστικά χρήστη.
Refresh Token: Με τα refresh tokens μπορείτε να πάρετε νέα ID Tokens και Access Tokens για τον χρήστη μέχρι το refresh token να είναι άκυρο. Από προεπιλογή, το refresh token λήγει 30 ημέρες μετά που ο χρήστης της εφαρμογής σας συνδέεται στην ομάδα χρηστών σας. Όταν δημιουργείτε μια εφαρμογή για την ομάδα χρηστών σας, μπορείτε να ορίσετε την ημερομηνία λήξης του refresh token της εφαρμογής σε οποιαδήποτε τιμή μεταξύ 60 λεπτών και 10 ετών.
Αυτή είναι η ροή αυθεντικοποίησης από την πλευρά του διακομιστή:
Η εφαρμογή από την πλευρά του διακομιστή καλεί τη AdminInitiateAuth
API operation (αντί της InitiateAuth
). Αυτή η λειτουργία απαιτεί διαπιστευτήρια AWS με δικαιώματα που περιλαμβάνουν cognito-idp:AdminInitiateAuth
και cognito-idp:AdminRespondToAuthChallenge
. Η λειτουργία επιστρέφει τις απαιτούμενες παραμέτρους αυθεντικοποίησης.
Αφού η εφαρμογή από την πλευρά του διακομιστή έχει τις παραμέτρους αυθεντικοποίησης, καλεί τη AdminRespondToAuthChallenge
API operation. Η AdminRespondToAuthChallenge
API operation επιτυγχάνει μόνο όταν παρέχετε διαπιστευτήρια AWS.
Αυτή η μέθοδος ΔΕΝ είναι ενεργοποιημένη από προεπιλογή.
Για να συνδεθείτε πρέπει να γνωρίζετε:
id ομάδας χρηστών
client id
όνομα χρήστη
κωδικό πρόσβασης
μυστικό client (μόνο αν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα μυστικό)
Για να είστε σε θέση να συνδεθείτε με αυτή τη μέθοδο, η εφαρμογή αυτή πρέπει να επιτρέπει τη σύνδεση με ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Επιπλέον, για να εκτελέσετε αυτή την ενέργεια χρειάζεστε διαπιστευτήρια με τα δικαιώματα cognito-idp:AdminInitiateAuth
και cognito-idp:AdminRespondToAuthChallenge