AWS - S3 Unauthenticated Enum
S3 Public Buckets
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 pueden tener permisos de buckets mal configurados dando acceso ya sea a todo o a todos los autenticados en AWS en cualquier cuenta (es decir, a cualquiera). Nota que, incluso con tales configuraciones erróneas, algunas acciones podrían no poder realizarse ya que los buckets pueden 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/
Finding AWS Buckets
Diferentes métodos para encontrar cuando una página web está usando AWS para almacenar algunos recursos:
Enumeration & OSINT:
Usando el plugin de navegador wappalyzer
Usando burp (spidering la web) o navegando manualmente por la página, todos los recursos cargados se guardarán en el Historial.
Revisar recursos en dominios como:
Revisar CNAMES ya que
resources.domain.com
podría tener el CNAMEbucket.s3.amazonaws.com
Revisar https://buckets.grayhatwarfare.com, una web con buckets abiertos ya descubiertos.
El nombre del bucket y el nombre del dominio del bucket deben ser los mismos.
flaws.cloud está en la 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
das3-website-us-west-2.amazonaws.com
.Para verificar que es un bucket también puedes visitar https://flaws.cloud.s3.amazonaws.com/.
Brute-Force
Puedes encontrar buckets mediante fuerza bruta de nombres relacionados con la empresa que estás pentesteando:
https://github.com/jordanpotti/AWSBucketDump (Contiene una lista con nombres potenciales de buckets)
Loot S3 Buckets
Dado que los buckets S3 están abiertos, BucketLoot puede buscar automáticamente información interesante.
Find the Region
Puedes encontrar todas las regiones soportadas por AWS en https://docs.aws.amazon.com/general/latest/gr/s3.html
By DNS
Puedes obtener la región de un bucket con un dig
y nslookup
haciendo una solicitud DNS de la IP descubierta:
Comprueba 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 serás indicado a la ubicación correcta:
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 se han almacenado.
Abierto para todos:
Privado:
También puedes verificar esto con el cli:
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://<BUCKETNAME>
Plantilla de URL pública
Obtener ID de cuenta desde un Bucket público
Es posible determinar una cuenta de AWS aprovechando la nueva S3:ResourceAccount
Policy Condition Key. 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 un número a la vez.
Esta herramienta automatiza el proceso:
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 y la herramienta conditional-love para automatizar esta explotación.
Confirmando que un bucket pertenece a una cuenta de AWS
Como se explica en esta publicación de blog, si tienes permisos para listar un bucket es posible confirmar un accountID al que pertenece el bucket enviando una solicitud como:
Si el error es "Access Denied" significa que el ID de la cuenta es incorrecto.
Usar correos electrónicos como enumeración de cuenta raíz
Como se explica en esta publicación de blog, es posible verificar si una dirección de correo electrónico está relacionada con alguna cuenta de AWS intentando 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:
Referencias
Last updated