Cognito User Pools

Μάθετε το χάκινγκ του AWS από το μηδέν μέχρι τον ήρωα με το htARTE (HackTricks AWS Red Team Expert)!

Άλλοι τρόποι υποστήριξης του HackTricks:

Βασικές Πληροφορίες

Ένα user pool είναι ένας κατάλογος χρηστών στο Amazon Cognito. Με ένα user pool, οι χρήστες σας μπορούν να συνδεθούν στην ιστοσελίδα ή την εφαρμογή σας μέσω του Amazon Cognito, ή να συνδεθούν μέσω ενός τρίτου παρόχου ταυτότητας (IdP). Είτε οι χρήστες σας συνδέονται απευθείας είτε μέσω τρίτου παρόχου, όλα τα μέλη του user pool έχουν ένα προφίλ καταλόγου στο οποίο μπορείτε να έχετε πρόσβαση μέσω ενός SDK.

Οι user pools παρέχουν:

  • Υπηρεσίες εγγραφής και σύνδεσης.

  • Έναν ενσωματωμένο, προσαρμόσιμο web UI για τη σύνδεση των χρηστών.

  • Κοινωνική σύνδεση με Facebook, Google, Login with Amazon και Sign in with Apple, καθώς και μέσω SAML και OIDC παρόχων ταυτότητας από τον user pool σας.

  • Διαχείριση καταλόγου χρηστών και προφίλ χρηστών.

  • Χαρακτηριστικά ασφαλείας, όπως πολυπαραγοντική πιστοποίηση (MFA), έλεγχοι για παραβιασμένα διαπιστευτήρια, προστασία από κατάληψη λογαριασμού και επαλήθευση τηλεφώνου και ηλεκτρονικού ταχυδρομείου.

  • Προσαρμοσμένες ροές εργασίας και μετάβαση χρηστών μέσω των AWS Lambda triggers.

Ο πηγαίος κώδικας των εφαρμογών συνήθως περιέχει επίσης το ID του user pool και το ID της εφαρμογής πελάτη, (και μερικές φορές το μυστικό της εφαρμογής?) τα οποία απαιτούνται για την σύνδεση ενός χρήστη σε ένα Cognito User Pool.

Δυνητικές επιθέσεις

  • Εγγραφή: Από προεπιλογή ένας χρήστης μπορεί να εγγραφεί μόνος του, οπότε μπορεί να δημιουργήσει έναν χρήστη για τον εαυτό του.

  • Απαρίθμηση χρηστών: Η λειτουργία εγγραφής μπορεί να χρησιμοποιηθεί για την εύρεση ονομάτων χρηστών που υπάρχουν ήδη. Αυτή η πληροφορία μπορεί να είναι χρήσιμη για επίθεση με βίαιη δοκιμή.

  • Βίαιη δοκιμή σύνδεσης: Στην ενότητα Πιστοποίηση έχετε όλες τις μεθόδους που ένας χρήστης πρέπει να συνδεθεί, μπορείτε να προσπαθήσετε να τις επιτεθείτε με βίαιη δοκιμή για να βρείτε έγκυρα διαπιστευτήρια.

Εργαλεία για το pentesting

  • Pacu, το πλαίσιο εκμετάλλευσης του AWS, περιλαμβάνει τώρα τα αρθρώματα "cognito__enum" και "cognito__attack" που αυτοματοποιούν την απαρίθμηση όλων των πόρων Cognito σε έναν λογαριασμό και εντοπίζουν αδύναμες διαμορφώσεις, χαρακτηριστικά χρηστών που χρησιμοποιούνται για έλεγχο πρόσβασης κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρήστη (συμπεριλαμβανομένης της υποστήριξης MFA) και την ανέλιξη προνομιακών δικαιωμάτων με βάση τα προσαρμόσιμα προσαρμόσιμα χαρακτηριστικά, τα διαπιστευτήρια του identity pool που μπορούν να χρησιμοποιηθούν, τους ρόλους που μπορούν να υποθέσουν στα id tokens κ.λπ.

Για μια περιγραφή των λειτουργιών των αρθρωμάτων, δείτε το μέρος 2 της ανάρτησης στο blog. Για οδηγίες εγκατάστασης, δείτε την κύρια σελίδα του Pacu.

Χρήση

Δείγμα χρήσης του cognito__attack για να προσπαθήσετε τη δημιουργία χρήστη και όλων των διανυσμάτων προνομιακής ανέλιξης εναντίον ενός συγκεκριμένου identity pool και user pool client:

