# AWS - S3 Enumeración No Autenticada {{#include ../../../banners/hacktricks-training.md}} ## Cubos Públicos de S3 Un cubo se considera **“público”** si **cualquier usuario puede listar los contenidos** del cubo, y **“privado”** si los contenidos del cubo **solo pueden ser listados o escritos por ciertos usuarios**. Las empresas pueden tener **permisos de cubos mal configurados** que dan acceso ya sea a todo o a todos los autenticados en AWS en cualquier cuenta (es decir, a cualquiera). Ten en cuenta que incluso con tales configuraciones erróneas, algunas acciones pueden no poder realizarse, ya que los cubos pueden tener sus propias listas de control de acceso (ACL). **Aprende sobre la mala configuración de AWS-S3 aquí:** [**http://flaws.cloud**](http://flaws.cloud/) **y** [**http://flaws2.cloud/**](http://flaws2.cloud) ### Encontrar Cubos de AWS Diferentes métodos para encontrar cuando una página web está usando AWS para almacenar algunos recursos: #### Enumeración y OSINT: - Usando el plugin de navegador **wappalyzer** - Usando burp (**spidering** la web) o navegando manualmente a través de la página, todos los **recursos** **cargados** se guardarán en el Historial. - **Verifica los recursos** en dominios como: ``` http://s3.amazonaws.com/[bucket_name]/ http://[bucket_name].s3.amazonaws.com/ ``` - Verifica los **CNAMES** ya que `resources.domain.com` podría tener el CNAME `bucket.s3.amazonaws.com` - **[s3dns](https://github.com/olizimmermann/s3dns)** – Un servidor DNS ligero que identifica pasivamente cubos de almacenamiento en la nube (S3, GCP, Azure) analizando el tráfico DNS. Detecta CNAMEs, sigue cadenas de resolución y coincide con patrones de cubos, ofreciendo una alternativa silenciosa a la búsqueda por fuerza bruta o basada en API. Perfecto para flujos de trabajo de reconocimiento y OSINT. - Verifica [https://buckets.grayhatwarfare.com](https://buckets.grayhatwarfare.com/), una web con **cubos abiertos ya descubiertos**. - El **nombre del cubo** y el **nombre de dominio del cubo** deben ser **los mismos.** - **flaws.cloud** está en **IP** 52.92.181.107 y si vas allí te redirige a [https://aws.amazon.com/s3/](https://aws.amazon.com/s3/). Además, `dig -x 52.92.181.107` da `s3-website-us-west-2.amazonaws.com`. - Para verificar que es un cubo también puedes **visitar** [https://flaws.cloud.s3.amazonaws.com/](https://flaws.cloud.s3.amazonaws.com/). #### Fuerza Bruta Puedes encontrar cubos **forzando nombres** relacionados con la empresa que estás pentesting: - [https://github.com/sa7mon/S3Scanner](https://github.com/sa7mon/S3Scanner) - [https://github.com/clario-tech/s3-inspector](https://github.com/clario-tech/s3-inspector) - [https://github.com/jordanpotti/AWSBucketDump](https://github.com/jordanpotti/AWSBucketDump) (Contiene una lista con nombres de cubos potenciales) - [https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets](https://github.com/fellchase/flumberboozle/tree/master/flumberbuckets) - [https://github.com/smaranchand/bucky](https://github.com/smaranchand/bucky) - [https://github.com/tomdev/teh_s3_bucketeers](https://github.com/tomdev/teh_s3_bucketeers) - [https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3](https://github.com/RhinoSecurityLabs/Security-Research/tree/master/tools/aws-pentest-tools/s3) - [https://github.com/Eilonh/s3crets_scanner](https://github.com/Eilonh/s3crets_scanner) - [https://github.com/belane/CloudHunter](https://github.com/belane/CloudHunter)
# 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, filtramos esa lista
### Eliminar líneas que terminan 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
#### Saquear Cubos S3 Dado cubos S3 abiertos, [**BucketLoot**](https://github.com/redhuntlabs/BucketLoot) puede **buscar automáticamente información interesante**. ### Encontrar la Región Puedes encontrar todas las regiones soportadas por AWS en [**https://docs.aws.amazon.com/general/latest/gr/s3.html**](https://docs.aws.amazon.com/general/latest/gr/s3.html) #### Por DNS Puedes obtener la región de un cubo con un **`dig`** y **`nslookup`** haciendo una **solicitud DNS de la IP descubierta**: ```bash 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. ``` Verifica que el dominio resuelto tenga la palabra "website".\ Puedes acceder al sitio web estático yendo a: `flaws.cloud.s3-website-us-west-2.amazonaws.com`\ o puedes acceder al bucket visitando: `flaws.cloud.s3-us-west-2.amazonaws.com` #### Intentando Si intentas acceder a un bucket, pero en el **nombre de dominio especificas otra región** (por ejemplo, el bucket está en `bucket.s3.amazonaws.com` pero intentas acceder a `bucket.s3-website-us-west-2.amazonaws.com`, entonces se te **indicarán a la ubicación correcta**: ![](<../../../images/image (106).png>) ### Enumerando el bucket Para probar la apertura del bucket, un usuario puede simplemente ingresar la URL en su navegador web. Un bucket privado responderá con "Access Denied". Un bucket público listará los primeros 1,000 objetos que han sido almacenados. Abierto para todos: ![](<../../../images/image (201).png>) Privado: ![](<../../../images/image (83).png>) También puedes verificar esto con el cli: ```bash #Use --no-sign-request for check Everyones permissions #Use --profile 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 ] [ --recursive] [--region us-west-2] ``` Si el bucket no tiene un nombre de dominio, al intentar enumerarlo, **solo pon el nombre del bucket** y no todo el dominio de AWSs3. Ejemplo: `s3://` ### Plantilla de URL pública ``` https://{user_provided}.s3.amazonaws.com ``` ### Obtener ID de cuenta de un Bucket público Es posible determinar una cuenta de AWS aprovechando la nueva **`S3:ResourceAccount`** **Clave de Condición de Política**. Esta condición **restringe el acceso basado en el bucket 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: ```bash # 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 URLs de API Gateway, URLs de Lambda, 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**](https://blog.plerion.com/conditional-love-for-aws-metadata-enumeration/) y la herramienta [**conditional-love**](https://github.com/plerionhq/conditional-love/) para automatizar esta explotación. ### Confirmando que un bucket pertenece a una cuenta de AWS Como se explica en [**esta publicación del blog**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/)**, si tienes permisos para listar un bucket** es posible confirmar un accountID al que pertenece el bucket enviando una solicitud como: ```bash curl -X GET "[bucketname].amazonaws.com/" \ -H "x-amz-expected-bucket-owner: [correct-account-id]" ... ``` Si el error es "Acceso Denegado", significa que el ID de cuenta era incorrecto. ### Uso de correos electrónicos como enumeración de cuentas raíz Como se explica en [**esta publicación del blog**](https://blog.plerion.com/things-you-wish-you-didnt-need-to-know-about-s3/), es posible verificar si una dirección de correo electrónico está relacionada con alguna cuenta de AWS al **intentar otorgar permisos a un correo electrónico** sobre un bucket S3 a través de ACLs. Si esto no genera un error, significa que el correo electrónico es un usuario raíz de alguna cuenta de AWS: ```python s3_client.put_bucket_acl( Bucket=bucket_name, AccessControlPolicy={ 'Grants': [ { 'Grantee': { 'EmailAddress': 'some@emailtotest.com', 'Type': 'AmazonCustomerByEmail', }, 'Permission': 'READ' }, ], 'Owner': { 'DisplayName': 'Whatever', 'ID': 'c3d78ab5093a9ab8a5184de715d409c2ab5a0e2da66f08c2f6cc5c0bdeadbeef' } } ) ``` ## Referencias - [https://www.youtube.com/watch?v=8ZXRw4Ry3mQ](https://www.youtube.com/watch?v=8ZXRw4Ry3mQ) - [https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/](https://cloudar.be/awsblog/finding-the-account-id-of-any-public-s3-bucket/) {{#include ../../../banners/hacktricks-training.md}}