AWS - S3 Unauthenticated Enum

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Buckets Públicos de S3

Un bucket se considera "público" si cualquier usuario puede listar el contenido del bucket, y "privado" si el contenido del bucket solo puede ser listado o escrito por ciertos usuarios.

Las empresas podrían tener permisos de buckets mal configurados dando acceso a todo o a todos los usuarios autenticados en AWS en cualquier cuenta (por lo tanto, a cualquiera). Ten en cuenta que incluso con tales configuraciones incorrectas, algunas acciones podrían no poder realizarse, ya que los buckets podrían tener sus propias listas de control de acceso (ACLs).

Aprende sobre la mala configuración de AWS-S3 aquí: http://flaws.cloud y http://flaws2.cloud/

Encontrar Buckets de AWS

Métodos diferentes para encontrar cuando una página web está utilizando AWS para almacenar algunos recursos:

Enumeración & OSINT:

  • Usando el complemento del navegador wappalyzer

  • Usando burp (rastreando la web) o navegando manualmente a través de la página, todos los recursos cargados se guardarán en el Historial.

  • Verificar recursos en dominios como:

http://s3.amazonaws.com/[nombre_del_bucket]/
http://[nombre_del_bucket].s3.amazonaws.com/
  • Verificar CNAMES ya que resources.domain.com podría tener el CNAME bucket.s3.amazonaws.com

  • Verifica https://buckets.grayhatwarfare.com, una web con buckets abiertos ya descubiertos.

  • El nombre del bucket y el nombre de dominio del bucket deben ser iguales.

  • flaws.cloud está en IP 52.92.181.107 y si vas allí te redirige a https://aws.amazon.com/s3/. Además, dig -x 52.92.181.107 da s3-website-us-west-2.amazonaws.com.

  • Para verificar si es un bucket también puedes visitar https://flaws.cloud.s3.amazonaws.com/.

Fuerza Bruta

Puedes encontrar buckets haciendo fuerza bruta en los nombres relacionados con la empresa que estás probando:

# Generar una lista de palabras para crear permutaciones
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

# Generar una lista de palabras basada en los dominios y subdominios a probar
## Escribe esos dominios y subdominios en 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

# Crear permutaciones basadas en una lista con los dominios y subdominios a atacar
goaltdns -l /tmp-words-hosts-s3.txt -w /tmp-words-s3.txt -o /tmp-final-words-s3.txt.temp
## La herramienta anterior está especializada en crear permutaciones para subdominios, vamos a filtrar esa lista
### Eliminar líneas que terminen con "."
cat /tmp-final-words-s3.txt.temp | grep -Ev "\.$" > /tmp-final-words-s3.txt.temp2
### Crear lista sin TLD
cat /tmp-final-words-s3.txt.temp2 | sed -E 's/\.[a-zA-Z0-9]+$//' > /tmp-final-words-s3.txt.temp3
### Crear lista sin puntos
cat /tmp-final-words-s3.txt.temp3 | tr -d "." > /tmp-final-words-s3.txt.temp4http://phantom.s3.amazonaws.com/
### Crear lista sin guiones
cat /tmp-final-words-s3.txt.temp3 | tr "." "-" > /tmp-final-words-s3.txt.temp5

## Generar la lista de palabras 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
## Llamar a s3scanner
s3scanner --threads 100 scan --buckets-file /tmp/final-words-s3.txt  | grep bucket_exists

Saqueo de Buckets S3

Dado que los buckets S3 están abiertos, BucketLoot puede buscar automáticamente información interesante.

Encontrar la Región

Puedes encontrar todas las regiones admitidas por AWS en https://docs.aws.amazon.com/general/latest/gr/s3.html

Por DNS

Puedes obtener la región de un bucket con un dig y nslookup haciendo una solicitud DNS de la IP descubierta:

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 que el dominio resuelto tenga la palabra "website". Puede acceder al sitio web estático yendo a: flaws.cloud.s3-website-us-west-2.amazonaws.com o puede acceder al bucket visitando: flaws.cloud.s3-us-west-2.amazonaws.com

Al intentar

Si intenta acceder a un bucket, pero en el nombre de dominio especifica otra región (por ejemplo, el bucket está en bucket.s3.amazonaws.com pero intenta acceder a bucket.s3-website-us-west-2.amazonaws.com), entonces se le indicará la ubicación correcta:

Enumeración del bucket

Para probar la apertura del bucket, un usuario simplemente puede ingresar la URL en su navegador web. Un bucket privado responderá con "Acceso denegado". Un bucket público mostrará los primeros 1,000 objetos que se han almacenado.

Abierto para todos:

Privado:

También puede verificar esto con la 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]

Si el bucket no tiene un nombre de dominio, al intentar enumerarlo, solo coloque el nombre del bucket y no todo el dominio de AWSs3. Ejemplo: s3://<NOMBRE DEL BUCKET>

Plantilla de URL pública

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

Obtener ID de cuenta desde Bucket público

Es posible determinar una cuenta de AWS aprovechando la nueva clave de condición de política S3:ResourceAccount. Esta condición restringe el acceso basado en el bucket de S3 en el que se encuentra una cuenta (otras políticas basadas en cuentas restringen según la cuenta en la que se encuentra el principal solicitante). Y debido a que la política puede contener comodines, es posible encontrar el número de cuenta solo un número a la vez.

Esta herramienta automatiza el proceso:

# 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 también funciona con las URL de API Gateway, las URL de Lambda, los conjuntos de datos de Data Exchange e incluso para obtener el valor de etiquetas (si conoces la clave de la etiqueta). Puedes encontrar más información en la investigación original y la herramienta conditional-love para automatizar esta explotación.

Referencias

Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!

Otras formas de apoyar a HackTricks:

Última actualización