Phishing de Marca e Defesa de Domínio

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

O vetor

Vetor real: atacante registra seu-app.exemplo.workers.dev (typo) ou exemplo-login.com (lookalike), clona sua página de admin, e envia e-mail para seus clientes (no futuro SaaS) pedindo "atualização de senha". Como seu domínio não tem SPF/DKIM/DMARC, o e-mail do atacante pode spoofar contato@exemplo.com se você tiver esse domínio. O que testamos: (a) seu domínio tem proteção contra spoofing de e-mail, (b) não há lookalikes registrados, (c) sua página de admin é indexável (deve NÃO ser).

Os passos

Preparação:

# Seu domínio de produção é workers.dev (não tem e-mail associado).
# Quando você registrar exemplo.com (ou similar), ESTES são os testes.
# Hoje rodamos a versão preventiva no domínio atual.

Passo 1 — Verificar SPF/DKIM/DMARC no seu domínio (quando tiver .com):

# Substitua SEU_DOMINIO quando tiver um:
# SPF:
nslookup -type=TXT SEU_DOMINIO.com | grep "v=spf1"
# DMARC:
nslookup -type=TXT _dmarc.SEU_DOMINIO.com | grep "v=DMARC1"
# DKIM:
nslookup -type=TXT default._domainkey.SEU_DOMINIO.com | grep "v=DKIM1"

O que esperar

Resultado esperado HOJE (workers.dev): vazio — Cloudflare Workers não tem e-mail. ✅ Correto (não envia e-mail).

Resultado esperado quando registrar .com:

SPF:   "v=spf1 include:_spf.google.com -all"        # só Google Mail pode enviar
DKIM:  "v=DKIM1; k=rsa; p=MIGfMA0GCS..."              # chave pública de assinatura
DMARC: "v=DMARC1; p=reject; rua=mailto:sec@SEU_DOMINIO.com; adkim=s; aspf=s"

Passo 2 — Buscar lookalikes registrados (OSINT legítimo no próprio nome):

# DomainsDB API (grátis, público) — busca variantes do seu nome:
curl -s "https://api.domainsdb.info/v1/domains/search?domain=exemplo" \
  | python -m json.tool | head -30

Resultado esperado: lista de domínios que contêm "exemplo". Se alguém registrou uma variante, investigue.

Passo 3 — Verificar se sua página de admin está indexável (deve NÃO estar):

BASE="https://seu-app.exemplo.workers.dev"
# robots.txt — admin DEVE estar em Disallow:
curl -s "$BASE/robots.txt"

Resultado esperado:

User-Agent: *
Allow: /
Disallow: /admin/
Disallow: /api/admin/

Confirmado ao vivo: /admin/ e /api/admin/ em Disallow. Bom — mas robots.txt é sugestão, não bloqueio.

Passo 4 — Verificar X-Robots-Tag na página de admin:

curl -s -I "$BASE/admin" | grep -i "x-robots-tag\|noindex\|noarchive"

Resultado esperado: x-robots-tag: noindex, noarchive — garante que Google não indexa mesmo se alguém linkar.

Passo 5 — Monitorar lookalikes com canary:

# Quando tiver .com, registre as variações comuns ANTES de atacantes:
# - exemplo.com (typo)
# - exemplo.net (outro TLD)
# - adrianoterres-rosa.com (hífen)
# - antigravitymedia.com (marca)
# Use Cloudflare Registrar para os principais (~$10/ano cada).
# Configure "Domain Alert" no Cloudflare para receber notificação se aparecer lookalike.

Análise — o que isto significa:

  • Sem SPF/DKIM/DMARC, qualquer um pode spoofar e-mails do seu domínio (quando tiver .com).
  • Sem registrar lookalikes, atacantes criam domínios que imitam o seu.
  • robots.txt não impede indexação — só X-Robots-Tag: noindex ou <meta name="robots" content="noindex"> garante.

Como corrigir

Correção necessária (P2):

  1. Registrar domínio próprio (exemplo.com ou marca do produto).
  2. SPF: v=spf1 include:_spf.google.com -all (só provedor autorizado envia).
  3. DKIM: adicionar registro DNS da chave pública do provedor de e-mail.
  4. DMARC: v=DMARC1; p=reject; rua=mailto:sec@dominio.com; adkim=s; aspf=s (rejeita e-mails não assinados).
  5. Registrar lookalikes nos TLDs principais (.com, .com.br, .net).
  6. Cloudflare Brand Alert ou MarksPan para monitorar novas_variantes.com.
  7. X-Robots-Tag: noindex, noarchive em todas as rotas /admin/*.
  8. Quando virar SaaS: usar Brand-Alert API ou PhishDeck para detectar páginas de phishing clonadas.

🧹 LIMPEZA ESPECÍFICA DO BLOCO G

# Ex. 27 — lead de teste:
cd /d/Antigravity-Monetizacao_TikTok/app
node -e "
(async()=>{
const fs=require('fs');
const env=Object.fromEntries(fs.readFileSync('.env.local','utf8').split(/\r?\n/).filter(l=>l.includes('=')).map(l=>[l.slice(0,l.indexOf('=')).trim(),l.slice(l.indexOf('=')+1).trim()]));
const SB=env.NEXT_PUBLIC_SUPABASE_URL, SRK=env.SUPABASE_SERVICE_ROLE_KEY;
const H={apikey:SRK,Authorization:'Bearer '+SRK};
const d=await fetch(SB+'/rest/v1/leads?car_title=ilike.*pentest*',{method:'DELETE',headers:H});
console.log('DELETE leads pentest:',d.status);
})()"

# Ex. 28 — nenhum dado persistido (só 10 requests de login falhados). Nada para limpar.
# Ex. 29 — só leitura. Nada para limpar.
# Ex. 30 — nenhum dado (endpoint 404). Nada para limpar.
# Ex. 31 — só DNS/OSINT. Nada para limpar.

📋 Novos achados do Bloco G (adicionar ao placar)

# Achado Severidade Exercício
32 Lead poisoning: /api/leads aceita WhatsApp de terceiro sem prova de propriedade 🔴 Crítico 27
33 Credential stuffing: sem lockout, sem rate limit, sem 2FA no login admin 🟠 Alto 28
34 Timing side-channel no login (e-mail válido 0,8s vs inválido 0,14s) 🟠 Alto 28
35 Hash de senha admin é SHA-256 (GPU-friendly, bilhões/s) — usar bcrypt/argon2 🟠 Alto 28
36 Scraping sem rate limit: 20 req seguidas no /api/feed = 20× HTTP 200 🟠 Alto 29
37 RLS leads exposto: anon key lê PII (nome + WhatsApp) de todos os leads 🔴 Crítico (já no placar #3) 29
38 Webhook de pagamento não existe — documentar anti-forjamento antes de implementar 🟡 Preventivo 30
39 Sem SPF/DKIM/DMARC (preventivo — sem domínio .com ainda) 🟡 Preventivo 31
40 Admin sem X-Robots-Tag: noindex (só robots.txt, que é sugestão) 🟡 Médio 31

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