AWS - S3 Unauthenticated Enum

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

Outras maneiras de apoiar o HackTricks:

Buckets Públicos do S3

Um bucket é considerado “público” se qualquer usuário puder listar o conteúdo do bucket, e “privado” se o conteúdo do bucket só puder ser listado ou escrito por determinados usuários.

Empresas podem ter permissões de buckets mal configuradas dando acesso a tudo ou a todos autenticados na AWS em qualquer conta (portanto, para qualquer pessoa). Note que mesmo com tais configurações incorretas, algumas ações podem não ser realizadas, pois os buckets podem ter suas próprias listas de controle de acesso (ACLs).

Saiba mais sobre a má configuração do AWS-S3 aqui: http://flaws.cloud e http://flaws2.cloud/

Encontrando Buckets da AWS

Métodos diferentes para encontrar quando uma página da web está usando a AWS para armazenar alguns recursos:

Enumeração & OSINT:

  • Usando o plugin do navegador wappalyzer

  • Usando o burp (spidering a web) ou navegando manualmente pela página, todos os recursos carregados serão salvos no Histórico.

  • Verifique os recursos em domínios como:

http://s3.amazonaws.com/[nome_do_bucket]/
http://[nome_do_bucket].s3.amazonaws.com/
  • Verifique os CNAMES pois resources.domain.com pode ter o CNAME bucket.s3.amazonaws.com

  • Verifique https://buckets.grayhatwarfare.com, um site com buckets abertos já descobertos.

  • O nome do bucket e o nome de domínio do bucket precisam ser os mesmos.

  • flaws.cloud está no IP 52.92.181.107 e se você acessar lá, será redirecionado para https://aws.amazon.com/s3/. Além disso, dig -x 52.92.181.107 retorna s3-website-us-west-2.amazonaws.com.

  • Para verificar se é um bucket, você também pode visitar https://flaws.cloud.s3.amazonaws.com/.

Brute-Force

Você pode encontrar buckets forçando o nome relacionado à empresa que você está testando:

# Gerar uma lista de palavras para criar permutações
curl -s https://raw.githubusercontent.com/cujanovic/goaltdns/master/words.txt > /tmp/words-s3.txt.temp
curl -s https://raw.githubusercontent.com/jordanpotti/AWSBucketDump/master/BucketNames.txt >>/tmp/words-s3.txt.temp
cat /tmp/words-s3.txt.temp | sort -u > /tmp/words-s3.txt

# Gerar uma lista de palavras com base nos domínios e subdomínios para testar
## Escreva esses domínios e subdomínios em subdomains.txt
cat subdomains.txt > /tmp-words-hosts-s3.txt
cat subdomains.txt | tr "." "-" >> /tmp-words-hosts-s3.txt
cat subdomains.txt | tr "." "\n" | sort -u >> /tmp-words-hosts-s3.txt

# Criar permutações com base em uma lista com os domínios e subdomínios a serem atacados
goaltdns -l /tmp-words-hosts-s3.txt -w /tmp-words-s3.txt -o /tmp-final-words-s3.txt.temp
## A ferramenta anterior é especializada em criar permutações para subdomínios, vamos filtrar essa lista
### Remover linhas terminando com "."
cat /tmp-final-words-s3.txt.temp | grep -Ev "\.$" > /tmp-final-words-s3.txt.temp2
### Criar lista sem TLD
cat /tmp-final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp-final-words-s3.txt.temp3
### Criar lista sem pontos
cat /tmp-final-words-s3.txt.temp3 | tr -d "." > /tmp-final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Criar lista sem hífens
cat /tmp-final-words-s3.txt.temp3 | tr "." "-" > /tmp-final-words-s3.txt.temp5

## Gerar a lista de palavras final
cat /tmp-final-words-s3.txt.temp2 /tmp-final-words-s3.txt.temp3 /tmp-final-words-s3.txt.temp4 /tmp-final-words-s3.txt.temp5 | grep -v -- "-\." | awk '{print tolower($0)}' | sort -u > /tmp-final-words-s3.txt
## Chamar s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Saquear Buckets S3

Dado os buckets S3 abertos, o 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:

dig flaws.cloud
;; ANSWER SECTION:
flaws.cloud.    5    IN    A    52.218.192.11

nslookup 52.218.192.11
Non-authoritative answer:
11.192.218.52.in-addr.arpa name = s3-website-us-west-2.amazonaws.com.

Verifique se o domínio resolvido tem 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 de 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 o local correto:

Enumerando o bucket

Para testar a abertura do bucket, um usuário pode simplesmente inserir a URL em seu navegador da web. Um bucket privado responderá com "Acesso negado". Um bucket público listará os primeiros 1.000 objetos armazenados.

Aberto para todos:

Privado:

Você também pode verificar isso com o cli:

#Use --no-sign-request for check Everyones permissions
#Use --profile <PROFILE_NAME> to indicate the AWS profile(keys) that youwant to use: Check for "Any Authenticated AWS User" permissions
#--recursive if you want list recursivelyls
#Opcionally you can select the region if you now it
aws s3 ls s3://flaws.cloud/ [--no-sign-request] [--profile <PROFILE_NAME>] [ --recursive] [--region us-west-2]

Se o bucket não tiver um nome de domínio, ao tentar enumerá-lo, apenas coloque o nome do bucket e não o domínio inteiro do AWSs3. Exemplo: s3://<NOMEDOBUCKET>

Modelo de URL pública

https://{user_provided}.s3.amazonaws.com

Obter ID da Conta a partir de um Bucket público

É possível determinar uma conta da AWS aproveitando a nova S3:ResourceAccount Chave de Condição de Política. Esta condição restringe o acesso com base no bucket S3 em que uma conta está (outras políticas baseadas em contas restringem com base na conta em que o principal solicitante está). E como a política pode conter curingas, é possível encontrar o número da conta apenas um número de cada vez.

Esta ferramenta automatiza o processo:

# Installation
pipx install s3-account-search
pip install s3-account-search
# With a bucket
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket
# With an object
s3-account-search arn:aws:iam::123456789012:role/s3_read s3://my-bucket/path/to/object.ext

Esta técnica também funciona com URLs de API Gateway, URLs de Lambda, conjuntos de dados do Data Exchange e até para obter o valor de tags (se você conhecer a chave da tag). Você pode encontrar mais informações na pesquisa original e na ferramenta conditional-love para automatizar essa exploração.

Referências

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

Outras formas de apoiar o HackTricks:

Última actualización