Pacu (new:test) > run cognito__attack --username randomuser --email XX+sdfs2@gmail.com --identity_pools
us-east-2:a06XXXXX-c9XX-4aXX-9a33-9ceXXXXXXXXX --user_pool_clients
59f6tuhfXXXXXXXXXXXXXXXXXX@us-east-2_0aXXXXXXX

Δείγμα χρήσης του cognito__enum για να συγκεντρώσετε όλα τα user pools, user pool clients, identity pools, χρήστες κλπ. που είναι ορατά στον τρέχοντα λογαριασμό AWS:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner είναι ένα εργαλείο γραμμής εντολών σε python που υλοποιεί διάφορες επιθέσεις στο Cognito, συμπεριλαμβανομένης της ανεπιθύμητης δημιουργίας λογαριασμού και του λογαριασμού oracle.

Εγκατάσταση

$ pip install cognito-scanner

Χρήση

$ cognito-scanner --help

Για περισσότερες πληροφορίες ελέγξτε το https://github.com/padok-team/cognito-scanner

Εγγραφή

Τα User Pools επιτρέπουν από προεπιλογή την εγγραφή νέων χρηστών.

aws cognito-idp sign-up --client-id <client-id> \
--username <username> --password <password> \
--region <region> --no-sign-request

Εάν οποιοσδήποτε μπορεί να εγγραφεί

Μπορεί να συναντήσετε ένα σφάλμα που σας υποδεικνύει ότι χρειάζεται να παρέχετε περισσότερες λεπτομέρειες για τον χρήστη:

An error occurred (InvalidParameterException) when calling the SignUp operation: Attributes did not conform to the schema: address: The attribute is required

Μπορείτε να παρέχετε τις απαιτούμενες λεπτομέρειες με ένα JSON όπως:

--user-attributes '[{"Name": "email", "Value": "carlospolop@gmail.com"}, {"Name":"gender", "Value": "M"}, {"Name": "address", "Value": "street"}, {"Name": "custom:custom_name", "Value":"supername&\"*$"}]'

Μπορείτε επίσης να χρησιμοποιήσετε αυτή τη λειτουργία για να απαριθμήσετε τους υπάρχοντες χρήστες. Αυτό είναι το μήνυμα σφάλματος όταν υπάρχει ήδη ένας χρήστης με αυτό το όνομα:

An error occurred (UsernameExistsException) when calling the SignUp operation: User already exists

Σημείωση στην προηγούμενη εντολή πώς τα προσαρμοσμένα χαρακτηριστικά ξεκινούν με "custom:". Επίσης, να γνωρίζετε ότι κατά την εγγραφή δεν μπορείτε να δημιουργήσετε νέα προσαρμοσμένα χαρακτηριστικά για τον χρήστη. Μπορείτε μόνο να δώσετε τιμή σε προεπιλεγμένα χαρακτηριστικά (ακόμα κι αν δεν είναι υποχρεωτικά) και προσδιορισμένα προσαρμοσμένα χαρακτηριστικά.

Ή απλά για να ελέγξετε αν υπάρχει ένας αναγνωριστικός πελάτης. Αυτό είναι το σφάλμα αν ο αναγνωριστικός πελάτης δεν υπάρχει:

An error occurred (ResourceNotFoundException) when calling the SignUp operation: User pool client 3ig612gjm56p1ljls1prq2miut does not exist.

Εάν μόνο ο διαχειριστής μπορεί να εγγράψει χρήστες

Θα συναντήσετε αυτό το σφάλμα και δεν θα μπορείτε να εγγραφείτε ή να απαριθμήσετε χρήστες:

An error occurred (NotAuthorizedException) when calling the SignUp operation: SignUp is not permitted for this user pool

Επαλήθευση Εγγραφής

Το Cognito επιτρέπει την επαλήθευση ενός νέου χρήστη μέσω της επαλήθευσης του ηλεκτρονικού του ταχυδρομείου ή του αριθμού τηλεφώνου. Επομένως, κατά τη δημιουργία ενός χρήστη, συνήθως θα χρειαστείτε τουλάχιστον το όνομα χρήστη και τον κωδικό πρόσβασης και το ηλεκτρονικό ταχυδρομείο και/ή τον αριθμό τηλεφώνου. Απλά ορίστε έναν που ελέγχετε έτσι ώστε να λάβετε τον κωδικό για να επαληθεύσετε τον νεοδημιουργημένο χρήστη λογαριασμό σας όπως εδώ:

