Por Rodrigo Montoro

Quando pensamos em uma cadeia de ataques, o reconhecimento é uma das principais fases, pois é a partir das informações previamente descobertas que é possível se munir com informações para realizar as próximas fases e investidas do ataque.

No ecossistema da Amazon Web Services (AWS) não há muitos recursos disponíveis para mapear usuários IAM (Identity and Access Management) e a conta Root. Alguns métodos mais conhecidos para enumeração sem autenticação numa conta alvo são implementados no PACU Framework [1], dentre esses os principais são a enumeração de papeis (roles) e possíveis usuários do IAM, uma de suas funcionalidades.

Um método já conhecido para validar se um e-mail possui ou não conta na AWS, o que em prática é o usuário Root da conta, é via site Web tentar criar um usuário novo com o email em si e caso o mesmo já tenha conta, basicamente será alertado. A grande dificuldade de explorar esse vetor é que esse processo de automação é mais complexo pelo fato de termos que subverter o mecanismo de CAPTCHA (Completely Automated Public Turing Test to Tell Computers and Humans Apart), bem como os demais controles do website AWS.

Dentro de alguns trabalhos de pesquisa e consultivos que estão sendo realizados dentro da Tempest com o AWS Organizations, observamos um comportamento interessante quando alguém tenta criar uma nova conta via Organizations, se a mesma já possuía uma conta, é gerado um erro com o seguinte resultadoEMAIL_ALREADY_EXISTS. Com base nisso fomos pesquisar se esse comportamento poderia ser automatizado e usado para enumerar contas e seus respectivos e-mails e, para nossa surpresa, descobrimos que sim.

Primeiro ponto foi analisar os erros que o AWS Organizations create account poderia retornar (Figura 1) e elencar essa lista para entender o comportamento de cada erro e como podemos abusar disso. Para os fins deste post apenas usaremos somente o erro do EMAIL_ALREADY_EXISTS citado acima.

Figura 1: Lista dos possíveis erros para criação do AWS Organizations

Após analisarmos a lista de possíveis erros, simulamos o comando de criação de conta:

Figura 2: Usando o AWS CLI para simular a criação de uma nova Organização

Como resultado do comando (Figura 2) é possível observar que um Status ID da criação foi retornado. Como ainda não sabemos o resultado desse comando, podemos verificar se a conta foi criada ou algum erro aconteceu conforme ilustra a Figura 3:

Figura 3: Resultado do Comando de criação de conta a partir de um Status ID

Conforme pode ser visto no resultado da Figura 3, essa conta já possui conta na AWS, daí o resultado “EMAIL_ALREADY_EXISTS” como retorno. Com o objetivo de dirimir que existiria algum mecanismo para mitigar esse processo de enumeração, através de retornos ou erros similares, a mesma sequência de comandos acima foi executada para uma conta que não exista ainda e com isso foi possível observar que a conta foi criada com sucesso.

Figura 4: Resultado do Comando de criação de conta para um Organization Inexistente

Para facilitar o processo e deixar a possibilidade de fazer isso para várias contas, criamos um simples bash script para automatizar o processo de enumeração. No entanto, é recomendado que não se tente executar o mesmo frente à uma grande lista, devido ao fato de possível bloqueio e deste processo não ser totalmente “silencioso”.

Figura 5: Bash Script para automatizar o processo de checagem e enumeração de contas root

A Figura 6 está exibindo uma rodada do script bash contra uma lista de possíveis alvos de enumeração e a sua respectiva saída.

Figura 6: Resultado da execução do Bash Script de enumeração contra uma determinada lista alvo

Esse processo apresentado consiste numa técnica de enumeração ativa e com isso, um e-mail será enviado para a validação e posse, caso o e-mail em questão ainda não possua uma conta AWS Organizations já associada. Dito isto, é importante que se tenha uma lista mais assertiva visando diminuir o possível “barulho” e, em especial, em casos que trabalhos mais furtivos precisem ser realizados. Outro ponto é que o Organizations possui limite de contas, então será necessário remover as contas criadas no processo de enumeração abrindo espaço para expandir o limite da busca. Importante lembrar que contas criadas via Organizations não têm senha, daí o usuário ter que resetar, logar e deletar tais senhas.

Por fim, essa técnica não gerará eventos em suas contas da AWS, ou seja, um bom meio de obter a possível tentativa de uso do e-mail da conta Root é monitorar o evento de ConsoleLogin com Failure na resposta no CloudTrail, pois provavelmente um brute force será o próximo passo após essa confirmação. Como citado, conscientização e recebimento de email fora do padrão, como criação de conta AWS, pode ser um meio de detecção também, mas fora do control plane.

Happy Hacking!

Referência

[1] – RhinoSecurityLabs. PACU, 2021. Disponível em: https://github.com/RhinoSecurityLabs/pacu/. Acessado em: 15 de agosto de 2021