AWS - S3 Unauthenticated Enum
S3 Public Buckets
Um bucket é considerado “público” se qualquer usuário pode listar o conteúdo do bucket, e “privado” se o conteúdo do bucket pode ser listado ou escrito apenas por certos usuários.
As empresas podem ter permissões de buckets mal configuradas, dando acesso a tudo ou a todos autenticados na AWS em qualquer conta (ou seja, a qualquer pessoa). Note que, mesmo com tais configurações incorretas, algumas ações podem não ser possíveis, pois os buckets podem ter suas próprias listas de controle de acesso (ACLs).
Saiba mais sobre a configuração incorreta do AWS-S3 aqui: http://flaws.cloud e http://flaws2.cloud/
Encontrando Buckets AWS
Diferentes métodos para encontrar quando uma página está usando AWS para armazenar alguns recursos:
Enumeração & OSINT:
Usando o plugin de navegador wappalyzer
Usando burp (spidering a web) ou navegando manualmente pela página, todos os recursos carregados serão salvos no Histórico.
Verifique recursos em domínios como:
Verifique CNAMES como
resources.domain.com
pode ter o CNAMEbucket.s3.amazonaws.com
Verifique https://buckets.grayhatwarfare.com, um site com buckets abertos já descobertos.
O nome do bucket e o nome do domínio do bucket precisam ser os mesmos.
flaws.cloud está no IP 52.92.181.107 e se você for lá, será redirecionado para https://aws.amazon.com/s3/. Além disso,
dig -x 52.92.181.107
retornas3-website-us-west-2.amazonaws.com
.Para verificar se é um bucket, você também pode visitar https://flaws.cloud.s3.amazonaws.com/.
Força Bruta
Você pode encontrar buckets por força bruta de nomes relacionados à empresa que você está pentestando:
https://github.com/jordanpotti/AWSBucketDump (Contém uma lista com nomes de buckets potenciais)
Saquear Buckets S3
Dado buckets S3 abertos, BucketLoot pode automaticamente procurar por informações interessantes.
Encontrar a Região
Você pode encontrar todas as regiões suportadas pela AWS em https://docs.aws.amazon.com/general/latest/gr/s3.html
Por DNS
Você pode obter a região de um bucket com um dig
e nslookup
fazendo uma solicitação DNS do IP descoberto:
Verifique se o domínio resolvido contém a palavra "website".
Você pode acessar o site estático indo para: flaws.cloud.s3-website-us-west-2.amazonaws.com
ou você pode acessar o bucket visitando: flaws.cloud.s3-us-west-2.amazonaws.com
Tentando
Se você tentar acessar um bucket, mas no nome do domínio você especificar outra região (por exemplo, o bucket está em bucket.s3.amazonaws.com
mas você tenta acessar bucket.s3-website-us-west-2.amazonaws.com
, então você será indicado para a localização correta:
Enumerando o bucket
Para testar a abertura do bucket, um usuário pode simplesmente inserir a URL em seu navegador web. Um bucket privado responderá com "Access Denied". Um bucket público listará os primeiros 1.000 objetos que foram armazenados.
Aberto para todos:
Privado:
Você também pode verificar isso com o cli:
Se o bucket não tiver um nome de domínio, ao tentar enumerá-lo, coloque apenas o nome do bucket e não todo o domínio AWSs3. Exemplo: s3://<BUCKETNAME>
Modelo de URL pública
Get Account ID from public Bucket
É possível determinar uma conta AWS aproveitando a nova S3:ResourceAccount
Policy Condition Key. Esta condição restringe o acesso com base no bucket S3 em que uma conta está (outras políticas baseadas em conta restringem com base na conta em que o principal solicitante está).
E porque a política pode conter wildcards, é possível encontrar o número da conta apenas um número de cada vez.
Esta ferramenta automatiza o processo:
Esta técnica também funciona com URLs do API Gateway, URLs do Lambda, conjuntos de dados do Data Exchange e até para obter o valor de tags (se você souber a chave da tag). Você pode encontrar mais informações na pesquisa original e na ferramenta conditional-love para automatizar essa exploração.
Confirmando que um bucket pertence a uma conta AWS
Como explicado neste post do blog, se você tiver permissões para listar um bucket é possível confirmar um accountID ao qual o bucket pertence enviando uma solicitação como:
Se o erro for "Access Denied", isso significa que o ID da conta estava errado.
Usando Emails como enumeração de conta root
Como explicado neste post do blog, é possível verificar se um endereço de email está relacionado a alguma conta AWS tentando conceder permissões a um email sobre um bucket S3 via ACLs. Se isso não gerar um erro, significa que o email é um usuário root de alguma conta AWS:
Referências
Last updated