AWS - Cognito Privesc
Cognito
Para mais informações sobre o Cognito, consulte:
AWS - Cognito EnumColetando 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
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.
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
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.
É também possível abusar dessa permissão para permitir autenticação básica:
Impacto Potencial: Comprometer o IAM role autenticado configurado dentro do pool de identidade.
cognito-idp:AdminAddUserToGroup
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:
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
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:
Impacto Potencial: Privesc para outros papéis IAM do Cognito.
cognito-idp:AdminConfirmSignUp
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.
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
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.
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
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.
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
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
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).
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
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.
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.
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.
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
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.
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
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!.
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
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.
(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
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.
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:
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:
Cognito Scanner é uma ferramenta CLI em python que implementa diferentes ataques ao Cognito, incluindo uma escalada de privilégios.
Instalação
Uso
Para mais informações, consulte https://github.com/padok-team/cognito-scanner
Last updated