Grunt's personal blog

this is my personal blog for my hacking stuff, my degree stuff, etc

View on GitHub

Técnicas Prácticas de Enumeración en AWS

Este apunte está diseñado para pentesters y red teamers que buscan identificar recursos en AWS de manera efectiva y ética. Incluye técnicas externas e internas, ejemplos prácticos y comandos específicos para maximizar su utilidad.


1. Enumeración Externa: Sin Credenciales

1.1. Descubrimiento de Subdominios

1.2. Identificación de Buckets S3 Públicos

1.3. Análisis DNS y WHOIS


2. Enumeración Interna: Con Credenciales

2.1. Listado de Recursos con awscli

2.2. Enumeración de Usuarios y Roles IAM

2.3. Detección de Configuraciones Erróneas


3. Ejemplo Práctico

  1. Escenario: Dominio example.com.
  2. Paso 1: Enumerar subdominios:
    dnsenum example.com
    
    • Encuentra dev.example.com.
  3. Paso 2: Resolver IP:
    host dev.example.com
    
    • Salida: 52.70.117.69 (EC2).
  4. Paso 3: Probar buckets:
    curl http://example-lab-dev.s3.amazonaws.com/
    
    • XML devuelto = bucket público.

4. Herramientas Recomendadas


Obtención de IDs de Cuentas desde Buckets S3

Descripción

Esta técnica aprovecha las características de la API de AWS para determinar el ID de una cuenta a partir de un bucket S3 público o un objeto accesible, incluso si no hay recursos compartidos públicamente de manera evidente.

Pasos Clave

  1. Crear un Usuario IAM en la Cuenta del Atacante:
    • Genera un usuario IAM sin permisos iniciales en tu propia cuenta AWS.
    • Usa el comando:
      aws iam create-user --user-name enum
      
    • Crea claves de acceso para este usuario:
      aws iam create-access-key --user-name enum
      
  2. Configurar las Claves en AWS CLI:
    • Configura un perfil en AWS CLI con las claves generadas:
      aws configure --profile enum
      
  3. Definir una Política con Condición:
    • Crea una política que permita leer el bucket solo si el ID de la cuenta que posee el bucket comienza con un dígito específico (por ejemplo, “1”). Ejemplo de política en policy-s3-read.json:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "AllowResourceAccount",
                  "Effect": "Allow",
                  "Action": [
                      "s3:ListBucket",
                      "s3:GetObject"
                  ],
                  "Resource": "*",
                  "Condition": {
                      "StringLike": {"s3:ResourceAccount": ["1*"]}
                  }
              }
          ]
      }
      
    • Asocia la política al usuario:
      aws iam put-user-policy --user-name enum --policy-name s3-read --policy-document file://policy-s3-read.json
      
  4. Probar el Acceso:
    • Intenta listar el contenido del bucket con el perfil del usuario:
      aws --profile enum s3 ls s3://<nombre-del-bucket>
      
    • Si falla con “AccessDenied”, ajusta el dígito en la condición (de 0 a 9) y repite hasta que tengas éxito, revelando el primer dígito del ID.
  5. Iterar para Dígitos Siguientes:
    • Modifica la condición para incluir más dígitos (por ejemplo, "12*"), y continúa hasta obtener el ID completo.

Ejemplo Práctico


Enumeración de Usuarios IAM en Otras Cuentas

Descripción

Esta técnica abusa de la validación de políticas IAM para identificar usuarios existentes en una cuenta objetivo, utilizando el ID de cuenta previamente obtenido.

Pasos Clave

  1. Crear un Bucket S3 en la Cuenta del Atacante:
    • Genera un bucket único:
      aws s3 mb s3://mi-bucket-$RANDOM-$RANDOM-$RANDOM
      
  2. Definir una Política de Acceso:
    • Crea una política que otorgue acceso a un usuario específico en la cuenta objetivo. Ejemplo en grant-s3-bucket-read.json:
      {
          "Version": "2012-10-17",
          "Statement": [
              {
                  "Sid": "AllowUserToListBucket",
                  "Effect": "Allow",
                  "Resource": "arn:aws:s3:::mi-bucket-12345-67890-54321",
                  "Principal": {
                      "AWS": ["arn:aws:iam::123456789012:user/cloudadmin"]
                  },
                  "Action": "s3:ListBucket"
              }
          ]
      }
      
    • Aplica la política al bucket:
      aws s3api put-bucket-policy --bucket mi-bucket-12345-67890-54321 --policy file://grant-s3-bucket-read.json
      
  3. Verificar Existencia:
    • Si la política se aplica sin errores, el usuario existe.
    • Si retorna “Invalid principal in policy”, el usuario no existe.

Ejemplo Práctico


Herramientas Útiles

Pacu

Ejemplo con Lista de Roles