AWS - Cognito Privesc
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Pour plus d'informations sur Cognito, consultez :
Comme Cognito peut accorder des identifiants de rôle IAM à la fois aux utilisateurs authentifiés et non authentifiés, si vous localisez l'ID de l'Identity Pool d'une application (qui devrait être codé en dur), vous pouvez obtenir de nouveaux identifiants et donc un privesc (dans un compte AWS où vous n'aviez probablement même pas d'identifiant auparavant).
Pour plus d'informations, consultez cette page.
Impact potentiel : Privesc direct vers le rôle de service attaché aux utilisateurs non authentifiés (et probablement vers celui attaché aux utilisateurs authentifiés).
cognito-identity:SetIdentityPoolRoles
, iam:PassRole
Avec cette permission, vous pouvez accorder n'importe quel rôle cognito aux utilisateurs authentifiés/non authentifiés de l'application cognito.
Si l'application cognito n'a pas les utilisateurs non authentifiés activés, vous pourriez également 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 avec cette permission pourrait par exemple définir un Cognito User Pool sous son contrôle ou tout autre fournisseur d'identité où il peut se connecter comme un moyen d'accéder à ce Cognito Identity Pool. Ensuite, il suffit de se connecter sur ce fournisseur d'utilisateur pour lui permettre d'accéder au rôle authentifié configuré dans l'Identity Pool.
Il est également possible de mal utiliser cette autorisation pour permettre l'authentification de base :
Impact potentiel : Compromettre le rôle IAM authentifié configuré à l'intérieur du pool d'identité.
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 meilleures privilèges ou différents rôles IAM :
Impact potentiel : Privesc vers d'autres groupes Cognito et rôles IAM attachés aux groupes de User Pool.
cognito-idp:CreateGroup
| cognito-idp:UpdateGroup
), iam:PassRole
Un attaquant avec ces permissions pourrait créer/met à jour des groupes avec chaque rôle IAM qui peut être utilisé par un fournisseur d'identité Cognito compromis et faire d'un utilisateur compromis un membre du groupe, accédant à tous ces rôles :
Impact potentiel : Privesc vers d'autres rôles IAM Cognito.
cognito-idp:AdminConfirmSignUp
Cette permission permet de vérifier une inscription. Par défaut, tout le monde peut se connecter aux applications Cognito. Si cela est laissé, un utilisateur pourrait créer un compte avec n'importe quelles données et le vérifier avec cette permission.
Impact potentiel : Privesc indirect au rôle IAM du pool d'identité pour les utilisateurs authentifiés si vous pouvez enregistrer un nouvel utilisateur. Privesc indirect à d'autres fonctionnalités de l'application en pouvant confirmer n'importe quel compte.
cognito-idp:AdminCreateUser
Cette permission 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.
Impact potentiel : Privesc direct vers le rôle IAM du pool d'identité pour les utilisateurs authentifiés. Privesc indirect vers d'autres fonctionnalités de l'application en pouvant 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 il doit le réactiver.
Impact potentiel : Privesc indirect au rôle IAM du pool d'identité pour les utilisateurs authentifiés et permissions de l'utilisateur si l'attaquant avait des identifiants pour un utilisateur désactivé.
cognito-idp:AdminInitiateAuth
, cognito-idp:AdminRespondToAuthChallenge
Cette permission permet de se connecter avec la méthode ADMIN_USER_PASSWORD_AUTH. Pour plus d'informations, suivez le lien.
cognito-idp:AdminSetUserPassword
Cette permission permettrait à un attaquant de changer le mot de passe de n'importe quel utilisateur, lui permettant d'usurper l'identité de n'importe quel utilisateur (qui n'a pas MFA activé).
Impact potentiel : Privesc direct 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 Identity Pool.
cognito-idp:AdminSetUserSettings
| cognito-idp:SetUserMFAPreference
| cognito-idp:SetUserPoolMfaConfig
| cognito-idp:UpdateUserPool
AdminSetUserSettings : Un attaquant pourrait potentiellement abuser de cette permission pour définir un téléphone mobile sous son contrôle comme SMS MFA d'un utilisateur.
SetUserMFAPreference : Semblable à 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.
SetUserPoolMfaConfig: Semblable à 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.
UpdateUserPool : Il est également possible de mettre à jour le pool d'utilisateurs pour changer la politique MFA. Vérifiez cli ici.
Impact potentiel : Privesc indirect vers potentiellement n'importe quel utilisateur dont l'attaquant connaît les identifiants, cela pourrait permettre de contourner la protection MFA.
cognito-idp:AdminUpdateUserAttributes
Un attaquant avec cette permission pourrait changer l'email ou le numéro de téléphone ou tout autre attribut d'un utilisateur sous son contrôle pour essayer d'obtenir plus de privilèges dans une application sous-jacente. Cela permet de changer un email ou un numéro de téléphone et de le définir comme vérifié.
Impact potentiel : Privesc indirect potentiel dans l'application sous-jacente utilisant Cognito User Pool qui donne des privilèges basés sur les attributs des utilisateurs.
cognito-idp:CreateUserPoolClient
| cognito-idp:UpdateUserPoolClient
Un attaquant avec cette permission pourrait créer un nouveau Client User Pool 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 le client de mise à jour), vous pouvez voir toutes les options, vérifiez-le !
Impact potentiel : Privesc indirect potentiel vers l'utilisateur autorisé du 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échargeant un csv avec de nouveaux utilisateurs.
(Dans le cas où vous créez un nouveau travail d'importation, vous pourriez également avoir besoin de la permission iam passrole, je ne l'ai pas encore testée).
Impact potentiel : Privesc direct au rôle IAM du pool d'identité pour les utilisateurs authentifiés. Privesc indirect à 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 pouvoir se connecter via ce fournisseur.
Impact potentiel : Privesc direct vers le rôle IAM du pool d'identité pour les utilisateurs authentifiés. Privesc indirect vers d'autres fonctionnalités de l'application pouvant créer n'importe quel utilisateur.
C'est une permission très courante par défaut dans les rôles des pools d'identité Cognito. Même si un caractère générique dans une permission semble toujours mauvais (surtout venant d'AWS), les permissions données ne sont pas super utiles du point de vue d'un attaquant.
Cette permission permet de lire les informations d'utilisation des pools d'identité et des ID d'identité à l'intérieur des pools d'identité (qui ne sont pas des informations sensibles). Les ID d'identité peuvent avoir des Datasets qui leur sont assignés, qui contiennent des informations sur les sessions (AWS le définit comme un jeu sauvegardé). Il est possible que cela contienne une sorte d'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 permissions pour s'inscrire à un flux Cognito qui publie des changements sur ces datasets ou à une lambda qui se déclenche sur des événements cognito. Je n'ai pas vu cela être utilisé, et je ne m'attendrais pas à des informations sensibles ici, mais ce n'est pas impossible.
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 post de blog. Pour des instructions d'installation, voir la page principale de Pacu.
Exemple d'utilisation de cognito__attack pour tenter la création d'utilisateur et tous les vecteurs de privesc contre un pool d'identité et un client de pool d'utilisateurs donnés :
Exemple d'utilisation de cognito__enum pour rassembler tous les groupes d'utilisateurs, les clients de groupes d'utilisateurs, les groupes d'identité, les utilisateurs, etc. visibles dans le compte AWS actuel :
Cognito Scanner est un outil CLI en python qui implémente différentes attaques sur Cognito, y compris une élévation de privilèges.
Pour plus d'informations, consultez https://github.com/padok-team/cognito-scanner
Apprenez et pratiquez le hacking AWS :HackTricks Formation Expert Red Team AWS (ARTE) Apprenez et pratiquez le hacking GCP : HackTricks Formation Expert Red Team GCP (GRTE)