Cognito User Pools
Informações Básicas
Um pool de usuários é um diretório de usuários no Amazon Cognito. Com um pool de usuários, seus usuários podem fazer login em seu aplicativo web ou móvel através do Amazon Cognito, ou se federar através de um provedor de identidade (IdP) de terceiros. Se seus usuários fizerem login diretamente ou através de um terceiro, todos os membros do pool de usuários têm um perfil de diretório que você pode acessar através de um SDK.
Os pools de usuários fornecem:
Serviços de registro e login.
Uma interface web personalizável e integrada para fazer login de usuários.
Login social com Facebook, Google, Login com Amazon e Login com Apple, e através de provedores de identidade SAML e OIDC do seu pool de usuários.
Gerenciamento de diretório de usuários e perfis de usuários.
Recursos de segurança, como autenticação multifatorial (MFA), verificações de credenciais comprometidas, proteção contra tomada de conta e verificação de telefone e e-mail.
Fluxos de trabalho personalizados e migração de usuários através de gatilhos AWS Lambda.
O código-fonte das aplicações geralmente também conterá o ID do pool de usuários e o ID da aplicação cliente, (e às vezes o segredo da aplicação?) que são necessários para um usuário fazer login em um Pool de Usuários Cognito.
Ataques potenciais
Registro: Por padrão, um usuário pode se registrar, então ele poderia criar um usuário para si mesmo.
Enumeração de usuários: A funcionalidade de registro pode ser usada para encontrar nomes de usuários que já existem. Essa informação pode ser útil para um ataque de força bruta.
Força bruta de login: Na seção Autenticação você tem todos os métodos que um usuário tem para fazer login, você poderia tentar forçar a entrada para encontrar credenciais válidas.
Ferramentas para pentesting
Pacu, agora inclui os módulos
cognito__enum
ecognito__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, funções 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.
Cognito Scanner é uma ferramenta CLI em python que implementa diferentes ataques ao Cognito, incluindo criação indesejada de contas e oracle de contas. Confira este link para mais informações.
CognitoAttributeEnum: Este script permite enumerar atributos válidos para usuários.
Registro
User Pools permite por padrão registrar novos usuários.
Se qualquer pessoa pode se registrar
Você pode encontrar um erro indicando que você precisa fornecer mais detalhes sobre o usuário:
Você pode fornecer os detalhes necessários com um JSON como:
Você também pode usar essa funcionalidade para enumerar usuários existentes. Esta é a mensagem de erro quando um usuário já existe com esse nome:
Note na comando anterior como os atributos personalizados começam com "custom:". Também saiba que ao registrar você não pode criar novos atributos personalizados para o usuário. Você só pode atribuir valor a atributos padrão (mesmo que não sejam obrigatórios) e atributos personalizados especificados.
Ou apenas para testar se um client id existe. Este é o erro se o client-id não existir:
Se apenas o administrador puder registrar usuários
Você encontrará esse erro e não poderá registrar ou enumerar usuários:
Verifying Registration
Cognito permite verificar um novo usuário verificando seu e-mail ou número de telefone. Portanto, ao criar um usuário, geralmente será necessário pelo menos o nome de usuário e a senha e o e-mail e/ou número de telefone. Basta definir um que você controla para que você receba o código para verificar sua nova conta de usuário assim:
Mesmo que pareça que você pode usar o mesmo e-mail e número de telefone, quando você precisar verificar o usuário criado, o Cognito reclamará sobre o uso das mesmas informações e não permitirá que você verifique a conta.
Escalação de Privilégios / Atualizando Atributos
Por padrão, um usuário pode modificar o valor de seus atributos com algo como:
Privesc de atributo personalizado
Você pode encontrar atributos personalizados sendo usados (como isAdmin
), pois por padrão você pode mudar os valores dos seus próprios atributos, você pode ser capaz de escalar privilégios mudando o valor você mesmo!
Privesc de modificação de email/nome de usuário
Você pode usar isso para modificar o email e o número de telefone de um usuário, mas então, mesmo que a conta permaneça verificada, esses atributos estão definidos como não verificados (você precisa verificá-los novamente).
Você não poderá fazer login com email ou número de telefone até que os verifique, mas você poderá fazer login com o nome de usuário.
Note que mesmo que o email tenha sido modificado e não verificado, ele aparecerá no Token de ID dentro do campo email
e o campo email_verified
será falso, mas se o app não estiver verificando isso, você pode se passar por outros usuários.
Além disso, note que você pode colocar qualquer coisa dentro do campo name
apenas modificando o atributo name. Se um app estiver verificando aquele campo por algum motivo em vez do email
(ou qualquer outro atributo), você pode ser capaz de se passar por outros usuários.
De qualquer forma, se por algum motivo você mudou seu email, por exemplo, para um novo que você pode acessar, você pode confirmar o email com o código que recebeu naquele endereço de email:
Use phone_number
em vez de email
para alterar/verificar um novo número de telefone.
O administrador também pode habilitar a opção de login com um nome de usuário preferido pelo usuário. Note que você não poderá alterar este valor para qualquer nome de usuário ou preferred_username já em uso para se passar por um usuário diferente.
Recuperar/Alterar Senha
É possível recuperar uma senha apenas sabendo o nome de usuário (ou email ou telefone é aceito) e tendo acesso a ele, pois um código será enviado lá:
A resposta do servidor sempre será positiva, como se o nome de usuário existisse. Você não pode usar este método para enumerar usuários.
Com o código, você pode alterar a senha com:
Para mudar a senha, você precisa saber a senha anterior:
Autenticação
Um pool de usuários suporta diferentes maneiras de autenticar. Se você tiver um nome de usuário e senha, também há diferentes métodos suportados para login. Além disso, quando um usuário é autenticado no Pool, 3 tipos de tokens são fornecidos: O Token de ID, o Token de Acesso e o Token de Atualização.
Token de ID: Ele contém declarações sobre a identidade do usuário autenticado, como
nome
,email
enúmero_de_telefone
. O token de ID também pode ser usado para autenticar usuários em seus servidores de recursos ou aplicativos de servidor. Você deve verificar a assinatura do token de ID antes de confiar em qualquer declaração dentro do token de ID se você usá-lo em aplicativos externos.O Token de ID é o token que contém os valores dos atributos do usuário, mesmo os personalizados.
Token de Acesso: Ele contém declarações sobre o usuário autenticado, uma lista dos grupos do usuário e uma lista de escopos. O propósito do token de acesso é autorizar operações de API no contexto do usuário no pool de usuários. Por exemplo, você pode usar o token de acesso para conceder ao seu usuário acesso para adicionar, alterar ou excluir atributos de usuário.
Token de Atualização: Com tokens de atualização, você pode obter novos Tokens de ID e Tokens de Acesso para o usuário até que o token de atualização seja inválido. Por padrão, o token de atualização expira 30 dias após o usuário do seu aplicativo fazer login no seu pool de usuários. Quando você cria um aplicativo para seu pool de usuários, pode definir a expiração do token de atualização do aplicativo para qualquer valor entre 60 minutos e 10 anos.
ADMIN_NO_SRP_AUTH & ADMIN_USER_PASSWORD_AUTH
Este é o fluxo de autenticação do lado do servidor:
O aplicativo do lado do servidor chama a operação da API
AdminInitiateAuth
(em vez deInitiateAuth
). Esta operação requer credenciais da AWS com permissões que incluemcognito-idp:AdminInitiateAuth
ecognito-idp:AdminRespondToAuthChallenge
. A operação retorna os parâmetros de autenticação necessários.Depois que o aplicativo do lado do servidor tem os parâmetros de autenticação, ele chama a operação da API
AdminRespondToAuthChallenge
. A operação da APIAdminRespondToAuthChallenge
só tem sucesso quando você fornece credenciais da AWS.
Este método NÃO está habilitado por padrão.
Para fazer login, você precisa saber:
id do pool de usuários
id do cliente
nome de usuário
senha
segredo do cliente (apenas se o aplicativo estiver configurado para usar um segredo)
Para poder fazer login com este método, esse aplicativo deve permitir login com ALLOW_ADMIN_USER_PASSWORD_AUTH
.
Além disso, para realizar esta ação, você precisa de credenciais com as permissões cognito-idp:AdminInitiateAuth
e cognito-idp:AdminRespondToAuthChallenge
Last updated