Subdomain Takeover (DNS órfão)

Só leitura — não altera nada no alvo. Só em alvo seu ou autorizado por escrito.

O vetor

Vetor real: quando você cria um subdomínio apontando para um serviço (ex.: app.dominio.com → Heroku, blog.dominio.com → GitHub Pages) e depois deleta o recurso no serviço mas esquece o registro DNS, o subdomínio fica órfão — aponta para nada. O invasor cria um recurso no mesmo serviço com o mesmo nome e "sequestra" o subdomínio. Hospeda phishing, rouba cookies do domínio pai (se cookies forem *.dominio.com). Casos reais: GitHub Pages, Heroku, Azure, S3. O que testamos: se seu domínio atual tem subdomínios apontando para recursos inexistentes, e o que fazer quando tiver domínio próprio.

Os passos

Passo 1 — Enumerar subdomínios do domínio atual:

# workers.dev é gerenciado pela Cloudflare — não há subdomínios customizados.
# Mas quando você registrar SEU_DOMINIO.com, ESTES são os testes:
# 1. Buscar registros CNAME órfãos:
dig SEU_DOMINIO.com ANY +short
dig app.SEU_DOMINIO.com CNAME +short
dig blog.SEU_DOMINIO.com CNAME +short
dig api.SEU_DOMINIO.com CNAME +short
dig staging.SEU_DOMINIO.com CNAME +short
dig admin.SEU_DOMINIO.com CNAME +short

O que esperar

Resultado esperado hoje: workers.dev não tem subdomínios customizados. ✅ Sem risco atual.

Passo 2 — Verificar via crt.sh (certificados emitidos = subdomínios que existiram):

# Substitua pelo seu domínio quando tiver .com:
curl -s "https://crt.sh/?q=exemplo.workers.dev&output=json" | python -c "
import sys, json
try:
    d = json.load(sys.stdin)
    subdomains = set()
    for entry in d:
        for name in entry.get('name_value', '').split('\n'):
            subdomains.add(name.strip())
    print(f'Subdomínios encontrados: {len(subdomains)}')
    for s in sorted(subdomains):
        print(f'  {s}')
except:
    print('Nenhum certificado encontrado (normal para workers.dev)')
"

Resultado esperado: 0 subdomínios (workers.dev não emite certs por subdomínio). ✅

Passo 3 — Simulação do ataque (o que aconteceria com domínio próprio):

# CENÁRIO HIPOTÉTICO (quando tiver .com):
# 1. Você cria: blog.SEU_DOMINIO.com → CNAME → seublog.herokuapp.com
# 2. Você deleta o app no Heroku (esquece o CNAME)
# 3. Atacante cria app "seublog" no Heroku (mesmo nome)
# 4. blog.SEU_DOMINIO.com agora resolve para o app do atacante
# 5. Atacante hospeda phishing que rouba cookies de *.SEU_DOMINIO.com

# Como testar se um CNAME está órfão:
# Resposta NXDOMAIN do destino = vulnerável:
dig +short blog.SEU_DOMINIO.com CNAME  # → seublog.herokuapp.com
curl -s -o /dev/null -w "%{http_code}" https://seublog.herokuapp.com  # → 404 (Heroku) = órfão!

Passo 4 — Verificar se há CNAMEs pendentes no Cloudflare:

# No painel Cloudflare → DNS → Records:
# Procurar por registros CNAME que apontam para:
# - *.herokuapp.com (se app foi deletado)
# - *.github.io (se Pages foi deletado)
# - *.netlify.app (se site foi removido)
# - *.vercel.app (se projeto foi deletado)
# - *.azurewebsites.net (se app foi removido)
# Cada CNAME sem destino = vulnerável a takeover

Análise — como invasores encontram subdomínios órfãos:

  1. Subfinder/Sublist3r: enumera subdomínios via crt.sh, VirusTotal, SecurityTrails, DNS brute-force.
  2. can-i-take-over-xyz: GitHub repo com lista de serviços vulneráveis a takeover (fingerprints de respostas).
  3. Nuclei template: nuclei -t takeovers/ -u SEU_DOMINIO.com — automatiza a detecção.
  4. Bug bounty: takeover de subdomínio paga $500–$5.000 em programas de bug bounty.

Como corrigir

Correção necessária (P2 — quando tiver domínio próprio):

  1. Inventário de DNS: manter planilha de cada subdomínio → serviço → status. Remover CNAME imediatamente ao deletar recurso.
  2. Cloudflare DNS audit: revisar mensalmente todos os registros DNS. Script:
    # Listar todos os CNAMEs via Cloudflare API:
    curl -s "https://api.cloudflare.com/client/v4/zones/ZONE_ID/dns_records?type=CNAME" \
      -H "Authorization: Bearer CF_TOKEN" | python -m json.tool
    
  3. DNSSEC: ativar no Cloudflare — previne envenenamento de DNS.
  4. Wildcard cookie: NUNCA usar Set-Cookie: ...; domain=.SEU_DOMINIO.com — se um subdomínio for takeover, o atacante rouba o cookie. Usar domain=app.SEU_DOMINIO.com (específico).
  5. Monitoramento automático: configurar alerta no Cloudflare para mudanças de DNS.
  6. Subjack/takeover scan: rodar mensalmente subjack -w subdomains.txt -t 50 -https -o results.txt.

📋 Novos achados do Bloco H

# Achado Severidade Exercício
41 75 ocorrências de secrets no histórico git (OpenAI, Supabase SRK, sbp_, JWT_SECRET, CF token) — extraíveis se repo for público 🔴 Crítico 32
42 wrangler.jsonc não está no .gitignore — continua sendo commitado 🔴 Crítico 32
43 Stored XSS via prompt injection: /api/feed/events aceita car_title com HTML → IA ecoa → dangerouslySetInnerHTML no admin 🔴 Crítico 33
44 dangerouslySetInnerHTML em admin/analytics/page.tsx:800 sem sanitização 🔴 Crítico 33
45 Dependências com ^/~ (range versions) — vulnerável a dependency confusion/typosquatting 🟡 Médio 34
46 Sem GitHub Actions/CI com npm audit — sem verificação automatizada de supply chain 🟡 Médio 34
47 API vaza "source": "database" na resposta do feed — revela arquitetura 🟡 Baixo 35
48 Sem subdomínios órfãos hoje (workers.dev) — preventivo para domínio próprio futuro 🟡 Preventivo 36

PurpleLab // plataforma de treino ofensivo + defensivo // Fase 1 — portal dinamico