Cognito User Pools
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
Basic Information
Ένα user pool είναι ένας κατάλογος χρηστών στο Amazon Cognito. Με ένα user pool, οι χρήστες σας μπορούν να συνδεθούν στην ιστοσελίδα ή την κινητή εφαρμογή σας μέσω του Amazon Cognito, ή να ομοσπονδιοποιηθούν μέσω ενός παρόχου ταυτότητας τρίτου μέρους (IdP). Είτε οι χρήστες σας συνδέονται απευθείας είτε μέσω τρίτου μέρους, όλα τα μέλη του user pool έχουν ένα προφίλ καταλόγου που μπορείτε να αποκτήσετε πρόσβαση μέσω ενός SDK.
Τα user pools παρέχουν:
- Υπηρεσίες εγγραφής και σύνδεσης.
- Μια ενσωματωμένη, προσαρμόσιμη διαδικτυακή διεπαφή για τη σύνδεση χρηστών.
- Κοινωνική σύνδεση με Facebook, Google, Login with Amazon, και Sign in with Apple, και μέσω SAML και OIDC παρόχων ταυτότητας από το user pool σας.
- Διαχείριση καταλόγου χρηστών και προφίλ χρηστών.
- Χαρακτηριστικά ασφαλείας όπως η πολυπαραγοντική αυθεντικοποίηση (MFA), έλεγχοι για παραβιασμένα διαπιστευτήρια, προστασία από κατάληψη λογαριασμού, και επαλήθευση τηλεφώνου και email.
- Προσαρμοσμένες ροές εργασίας και μετανάστευση χρηστών μέσω των triggers AWS Lambda.
Ο πηγαίος κώδικας των εφαρμογών θα περιέχει συνήθως επίσης το user pool ID και το client application ID, (και μερικές φορές το application secret;) που είναι απαραίτητα για έναν χρήστη να συνδεθεί σε ένα Cognito User Pool.
Potential attacks
- Εγγραφή: Από προεπιλογή, ένας χρήστης μπορεί να εγγραφεί μόνος του, οπότε θα μπορούσε να δημιουργήσει έναν χρήστη για τον εαυτό του.
- Αναγνώριση χρηστών: Η λειτουργία εγγραφής μπορεί να χρησιμοποιηθεί για να βρείτε ονόματα χρηστών που ήδη υπάρχουν. Αυτή η πληροφορία μπορεί να είναι χρήσιμη για την επίθεση brute-force.
- Brute-force σύνδεση: Στην ενότητα Authentication έχετε όλες τις μεθόδους που έχει ένας χρήστης για να συνδεθεί, θα μπορούσατε να προσπαθήσετε να τις επιτεθείτε brute-force για να βρείτε έγκυρα διαπιστευτήρια.
Tools for pentesting
- Pacu, τώρα περιλαμβάνει τα modules
cognito__enumκαιcognito__attackπου αυτοματοποιούν την αναγνώριση όλων των πόρων Cognito σε έναν λογαριασμό και επισημαίνουν αδύναμες ρυθμίσεις, χαρακτηριστικά χρηστών που χρησιμοποιούνται για τον έλεγχο πρόσβασης, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και την κλιμάκωση προνομίων με βάση τροποποιήσιμα προσαρμοσμένα χαρακτηριστικά, χρησιμοποιήσιμα διαπιστευτήρια πισίνας ταυτότητας, ρόλους που μπορούν να αναληφθούν σε id tokens, κ.λπ.
Για μια περιγραφή των λειτουργιών των modules δείτε το μέρος 2 της δημοσίευσης στο blog. Για οδηγίες εγκατάστασης δείτε τη κύρια σελίδα Pacu.
# Run cognito__enum usage to gather all user pools, user pool clients, identity pools, users, etc. visible in the current AWS account
Pacu (new:test) > run cognito__enum
# cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and 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 Scanner είναι ένα εργαλείο CLI σε python που υλοποιεί διάφορες επιθέσεις στο Cognito, συμπεριλαμβανομένης της ανεπιθύμητης δημιουργίας λογαριασμού και του account oracle. Δείτε αυτό το σύνδεσμο για περισσότερες πληροφορίες.
# Install
pip install cognito-scanner
# Run
cognito-scanner --help
- CognitoAttributeEnum: Αυτό το σενάριο επιτρέπει την καταμέτρηση έγκυρων χαρακτηριστικών για χρήστες.
python cognito-attribute-enu.py -client_id 16f1g98bfuj9i0g3f8be36kkrl
Εγγραφή
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
Note
Σημειώστε στην προηγούμενη εντολή πώς τα custom attributes ξεκινούν με “custom:”.
Γνωρίστε επίσης ότι κατά την εγγραφή δεν μπορείτε να δημιουργήσετε νέες custom attributes για τον χρήστη. Μπορείτε μόνο να δώσετε τιμή σε default attributes (ακόμα και αν δεν είναι υποχρεωτικά) και custom attributes που έχουν καθοριστεί.
Ή απλά για να δοκιμάσετε αν υπάρχει client id. Αυτό είναι το σφάλμα αν το client-id δεν υπάρχει:
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 επιτρέπει να επιβεβαιώσετε έναν νέο χρήστη επιβεβαιώνοντας το email ή τον αριθμό τηλεφώνου του. Επομένως, κατά τη δημιουργία ενός χρήστη, συνήθως θα απαιτείται τουλάχιστον το όνομα χρήστη και ο κωδικός πρόσβασης και το email και/ή αριθμός τηλεφώνου. Απλά ορίστε ένα που ελέγχετε ώστε να λάβετε τον κωδικό για να επιβεβαιώσετε τον νεοδημιουργηθέντα χρήστη λογαριασμό σας όπως αυτό:
aws cognito-idp confirm-sign-up --client-id <cliet_id> \
--username aasdasd2 --confirmation-code <conf_code> \
--no-sign-request --region us-east-1
Warning
Ακόμα και αν φαίνεται ότι μπορείτε να χρησιμοποιήσετε το ίδιο email και τον αριθμό τηλεφώνου, όταν χρειαστεί να επαληθεύσετε τον δημιουργημένο χρήστη, το Cognito θα παραπονεθεί για τη χρήση των ίδιων στοιχείων και δεν θα σας επιτρέψει να επαληθεύσετε τον λογαριασμό.
Privilege Escalation / Updating Attributes
Από προεπιλογή, ένας χρήστης μπορεί να τροποποιήσει την τιμή των χαρακτηριστικών του με κάτι σαν:
aws cognito-idp update-user-attributes \
--region us-east-1 --no-sign-request \
--user-attributes Name=address,Value=street \
--access-token <access token>
Custom attribute privesc
Caution
Μπορεί να βρείτε custom attributes να χρησιμοποιούνται (όπως το
isAdmin), καθώς από προεπιλογή μπορείτε να αλλάξετε τις τιμές των δικών σας attributes, μπορεί να είστε σε θέση να κλιμακώσετε τα προνόμια αλλάζοντας την τιμή μόνοι σας!
Email/username modification privesc
Μπορείτε να χρησιμοποιήσετε αυτό για να τροποποιήσετε το email και τον αριθμό τηλεφώνου ενός χρήστη, αλλά τότε, ακόμη και αν ο λογαριασμός παραμένει επαληθευμένος, αυτά τα attributes είναι ρυθμισμένα σε μη επαληθευμένη κατάσταση (πρέπει να τα επαληθεύσετε ξανά).
Warning
Δεν θα μπορείτε να συνδεθείτε με email ή αριθμό τηλεφώνου μέχρι να τα επαληθεύσετε, αλλά θα μπορείτε να συνδεθείτε με το username.
Σημειώστε ότι ακόμη και αν το email έχει τροποποιηθεί και δεν έχει επαληθευτεί, θα εμφανίζεται στο ID Token μέσα στοemail_verifiedθα είναι false, αλλά αν η εφαρμογή δεν ελέγχει αυτό, μπορεί να μπορέσετε να προσποιηθείτε άλλους χρήστες.
Επιπλέον, σημειώστε ότι μπορείτε να βάλετε οτιδήποτε μέσα στο
namefield απλά τροποποιώντας το name attribute. Αν μια εφαρμογή ελέγχει αυτό το πεδίο για κάποιο λόγο αντί για το
Ούτως ή άλλως, αν για κάποιο λόγο αλλάξατε το 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 για να αλλάξετε/επιβεβαιώσετε έναν νέο αριθμό τηλεφώνου.
Note
Ο διαχειριστής θα μπορούσε επίσης να ενεργοποιήσει την επιλογή σύνδεσης με ένα όνομα χρήστη που προτιμά ο χρήστης. Σημειώστε ότι δεν θα μπορείτε να αλλάξετε αυτή την τιμή σε οποιοδήποτε όνομα χρήστη ή preferred_username που χρησιμοποιείται ήδη για να προσποιηθείτε έναν διαφορετικό χρήστη.
Ανάκτηση/Αλλαγή Κωδικού
Είναι δυνατόν να ανακτήσετε έναν κωδικό απλά γνωρίζοντας το όνομα χρήστη (ή το email ή το τηλέφωνο γίνονται αποδεκτά) και έχοντας πρόσβαση σε αυτό καθώς θα σταλεί εκεί ένας κωδικός:
aws cognito-idp forgot-password \
--client-id <client_id> \
--username <username/email/phone> --region <region>
Note
Η απάντηση του διακομιστή θα είναι πάντα θετική, όπως αν το όνομα χρήστη υπήρχε. Δεν μπορείτε να χρησιμοποιήσετε αυτή τη μέθοδο για να καταγράψετε χρήστες
Με τον κώδικα μπορείτε να αλλάξετε τον κωδικό πρόσβασης με:
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>
Αυθεντικοποίηση
Μια πισίνα χρηστών υποστηρίζει διαφορετικούς τρόπους αυθεντικοποίησης σε αυτήν. Αν έχετε ένα όνομα χρήστη και κωδικό πρόσβασης, υπάρχουν επίσης διαφορετικές μέθοδοι που υποστηρίζονται για σύνδεση.
Επιπλέον, όταν ένας χρήστης είναι αυθεντικοποιημένος στην Πισίνα δίνονται 3 τύποι διακριτικών: Το ID Token, το Access token και το Refresh token.
- ID Token: Περιέχει αξιώσεις σχετικά με την ταυτότητα του αυθεντικοποιημένου χρήστη, όπως
name,emailκαιphone_number. Το ID token μπορεί επίσης να χρησιμοποιηθεί για να αυθεντικοποιήσει τους χρήστες στους διακομιστές πόρων ή τις εφαρμογές διακομιστή σας. Πρέπει να επαληθεύσετε την υπογραφή του ID token πριν μπορέσετε να εμπιστευτείτε οποιαδήποτε αξίωση μέσα στο ID token αν το χρησιμοποιείτε σε εξωτερικές εφαρμογές. - Το ID Token είναι το διακριτικό που περιέχει τις τιμές των χαρακτηριστικών του χρήστη, ακόμη και τα προσαρμοσμένα.
- Access Token: Περιέχει αξιώσεις σχετικά με τον αυθεντικοποιημένο χρήστη, μια λίστα με τις ομάδες του χρήστη και μια λίστα με τις περιοχές. Ο σκοπός του access token είναι να εξουσιοδοτήσει τις λειτουργίες API στο πλαίσιο του χρήστη στην πισίνα χρηστών. Για παράδειγμα, μπορείτε να χρησιμοποιήσετε το access token για να παρέχετε πρόσβαση στον χρήστη σας για να προσθέσει, να αλλάξει ή να διαγράψει χαρακτηριστικά χρηστών.
- Refresh Token: Με τα refresh tokens μπορείτε να πάρετε νέα ID Tokens και Access Tokens για τον χρήστη μέχρι το refresh token να είναι άκυρο. Από προεπιλογή, το refresh token λήγει 30 ημέρες μετά που ο χρήστης της εφαρμογής σας συνδέεται στην πισίνα χρηστών σας. Όταν δημιουργείτε μια εφαρμογή για την πισίνα χρηστών σας, μπορείτε να ορίσετε την ημερομηνία λήξης του refresh token της εφαρμογής σε οποιαδήποτε τιμή μεταξύ 60 λεπτών και 10 ετών.
ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
Αυτή είναι η ροή αυθεντικοποίησης από την πλευρά του διακομιστή:
- Η εφαρμογή από την πλευρά του διακομιστή καλεί τη
AdminInitiateAuthAPI operation (αντί τηςInitiateAuth). Αυτή η λειτουργία απαιτεί διαπιστευτήρια AWS με άδειες που περιλαμβάνουνcognito-idp:AdminInitiateAuthκαιcognito-idp:AdminRespondToAuthChallenge. Η λειτουργία επιστρέφει τις απαιτούμενες παραμέτρους αυθεντικοποίησης. - Αφού η εφαρμογή από την πλευρά του διακομιστή έχει τις παραμέτρους αυθεντικοποίησης, καλεί τη
AdminRespondToAuthChallengeAPI operation. ΗAdminRespondToAuthChallengeAPI operation επιτυγχάνει μόνο όταν παρέχετε διαπιστευτήρια AWS.
Αυτή η μέθοδος ΔΕΝ είναι ενεργοποιημένη από προεπιλογή.
Για να συνδεθείτε πρέπει να γνωρίζετε:
- id πισίνας χρηστών
- client id
- όνομα χρήστη
- κωδικό πρόσβασης
- μυστικό client (μόνο αν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα μυστικό)
Note
Για να μπορείτε να συνδεθείτε με αυτή τη μέθοδο, η εφαρμογή πρέπει να επιτρέπει τη σύνδεση με
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 base64client_id = “
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** αντί γι' αυτήν (καθώς αυτή ποτέ δεν στέλνει τον κωδικό πρόσβασης μέσω του δικτύου).\
Αυτή η **μέθοδος ΔΕΝ είναι ενεργοποιημένη** από προεπιλογή.
Η κύρια **διαφορά** με την **προηγούμενη μέθοδο αυθεντικοποίησης** μέσα στον κώδικα είναι ότι **δεν χρειάζεται να γνωρίζετε το ID της ομάδας χρηστών** και ότι **δεν χρειάζεστε επιπλέον δικαιώματα** στην Ομάδα Χρηστών Cognito.
Για να **συνδεθείτε** πρέπει να γνωρίζετε:
- client id
- username
- password
- client secret (μόνο αν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα μυστικό)
> [!NOTE]
> Για να **μπορείτε να συνδεθείτε με αυτή τη μέθοδο**, αυτή η εφαρμογή πρέπει να επιτρέπει τη σύνδεση με ALLOW_USER_PASSWORD_AUTH.
```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
Κώδικας Python για Σύνδεση
```python import boto3 import botocore import hmac import hashlib import base64client_id = “
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.initiate_auth( 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_SRP_AUTH
Αυτό το σενάριο είναι παρόμοιο με το προηγούμενο αλλά **αντί να στείλετε τον κωδικό πρόσβασης** μέσω του δικτύου για να συνδεθείτε, **εκτελείται αυθεντικοποίηση πρόκλησης** (έτσι δεν υπάρχει κωδικός πρόσβασης που να διακινείται ακόμη και κρυπτογραφημένος μέσω του δικτύου).\
Αυτή η **μέθοδος είναι ενεργοποιημένη** από προεπιλογή.
Για να **συνδεθείτε** πρέπει να γνωρίζετε:
- user pool id
- client id
- username
- password
- client secret (μόνο αν η εφαρμογή είναι ρυθμισμένη να χρησιμοποιεί ένα μυστικό)
<details>
<summary>Code to login</summary>
```python
from warrant.aws_srp import AWSSRP
import os
USERNAME='xxx'
PASSWORD='yyy'
POOL_ID='us-east-1_zzzzz'
CLIENT_ID = '12xxxxxxxxxxxxxxxxxxxxxxx'
CLIENT_SECRET = 'secreeeeet'
os.environ["AWS_DEFAULT_REGION"] = "<region>"
aws = AWSSRP(username=USERNAME, password=PASSWORD, pool_id=POOL_ID,
client_id=CLIENT_ID, client_secret=CLIENT_SECRET)
tokens = aws.authenticate_user()
id_token = tokens['AuthenticationResult']['IdToken']
refresh_token = tokens['AuthenticationResult']['RefreshToken']
access_token = tokens['AuthenticationResult']['AccessToken']
token_type = tokens['AuthenticationResult']['TokenType']
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>'
Κώδικας για ανανέωση
```python import boto3 import botocore import hmac import hashlib import base64client_id = “
boto_client = boto3.client(‘cognito-idp’, region_name=‘
def refresh(client_id, refresh_token): try: return boto_client.initiate_auth( ClientId=client_id, AuthFlow=‘REFRESH_TOKEN_AUTH’, AuthParameters={ ‘REFRESH_TOKEN’: refresh_token } ) except botocore.exceptions.ClientError as e: return e.response
print(refresh(client_id, token))
</details>
### CUSTOM_AUTH
Σε αυτή την περίπτωση, η **αυθεντικοποίηση** θα πραγματοποιηθεί μέσω της **εκτέλεσης μιας συνάρτησης lambda**.
## Extra Security
### Advanced Security
Από προεπιλογή είναι απενεργοποιημένο, αλλά αν ενεργοποιηθεί, το Cognito θα μπορούσε να είναι σε θέση να **βρει καταλήψεις λογαριασμών**. Για να ελαχιστοποιήσετε την πιθανότητα, θα πρέπει να συνδεθείτε από ένα **δίκτυο μέσα στην ίδια πόλη, χρησιμοποιώντας τον ίδιο user agent** (και IP αν είναι δυνατόν)**.**
### **MFA Remember device**
Αν ο χρήστης συνδεθεί από την ίδια συσκευή, η MFA μπορεί να παρακαμφθεί, επομένως προσπαθήστε να συνδεθείτε από τον ίδιο περιηγητή με τα ίδια μεταδεδομένα (IP;) για να προσπαθήσετε να παρακάμψετε την προστασία MFA.
## User Pool Groups IAM Roles
Είναι δυνατόν να προστεθούν **χρήστες σε ομάδες User Pool** που σχετίζονται με **IAM roles**.\
Επιπλέον, οι **χρήστες** μπορούν να ανατεθούν σε **περισσότερες από 1 ομάδα με διαφορετικά IAM roles** συνημμένα.
Σημειώστε ότι ακόμη και αν μια ομάδα είναι μέσα σε μια ομάδα με ένα IAM role συνημμένο, για να μπορέσετε να αποκτήσετε πρόσβαση στα IAM credentials αυτής της ομάδας, είναι απαραίτητο να είναι **το User Pool αξιόπιστο από ένα Identity Pool** (και να γνωρίζετε τις λεπτομέρειες αυτού του Identity Pool).
Ένα άλλο απαραίτητο στοιχείο για να αποκτήσετε το **IAM role που υποδεικνύεται στο IdToken** όταν ένας χρήστης είναι αυθεντικοποιημένος στο User Pool (`aws cognito-idp initiate-auth...`) είναι ότι ο **Identity Provider Authentication provider** πρέπει να υποδείξει ότι **ο ρόλος πρέπει να επιλεγεί από το token.**
<figure><img src="../../../../images/image (250).png" alt=""><figcaption></figcaption></figure>
Οι **ρόλοι** στους οποίους έχει πρόσβαση ένας χρήστης είναι **μέσα στο `IdToken`**, και ένας χρήστης μπορεί να **επιλέξει ποιον ρόλο θα ήθελε διαπιστευτήρια για** με το **`--custom-role-arn`** από `aws cognito-identity get-credentials-for-identity`.\
Ωστόσο, αν η **προεπιλεγμένη επιλογή** είναι αυτή που είναι **ρυθμισμένη** (`use default role`), και προσπαθήσετε να αποκτήσετε πρόσβαση σε έναν ρόλο από το IdToken, θα λάβετε **σφάλμα** (γι' αυτό απαιτείται η προηγούμενη ρύθμιση):
An error occurred (InvalidParameterException) when calling the GetCredentialsForIdentity operation: Only SAML providers and providers with RoleMappings support custom role ARN.
> [!WARNING]
> Σημειώστε ότι ο ρόλος που έχει ανατεθεί σε μια **User Pool Group** πρέπει να είναι **προσβάσιμος από τον Identity Provider** που **εμπιστεύεται την User Pool** (καθώς τα **credentials συνεδρίας IAM ρόλου θα αποκτηθούν από αυτόν**).
```json
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"Federated": "cognito-identity.amazonaws.com"
},
"Action": "sts:AssumeRoleWithWebIdentity",
"Condition": {
"StringEquals": {
"cognito-identity.amazonaws.com:aud": "us-east-1:2361092e-9db6-a876-1027-10387c9de439"
},
"ForAnyValue:StringLike": {
"cognito-identity.amazonaws.com:amr": "authenticated"
}
}
}
]
}js
Tip
Μάθετε & εξασκηθείτε στο AWS Hacking:
HackTricks Training AWS Red Team Expert (ARTE)
Μάθετε & εξασκηθείτε στο GCP Hacking:HackTricks Training GCP Red Team Expert (GRTE)
Μάθετε & εξασκηθείτε στο Az Hacking:HackTricks Training Azure Red Team Expert (AzRTE)
Υποστηρίξτε το HackTricks
- Δείτε τα subscription plans!
- Εγγραφείτε στο 💬 Discord group ή την telegram group ή ακολουθήστε μας στο Twitter 🐦 @hacktricks_live.
- Μοιραστείτε τα hacking tricks υποβάλλοντας PRs στα HackTricks και HackTricks Cloud github repos.
HackTricks Cloud