aws cognito-idp confirm-sign-up --client-id <cliet_id> \
--username aasdasd2 --confirmation-code <conf_code> \
--no-sign-request --region us-east-1

Ακόμα κι αν φαίνεται ότι μπορείτε να χρησιμοποιήσετε το ίδιο email και τον ίδιο αριθμό τηλεφώνου, όταν χρειαστεί να επαληθεύσετε τον δημιουργημένο χρήστη, το Cognito θα παραπονεθεί για τη χρήση των ίδιων πληροφοριών και δεν θα σας επιτρέψει να επαληθεύσετε τον λογαριασμό.

Ανόδος Προνομίων / Ενημέρωση Χαρακτηριστικών

Από προεπιλογή, ένας χρήστης μπορεί να τροποποιήσει την τιμή των χαρακτηριστικών του με κάτι όπως:

aws cognito-idp update-user-attributes \
--region us-east-1 --no-sign-request \
--user-attributes Name=address,Value=street \
--access-token <access token>

Προώθηση δικαιωμάτων με προσαρμοσμένα χαρακτηριστικά

Μπορεί να βρείτε προσαρμοσμένα χαρακτηριστικά που χρησιμοποιούνται (όπως isAdmin), καθώς από προεπιλογή μπορείτε να αλλάξετε τις τιμές των δικών σας χαρακτηριστικών και μπορείτε να αναβαθμίσετε τα δικαιώματά σας αλλάζοντας την τιμή μόνοι σας!

Προώθηση δικαιωμάτων με τροποποίηση email/username

Μπορείτε να χρησιμοποιήσετε αυτό για να τροποποιήσετε το email και τον αριθμό τηλεφώνου ενός χρήστη, αλλά τότε, ακόμα κι αν ο λογαριασμός παραμένει επαληθευμένος, αυτά τα χαρακτηριστικά θα είναι ορισμένα σε μη επαληθευμένη κατάσταση (θα πρέπει να τα επαληθεύσετε ξανά).

Δεν θα μπορείτε να συνδεθείτε με το email ή τον αριθμό τηλεφώνου μέχρι να τα επαληθεύσετε, αλλά θα μπορείτε να συνδεθείτε με το όνομα χρήστη. Σημειώστε ότι ακόμα κι αν το email τροποποιήθηκε και δεν επαληθεύτηκε, θα εμφανίζεται στο διακριτικό ταυτότητας (ID Token) μέσα στο πεδίο email και το πεδίο email_verified θα είναι ψευδές, αλλά αν η εφαρμογή δεν ελέγχει αυτό μπορείτε να προσποιηθείτε ως άλλοι χρήστες.

Επιπλέον, σημειώστε ότι μπορείτε να βάλετε οτιδήποτε μέσα στο πεδίο name απλά τροποποιώντας το χαρακτηριστικό όνομα. Αν μια εφαρμογή ελέγχει αυτό το πεδίο για κάποιο λόγο αντί για το email (ή οποιοδήποτε άλλο χαρακτηριστικό), μπορείτε να προσποιηθείτε ως άλλοι χρήστες.

Πάντως, αν για κάποιο λόγο άλλαξε το email σας για παράδειγμα σε ένα νέο, μπορείτε να επιβεβαιώσετε το email με τον κωδικό που λάβατε σε αυτήν τη διεύθυνση email:

aws cognito-idp verify-user-attribute \
--access-token <access_token> \
--attribute-name email --code <code> \
--region <region> --no-sign-request

Χρησιμοποιήστε το phone_number αντί για το email για να αλλάξετε/επαληθεύσετε ένα νέο αριθμό τηλεφώνου.

Ο διαχειριστής μπορεί επίσης να ενεργοποιήσει την επιλογή για σύνδεση με προτιμώμενο όνομα χρήστη. Σημειώστε ότι δεν θα μπορείτε να αλλάξετε αυτήν την τιμή σε οποιοδήποτε όνομα χρήστη ή προτιμώμενο_όνομα που ήδη χρησιμοποιείται για να προσποιηθείτε ως διαφορετικός χρήστης.

Ανάκτηση/Αλλαγή Κωδικού Πρόσβασης

Είναι δυνατή η ανάκτηση ενός κωδικού πρόσβασης απλά γνωρίζοντας το όνομα χρήστη (ή το email ή το τηλέφωνο γίνεται αποδεκτό) και έχοντας πρόσβαση σε αυτό, καθώς θα αποσταλεί ένας κωδικός εκεί:

aws cognito-idp forgot-password \
--client-id <client_id> \
--username <username/email/phone> --region <region>

