
Una herramienta de enumeración de ID de cuenta S3 y descubrimiento de cubos
Una herramienta de enumeración de ID de cuenta S3 y descubrimiento de buckets
Dado un único bucket S3 accesible, bucky extrae el ID de cuenta AWS de 12 dígitos que lo posee, luego descubre buckets adicionales pertenecientes a la misma cuenta probando nombres de buckets contra una lista de palabras — todo en un solo comando.
s3:ResourceAccount para forzar bruto el ID de cuenta AWS de 12 dígitos un dígito a la vez mediante políticas de sesión STS en líneaOriginalmente, los nombres de los buckets S3 compartían un único espacio de nombres global, lo que dio lugar al bucketsquatting — los atacantes podían apropiarse de nombres que esperaban que las organizaciones crearan. AWS abordó esto implementando espacios de nombres regionales por cuenta, un esquema de nombres que vincula cada bucket a su cuenta y región propietarias:
{nombre}-{IDcuenta}-{región}-an
Un bucket llamado myapp-123456789123-eu-north-1-an residiría en https://myapp-123456789123-eu-north-1-an.s3.eu-north-1.amazonaws.com. AWS ahora recomienda este formato para buckets nuevos, aunque aún no es el predeterminado. (Para conocer los antecedentes de cómo el nuevo espacio de nombres elimina el bucketsquatting, consulte One Cloud Please.)
La contrapartida es que el ID de cuenta y la región ahora están incorporados en el nombre del bucket. Una vez que un atacante obtiene el ID de cuenta de un objetivo, puede combinarlo con una lista de palabras y construir sistemáticamente URLs de buckets válidas — y S3 confirmará si cada una existe, incluso si el bucket es privado. Esa respuesta por sí sola es una valiosa inteligencia.
Bucky explota precisamente esto. Basándose en la investigación de Pwned Labs, primero recupera el ID de cuenta de 12 dígitos de cualquier bucket accesible utilizando la técnica s3-account-search, luego fuerza bruta el patrón {nombre}-{IDcuenta}-{región}-an para descubrir la huella S3 más amplia del objetivo.
s3:ListBucket o s3:GetObject en el bucket objetivosts:AssumeRole en ese rol, pasando una política de sesión en línea con una condición s3:ResourceAccount como "1*"1, la llamada HeadBucket tiene éxito; de lo contrario, devuelve 403Esto requiere como máximo 120 llamadas API (12 posiciones × 10 dígitos) y suele completarse en menos de un minuto.
go installgo install github.com/umair9747/bucky@latest
git clone https://github.com/umair9747/bucky.git
cd bucky
go build -o bucky .
sudo mv bucky /usr/local/bin/
bucky --update
Esto descarga e instala la última versión del repositorio.
Antes de usar bucky, necesitas un rol IAM en tu propia cuenta AWS que pueda acceder al bucket S3 objetivo. El bucket objetivo debe ser accesible públicamente o tener una política de bucket que permita el acceso desde tu cuenta.
Crea trust-policy.json — esto permite que tu usuario IAM asuma el rol:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<TU_ID_DE_CUENTA>:root"
},
"Action": "sts:AssumeRole"
}
]
}
Reemplaza
<TU_ID_DE_CUENTA>con tu ID de cuenta AWS de 12 dígitos. Puedes limitar el principal a un usuario IAM específico o ARN de rol en lugar de:root.
Crea s3-policy.json — el rol necesita permisos de lectura amplios en S3 (la condición s3:ResourceAccount en la política de sesión en línea de bucky maneja el filtrado a nivel de cuenta):
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:GetObject"
],
"Resource": "*"
}
]
}
aws iam create-role \
--role-name bucky-role \
--assume-role-policy-document file://trust-policy.json
aws iam put-role-policy \
--role-name bucky-role \
--policy-name S3ReadAccess \
--policy-document file://s3-policy.json
aws iam get-role --role-name bucky-role --query 'Role.Arn' --output text
# Salida: arn:aws:iam::123456789012:role/bucky-role
Si tu usuario IAM aún no tiene permiso sts:AssumeRole, adjúntalo:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "sts:AssumeRole",
"Resource": "arn:aws:iam::<TU_ID_DE_CUENTA>:role/bucky-role"
}
]
}
La forma principal de usar bucky — enumerar el ID de cuenta desde un bucket conocido, luego probar más buckets en un solo paso:
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket target-bucket \
--wordlist wordlists/default.txt \
--access-key AKIA... \
--secret-key wJal...
Con una clave de objeto conocida (mejora la fiabilidad):
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket s3://target-bucket/index.html \
--wordlist wordlists/default.txt \
--workers 20
Múltiples buckets (separados por comas):
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket bucket1,bucket2,bucket3 \
--wordlist wordlists/default.txt
Múltiples buckets desde un archivo:
bucky \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket-file targets.txt \
--wordlist wordlists/default.txt
Guardar resultados en JSON:
bucky --bucket target-bucket --wordlist wordlists/default.txt --json
bucky --bucket target-bucket --wordlist wordlists/default.txt --json --output results.json
Salida:
=== Fase 1: Enumeración de ID de cuenta ===
[*] Verificando acceso al bucket: target-bucket
[+] Acceso confirmado
[+] Región del bucket: us-west-2
[*] Enumerando ID de cuenta...
[██████████████████████████████] 12/12 | 675351422352
[+] ID de cuenta: 675351422352
=== Fase 2: Descubrimiento de buckets ===
[*] Probando buckets para la cuenta: 675351422352
[*] Cargadas 312 candidatos de la lista de palabras
[+] ENCONTRADO: target-backups
[+] ENCONTRADO: target-logs
[██████████████████████████████] 312/312 | 2 encontrados
=== Resumen ===
ID de cuenta : 675351422352
Fuente : target-bucket
Región : us-west-2
Descubiertos: 2 bucket(s) adicional(es)
- target-backups
- target-logs
Si solo necesitas el ID de cuenta:
bucky enum \
--role-arn arn:aws:iam::123456789012:role/bucky-role \
--bucket target-bucket