Cognito User Pools
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Learn & practice GCP Hacking:
HackTricks Training GCP Red Team Expert (GRTE)
Información Básica
Un grupo de usuarios es un directorio de usuarios en Amazon Cognito. Con un grupo de usuarios, tus usuarios pueden iniciar sesión en tu aplicación web o móvil a través de Amazon Cognito, o federarse a través de un proveedor de identidad (IdP) de terceros. Ya sea que tus usuarios inicien sesión directamente o a través de un tercero, todos los miembros del grupo de usuarios tienen un perfil de directorio al que puedes acceder a través de un SDK.
Los grupos de usuarios proporcionan:
Servicios de registro e inicio de sesión.
Una interfaz web personalizable y incorporada para iniciar sesión a los usuarios.
Inicio de sesión social con Facebook, Google, Login con Amazon y Sign in with Apple, y a través de proveedores de identidad SAML y OIDC de tu grupo de usuarios.
Gestión del directorio de usuarios y perfiles de usuario.
Características de seguridad como autenticación multifactor (MFA), verificaciones de credenciales comprometidas, protección contra toma de cuentas y verificación de teléfono y correo electrónico.
Flujos de trabajo personalizados y migración de usuarios a través de desencadenadores de AWS Lambda.
El código fuente de las aplicaciones generalmente también contendrá el ID del grupo de usuarios y el ID de la aplicación cliente, (y a veces el secreto de la aplicación?) que son necesarios para que un usuario inicie sesión en un Grupo de Usuarios de Cognito.
Ataques Potenciales
Registro: Por defecto, un usuario puede registrarse a sí mismo, por lo que podría crear un usuario para sí mismo.
Enumeración de usuarios: La funcionalidad de registro puede ser utilizada para encontrar nombres de usuario que ya existen. Esta información puede ser útil para el ataque de fuerza bruta.
Fuerza bruta de inicio de sesión: En la sección de Autenticación tienes todos los métodos que un usuario tiene para iniciar sesión, podrías intentar forzarlos para encontrar credenciales válidas.
Herramientas para pentesting
Pacu, ahora incluye los módulos
cognito__enum
ycognito__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 grupos de identidad 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.
Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y el oracle de cuentas. Consulta este enlace para más información.
CognitoAttributeEnum: Este script permite enumerar atributos válidos para usuarios.
Registro
User Pools permite por defecto registrar nuevos usuarios.
Si alguien puede registrarse
Es posible que encuentres un error que indique que necesitas proporcionar más detalles sobre el usuario:
Puedes proporcionar los detalles necesarios con un JSON como:
Podrías usar esta funcionalidad también para enumerar usuarios existentes. Este es el mensaje de error cuando un usuario ya existe con ese nombre:
Nota en el comando anterior cómo los atributos personalizados comienzan con "custom:". También sepa que al registrarse no puede crear nuevos atributos personalizados para el usuario. Solo puede dar valor a atributos predeterminados (incluso si no son obligatorios) y atributos personalizados especificados.
O simplemente para probar si existe un id de cliente. Este es el error si el client-id no existe:
Si solo el administrador puede registrar usuarios
Encontrarás este error y no podrás registrar o enumerar usuarios:
Verifying Registration
Cognito permite verificar un nuevo usuario verificando su correo electrónico o número de teléfono. Por lo tanto, al crear un usuario, generalmente se requerirá al menos el nombre de usuario y la contraseña, y el correo electrónico y/o número de teléfono. Simplemente establece uno que controlas para que recibas el código para verificar tu cuenta de usuario recientemente creada así:
Incluso si parece que puedes usar el mismo correo electrónico y número de teléfono, cuando necesites verificar el usuario creado, Cognito se quejará de usar la misma información y no te permitirá verificar la cuenta.
Escalación de Privilegios / Actualización de Atributos
Por defecto, un usuario puede modificar el valor de sus atributos con algo como:
Privilegios de escalación de atributos personalizados
Es posible que encuentres atributos personalizados siendo utilizados (como isAdmin
), ya que por defecto puedes cambiar los valores de tus propios atributos, ¡podrías ser capaz de escalar privilegios cambiando el valor tú mismo!
Modificación de correo electrónico/nombre de usuario para escalación de privilegios
Puedes usar esto para modificar el correo electrónico y el número de teléfono de un usuario, pero luego, incluso si la cuenta permanece como verificada, esos atributos están establecidos en estado no verificado (necesitas verificarlos nuevamente).
No podrás iniciar sesión con el correo electrónico o el número de teléfono hasta que los verifiques, pero podrás iniciar sesión con el nombre de usuario.
Ten en cuenta que incluso si el correo electrónico fue modificado y no verificado, aparecerá en el ID Token dentro del campo email
y el campo email_verified
será falso, pero si la aplicación no está verificando eso, podrías suplantar a otros usuarios.
Además, ten en cuenta que puedes poner cualquier cosa dentro del campo name
simplemente modificando el atributo name. Si una aplicación está verificando ese campo por alguna razón en lugar del email
(o cualquier otro atributo), podrías ser capaz de suplantar a otros usuarios.
De todos modos, si por alguna razón cambiaste tu correo electrónico, por ejemplo, a uno nuevo al que puedes acceder, puedes confirmar el correo electrónico con el código que recibiste en esa dirección de correo electrónico:
Usa phone_number
en lugar de email
para cambiar/verificar un nuevo número de teléfono.
El administrador también podría habilitar la opción de iniciar sesión con un nombre de usuario preferido por el usuario. Ten en cuenta que no podrás cambiar este valor a cualquier nombre de usuario o preferred_username que ya esté en uso para suplantar a un usuario diferente.
Recuperar/Cambiar Contraseña
Es posible recuperar una contraseña solo conociendo el nombre de usuario (o se acepta email o teléfono) y teniendo acceso a él, ya que se enviará un código allí:
La respuesta del servidor siempre será positiva, como si el nombre de usuario existiera. No puedes usar este método para enumerar usuarios.
Con el código puedes cambiar la contraseña con:
Para cambiar la contraseña necesitas conocer la contraseña anterior:
Autenticación
Un grupo de usuarios admite diferentes formas de autenticarse. Si tienes un nombre de usuario y contraseña, también hay diferentes métodos admitidos para iniciar sesión. Además, cuando un usuario está autenticado en el grupo, se otorgan 3 tipos de tokens: El Token de ID, el Token de Acceso y el Token de Actualización.
Token de ID: Contiene afirmaciones sobre la identidad del usuario autenticado, como
nombre
,correo electrónico
ynúmero_de_teléfono
. El token de ID también se puede usar para autenticar usuarios en tus servidores de recursos o aplicaciones de servidor. Debes verificar la firma del token de ID antes de poder confiar en cualquier afirmación dentro del token de ID si lo usas en aplicaciones externas.El Token de ID es el token que contiene los valores de los atributos del usuario, incluso los personalizados.
Token de Acceso: Contiene afirmaciones sobre el usuario autenticado, una lista de los grupos del usuario y una lista de ámbitos. El propósito del token de acceso es autorizar operaciones de API en el contexto del usuario en el grupo de usuarios. Por ejemplo, puedes usar el token de acceso para otorgar a tu usuario acceso para agregar, cambiar o eliminar atributos de usuario.
Token de Actualización: Con los tokens de actualización puedes obtener nuevos Tokens de ID y Tokens de Acceso para el usuario hasta que el token de actualización sea inválido. Por defecto, el token de actualización expira 30 días después de que el usuario de tu aplicación inicie sesión en tu grupo de usuarios. Cuando creas una aplicación para tu grupo de usuarios, puedes establecer la expiración del token de actualización de la aplicación a cualquier valor entre 60 minutos y 10 años.
ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
Este es el flujo de autenticación del lado del servidor:
La aplicación del lado del servidor llama a la operación de API
AdminInitiateAuth
(en lugar deInitiateAuth
). Esta operación requiere credenciales de AWS con permisos que incluyancognito-idp:AdminInitiateAuth
ycognito-idp:AdminRespondToAuthChallenge
. La operación devuelve los parámetros de autenticación requeridos.Después de que la aplicación del lado del servidor tiene los parámetros de autenticación, llama a la operación de API
AdminRespondToAuthChallenge
. La operación de APIAdminRespondToAuthChallenge
solo tiene éxito cuando proporcionas credenciales de AWS.
Este método NO está habilitado por defecto.
Para iniciar sesión necesitas saber:
id del grupo de usuarios
id del cliente
nombre de usuario
contraseña
secreto del cliente (solo si la aplicación está configurada para usar un secreto)
Para poder iniciar sesión con este método, esa aplicación debe permitir iniciar sesión con ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Además, para realizar esta acción necesitas credenciales con los permisos**cognito-idp:AdminInitiateAuth
**y cognito-idp:AdminRespondToAuthChallenge
Last updated