Η απάντηση του διακομιστή θα είναι πάντα θετική, σαν να υπάρχει το όνομα χρήστη. Δεν μπορείτε να χρησιμοποιήσετε αυτήν τη μέθοδο για να απαριθμήσετε τους χρήστες.

Με τον παρακάτω κώδικα μπορείτε να αλλάξετε τον κωδικό πρόσβασης:

aws cognito-idp confirm-forgot-password \
--client-id <client_id> \
--username <username> \
--confirmation-code <conf_code> \
--password <pwd> --region <region>

Για να αλλάξετε τον κωδικό πρόσβασης, χρειάζεστε να γνωρίζετε τον προηγούμενο κωδικό πρόσβασης:

aws cognito-idp change-password \
--previous-password <value> \
--proposed-password <value> \
--access-token <value>

Ταυτοποίηση

Ένα user pool υποστηρίζει διάφορους τρόπους ταυτοποίησης. Αν έχετε ένα όνομα χρήστη και κωδικό πρόσβασης, υπάρχουν επίσης διάφορες μέθοδοι που υποστηρίζονται για την σύνδεση. Επιπλέον, όταν ένας χρήστης ταυτοποιείται στο Pool, δίνονται 3 είδη διακριτικών: Το ID Token, το Access token και το Refresh token.

  • ID Token: Περιέχει δηλώσεις σχετικά με την ταυτότητα του ταυτοποιημένου χρήστη, όπως το όνομα, το email και το phone_number. Το ID token μπορεί επίσης να χρησιμοποιηθεί για να ταυτοποιήσει τους χρήστες στους διακομιστές πόρων ή στις εφαρμογές διακομιστή. Πρέπει να επαληθεύσετε την υπογραφή του ID token πριν μπορέσετε να εμπιστευτείτε οποιαδήποτε δήλωση μέσα στο ID token αν το χρησιμοποιείτε σε εξωτερικές εφαρμογές.

  • Το ID Token είναι το διακριτικό που περιέχει τις τιμές των χαρακτηριστικών του χρήστη, ακόμα και τα προσαρμοσμένα.

  • Access Token: Περιέχει δηλώσεις σχετικά με τον ταυτοποιημένο χρήστη, μια λίστα με τις ομάδες του χρήστη και μια λίστα με τις εμβέλειες. Ο σκοπός του access token είναι να εξουσιοδοτεί λειτουργίες API στο πλαίσιο του χρήστη στο user pool. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το access token για να επιτρέψετε στον χρήστη σας να προσθέσει, να αλλάξει ή να διαγράψει χαρακτηριστικά χρήστη.

  • Refresh Token: Με τα refresh tokens μπορείτε να λάβετε νέα ID Tokens και Access Tokens για τον χρήστη μέχρι το refresh token να γίνει άκυρο. Από προεπιλογή, το refresh token λήγει 30 ημέρες μετά την είσοδο του χρήστη στο user pool της εφαρμογής σας. Όταν δημιουργείτε μια εφαρμογή για το user pool σας, μπορείτε να ορίσετε την περίοδο ισχύος του refresh token της εφαρμογής σε οποιαδήποτε τιμή από 60 λεπτά έως 10 χρόνια.

ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH

Αυτή είναι η ροή ταυτοποίησης στην πλευρά του διακομιστή:

  • Η εφαρμογή στην πλευρά του διακομιστή καλεί την λειτουργία API AdminInitiateAuth (αντί για την InitiateAuth). Αυτή η λειτουργία απαιτεί διαπιστευτήρια AWS με δικαιώματα που περιλαμβάνουν τα cognito-idp:AdminInitiateAuth και cognito-idp:AdminRespondToAuthChallenge. Η λειτουργία επιστρέφει τις απαιτούμενες παραμέτρους ταυτοποίησης.

  • Αφού η εφαρμογή στην πλευρά του διακομιστή έχει τις παραμέτρους ταυτοποίησης, καλεί την λειτουργία API AdminRespondToAuthChallenge. Η λειτουργία API AdminRespondToAuthChallenge επιτυγχάνει μόνο όταν παρέχετε διαπιστευτήρια AWS.

Αυτή η μέθοδος ΔΕΝ είναι ενεργοποιημένη από προεπιλογή.

Για να συνδεθείτε χρειάζεστε να γνωρίζετε:

  • το αναγνωριστικό του user pool

  • το αναγνωριστικό του πελάτη

  • το όνομα χρήστη

  • τον κωδικό πρόσβασης

  • το μυστικό του πελάτη (μόνο αν η εφαρμογή έχει ρυθμιστεί να χρησιμοποιεί ένα μυστικό)

