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)
Para más información sobre Cognito, consulta:
AWS - Cognito EnumComo 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.
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: 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.
También es posible abusar de este permiso para permitir la autenticación básica:
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:
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:
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.
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.
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.
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, permitiéndole suplantar a cualquier usuario (que no tenga MFA habilitado).
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.
SetUserMFAPreference: Similar al anterior, este permiso se puede utilizar para establecer las preferencias de MFA de un usuario para eludir la protección de MFA.
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.
UpdateUserPool: También es posible actualizar el grupo de usuarios para cambiar la política de MFA. Consulta cli aquí.
Potential Impact: 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.
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 de actualización) puedes ver todas las opciones, ¡revísalo!.
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.
(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 identidades para luego poder iniciar sesión a través de este proveedor.
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.
Este es un permiso muy común por defecto en los roles de Cognito Identity Pools. Incluso si un comodín en un permiso 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 Identity Pools e Identity IDs dentro de Identity Pools (lo cual no es información sensible). Los Identity IDs pueden tener Datasets asignados a ellos, que son información de las sesiones (AWS lo define como un juego guardado). Puede 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 datasets 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.
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.
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:
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:
Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo una escalación de privilegios.
Para más información, consulta https://github.com/padok-team/cognito-scanner
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)