Για να είστε σε θέση να συνδεθείτε με αυτήν τη μέθοδο, η εφαρμογή πρέπει να επιτρέπει τη σύνδεση με ALLOW_ADMIN_USER_PASSWORD_AUTH. Επιπλέον, για να εκτελέσετε αυτήν την ενέργεια, χρειάζεστε διαπιστευτήρια με τα δικαιώματα cognito-idp:AdminInitiateAuth και cognito-idp:AdminRespondToAuthChallenge.

aws cognito-idp admin-initiate-auth \
--client-id <client-id> \
--auth-flow ADMIN_USER_PASSWORD_AUTH \
--region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'
--user-pool-id "<pool-id>"

# Check the python code to learn how to generate the hsecret_hash
Κώδικας για Σύνδεση

```python import boto3 import botocore import hmac import hashlib import base64

client_id = "" user_pool_id = "" client_secret = "" username = "" password = ""

boto_client = boto3.client('cognito-idp', region_name='us-east-1')

def get_secret_hash(username, client_id, client_secret): key = bytes(client_secret, 'utf-8') message = bytes(f'{username}{client_id}', 'utf-8') return base64.b64encode(hmac.new(key, message, digestmod=hashlib.sha256).digest()).decode()

If the Client App isn't configured to use a secret

just delete the line setting the SECRET_HASH

def login_user(username_or_alias, password, client_id, client_secret, user_pool_id): try: return boto_client.admin_initiate_auth( UserPoolId=user_pool_id, ClientId=client_id, AuthFlow='ADMIN_USER_PASSWORD_AUTH', AuthParameters={ 'USERNAME': username_or_alias, 'PASSWORD': password, 'SECRET_HASH': get_secret_hash(username_or_alias, client_id, client_secret) } ) except botocore.exceptions.ClientError as e: return e.response

print(login_user(username, password, client_id, client_secret, user_pool_id))

</details>

### USER\_PASSWORD\_AUTH

Αυτή η μέθοδος είναι μια ακόμα απλή και παραδοσιακή ροή πιστοποίησης χρήστη και κωδικού πρόσβασης. Συνιστάται να μεταφέρετε μια παραδοσιακή μέθοδο πιστοποίησης στο Cognito και να απενεργοποιήσετε την και να χρησιμοποιήσετε αντ' αυτής τη μέθοδο ALLOW\_USER\_SRP\_AUTH (καθώς αυτή δεν αποστέλλει ποτέ τον κωδικό πρόσβασης μέσω του δικτύου).\
Αυτή η μέθοδος ΔΕΝ είναι ενεργοποιημένη από προεπιλογή.

Η κύρια διαφορά με την προηγούμενη μέθοδο πιστοποίησης στον κώδικα είναι ότι δεν χρειάζεστε να γνωρίζετε το αναγνωριστικό της ομάδας χρηστών και ότι δεν χρειάζεστε επιπλέον δικαιώματα στην ομάδα χρηστών του Cognito.

Για να συνδεθείτε, χρειάζεστε να γνωρίζετε:

* αναγνωριστικό πελάτη
* όνομα χρήστη
* κωδικό πρόσβασης
* μυστικό πελάτη (μόνο αν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα μυστικό)

<div data-gb-custom-block data-tag="hint" data-style='info'>

Για να μπορείτε να συνδεθείτε με αυτήν τη μέθοδο, η εφαρμογή πρέπει να επιτρέπει τη σύνδεση με το ALLOW\_USER\_PASSWORD\_AUTH.

</div>

```python
aws cognito-idp initiate-auth  --client-id <client-id> \
--auth-flow USER_PASSWORD_AUTH --region <region> \
--auth-parameters 'USERNAME=<username>,PASSWORD=<password>,SECRET_HASH=<hash_if_needed>'

# Check the python code to learn how to generate the secret_hash

REFRESH_TOKEN_AUTH & REFRESH_TOKEN

Αυτή η μέθοδος θα είναι πάντα έγκυρη (δεν μπορεί να απενεργοποιηθεί), αλλά χρειάζεστε έναν έγκυρο refresh token.

aws cognito-idp initiate-auth \
--client-id 3ig6h5gjm56p1ljls1prq2miut \
--auth-flow REFRESH_TOKEN_AUTH \
--region us-east-1 \
--auth-parameters 'REFRESH_TOKEN=<token>'

Last updated