Enumeração em Larga Escala de Tecnologias a partir do ASN
Reconhecimento ofensivo de infraestrutura usando Sistemas Autônomos como ponto de entrada para enumeração em larga escala.
Sumário
- Introdução e Contexto
- O que é um ASN?
- Fluxo Completo da Metodologia
- Fase 1 — Descoberta de Ranges via RADB
- Fase 2 — Port Scanning em Massa com Masscan
- Fase 3 — Extração de Hosts Ativos
- Fase 4 — Reverse DNS com dnsx
- Casos Especiais e Troubleshooting
- Próximos Passos após Enumeração
- Considerações Operacionais e OPSEC
Introdução e Contexto
Durante um programa de Bug Bounty ou um pentest com escopo amplo, um dos maiores desafios é mapear a superfície de ataque real de uma organização — não apenas os domínios que ela divulga publicamente, mas toda a infraestrutura IP que lhe pertence.
A abordagem tradicional de começar por subdomínios de empresa.com deixa passar uma quantidade enorme de ativos: ambientes de staging, APIs internas com acesso público inadvertido, serviços legacy, CDNs próprias e cloud assets que nunca foram linkados a um domínio canônico.
A técnica descrita neste artigo parte de um vetor diferente: o Autonomous System Number (ASN) da organização. Com ele, é possível:
- Recuperar todos os blocos de IP (CIDRs) associados à empresa
- Escanear esses ranges em busca de portas HTTP/HTTPS abertas
- Resolver os IPs descobertos de volta para hostnames via PTR (rDNS)
- Construir uma lista de subdomínios e endpoints que não aparecem em nenhum DNS forward
O que é um ASN?
Um Autonomous System (AS) é um conjunto de redes IP sob controle de uma única entidade administrativa — geralmente uma grande empresa, ISP ou provedor de cloud. Cada AS recebe um número único (ASN) atribuído pela IANA/RIRs (ARIN, RIPE, LACNIC, etc.).
Exemplos reais:
AS13335→ CloudflareAS15169→ GoogleAS16509→ Amazon AWSAS32934→ Meta (Facebook)
Para encontrar o ASN de um alvo:
# Via whois
whois -h whois.radb.net 'empresa.com'
# Via ferramentas online
curl "https://api.bgpview.io/search?query_term=empresa.com"
# Via amass
amass intel -org "Nome da Empresa"
# Via metabigor
echo "Nome da Empresa" | metabigor net --org
Fluxo Completo da Metodologia
ASN
└─► RADB Whois ──► ranges.txt (CIDRs)
└─► Masscan ──► masscan.gnmap (IPs com portas abertas)
└─► awk ──► hosts (lista de IPs)
└─► dnsx (PTR lookup) ──► subs-hosts.txt (hostnames)
└─► [Próximas etapas de recon]
Fase 1 — Descoberta de Ranges via RADB
Comando
whois -h whois.radb.net -- '-i origin AS-NUMBER' | \
grep -Eo '([0-9.]+){4}/[0-9]+' > ranges.txt
Explicação
| Componente | Função |
|---|---|
whois -h whois.radb.net | Consulta diretamente o RADB (Routing Assets Database), que indexa informações de roteamento BGP globais |
-- '-i origin AS-NUMBER' | Os -- separam os argumentos do whois dos da query. -i origin filtra por registros onde o campo origin é o ASN especificado |
grep -Eo '([0-9.]+){4}/[0-9]+' | Extrai apenas os CIDRs do output (padrão: X.X.X.X/YY) |
> ranges.txt | Persiste os ranges para uso no masscan |
Exemplo de uso real
# Substituir AS-NUMBER pelo número real (ex: AS15169 para Google)
whois -h whois.radb.net -- '-i origin AS15169' | \
grep -Eo '([0-9.]+){4}/[0-9]+' | sort -u > ranges.txt
# Verificar quantidade de ranges encontrados
wc -l ranges.txt
# Estimar total de IPs
python3 -c "
import ipaddress, sys
total = sum(ipaddress.ip_network(l.strip(), strict=False).num_addresses
for l in open('ranges.txt') if l.strip())
print(f'Total de IPs: {total:,}')
"
Fontes alternativas de ranges
Nem sempre o RADB tem todos os ranges. Fontes complementares:
# BGPView API
curl -s "https://api.bgpview.io/asn/AS-NUMBER/prefixes" | \
jq -r '.data.ipv4_prefixes[].prefix' >> ranges.txt
# Hurricane Electric
curl -s "https://bgp.he.net/AS-NUMBER#_prefixes" | \
grep -oP '\d+\.\d+\.\d+\.\d+/\d+' >> ranges.txt
# Deduplica e ordena
sort -u ranges.txt -o ranges.txt
Fase 2 — Port Scanning em Massa com Masscan
Comando
masscan -iL ranges.txt \
-p80,443,8080,8000,8443,8081 \
--rate=10000 \
-oG masscan.gnmap
Explicação
| Flag | Função |
|---|---|
-iL ranges.txt | Lê os targets de um arquivo (suporta CIDRs) |
-p80,443,8080,8000,8443,8081 | Portas comuns de aplicações web |
--rate=10000 | Taxa de 10.000 pacotes/segundo — ajustar conforme capacidade da rede e OPSEC |
-oG masscan.gnmap | Output no formato "grepable", similar ao Nmap -oG |
Tuning de performance
# Scan agressivo (laboratório ou com permissão explícita)
masscan -iL ranges.txt -p80,443,8080,8000,8443,8081 \
--rate=100000 \
--adapter-ip 0.0.0.0 \
-oG masscan.gnmap
# Scan stealth (Bug Bounty — menor footprint)
masscan -iL ranges.txt -p80,443,8080,8000,8443,8081 \
--rate=1000 \
--randomize-hosts \
-oG masscan.gnmap
# Expandir portas para cobrir mais serviços web
masscan -iL ranges.txt \
-p80,81,443,591,2082,2087,2095,2096,3000,4243,4567,4711,4712,\
4993,5000,5104,5108,5800,6543,7000,7396,7474,8000,8001,8008,8014,\
8042,8069,8080,8081,8083,8088,8090,8091,8118,8123,8172,8222,8243,\
8280,8281,8333,8443,8500,8834,8880,8888,8983,9000,9043,9060,9080,\
9090,9091,9200,9443,9800,9981,12443,16080,18091,18092,20720,28017 \
--rate=10000 \
-oG masscan.gnmap
Formato do output -oG
# Masscan 1.3.2 scan initiated ...
Host: 192.168.1.1 () Ports: 80/open/tcp//http//
Host: 192.168.1.2 () Ports: 443/open/tcp//https//
Host: 10.0.0.5 () Ports: 8080/open/tcp////
Fase 3 — Extração de Hosts Ativos
Comando
awk '/Host: / {print $4}' masscan.gnmap > hosts
Explicação
O awk busca linhas que contêm Host: e extrai o quarto campo ($4), que é o endereço IP no formato de output grepable do masscan.
Variações úteis
# Extrair IP + porta (para usar com httpx depois)
awk '/Host: / {
split($5, ports, "/");
print $4 ":" ports[1]
}' masscan.gnmap > hosts-with-ports.txt
# Filtrar apenas hosts com porta 443 (HTTPS)
grep "443/open" masscan.gnmap | awk '{print $4}' > hosts-https.txt
# Contar hosts únicos por porta
for port in 80 443 8080 8443; do
count=$(grep "${port}/open" masscan.gnmap | awk '{print $4}' | sort -u | wc -l)
echo "Porta $port: $count hosts"
done
Fase 4 — Reverse DNS com dnsx
Comando principal
cat hosts | dnsx -resp-only -ptr | grep -v "exacttarget.com" > subs-hosts.txt
Explicação
| Componente | Função |
|---|---|
dnsx -resp-only | Executa PTR lookup (DNS reverso) e exibe apenas as respostas, sem o IP original |
-ptr | Força consulta de registros PTR |
grep -v "exacttarget.com" | Remove falsos positivos — muitos IPs da Salesforce/ExactTarget resolvem para esse domínio, gerando ruído |
Por que o rDNS é valioso?
Quando uma organização configura PTR records para seus IPs, ela essencialmente "nomeia" cada servidor. Esses nomes frequentemente revelam:
- Ambientes internos:
dev-api.empresa.com,staging-login.empresa.com - Serviços não documentados:
old-vpn.empresa.com,jenkins.infra.empresa.com - Padrões de nomenclatura para enumeração posterior
- Ativos cloud com hostnames gerados:
ec2-X-X-X-X.compute-1.amazonaws.com
Flags adicionais do dnsx
# Resolução paralela com mais threads
cat hosts | dnsx -resp-only -ptr -t 100 > subs-hosts.txt
# Mostrar IP + hostname (útil para correlação)
cat hosts | dnsx -ptr -t 100 | tee subs-hosts-with-ip.txt | awk '{print $1}' > subs-hosts.txt
# Resolver IPs obtidos de volta (forward confirm)
cat subs-hosts.txt | dnsx -resp-only -a -t 100 > resolved-ips.txt
Casos Especiais e Troubleshooting
Quando o IP não responde a PTR lookup diretamente
Alguns IPs (especialmente em ranges de cloud ou CDN) não têm PTR configurado na zona reversa mas ainda possuem resolução via outros métodos:
# Método direto com dnsx
echo "13.227.219.100" | dnsx -ptr -resp-only
# Via dig para debug
dig -x 13.227.219.100 +short
# Via host
host 13.227.219.100
# Forçando um DNS resolver específico (Google)
echo "13.227.219.100" | dnsx -ptr -resp-only -r 8.8.8.8,1.1.1.1
# Usando resolvers alternativos para bypass de rate limiting
echo "13.227.219.100" | dnsx -ptr -resp-only -r resolvers.txt
Falsos positivos comuns e como filtrar
# Filtrar múltiplos domínios ruidosos
cat hosts | dnsx -resp-only -ptr | \
grep -vE "(exacttarget\.com|amazonaws\.com|akamaitechnologies\.com|cloudfront\.net)" \
> subs-hosts.txt
# Filtrar e manter apenas domínios do alvo
TARGET="empresa.com"
cat hosts | dnsx -resp-only -ptr | \
grep "\.${TARGET}$" \
> subs-hosts-filtered.txt
Masscan não encontra resultados esperados
# Testar conectividade com um IP específico do range
masscan 192.168.1.0/24 -p80 --rate=100
# Verificar se o masscan está funcionando
masscan 45.33.32.156 -p22 --rate=100 # scanme.nmap.org
# Checar permissões (raw sockets exigem root)
sudo masscan -iL ranges.txt -p80 --rate=1000 -oG test.gnmap
Próximos Passos após Enumeração
Com subs-hosts.txt em mãos, o pipeline natural de reconhecimento continua:
1. HTTP Probing com httpx
# Probe em todos os hosts descobertos
cat subs-hosts.txt | httpx -silent -status-code -title -tech-detect \
-o httpx-results.txt
# Com screenshot
cat subs-hosts.txt | httpx -silent -screenshot -o screenshots/
2. Detecção de Tecnologias
# Web technologies fingerprinting
cat subs-hosts.txt | httpx -silent -tech-detect -json | \
jq '.tech[]' | sort | uniq -c | sort -rn | head -20
# Nuclei para detecção de versões e CVEs
nuclei -l subs-hosts.txt -t technologies/ -o tech-findings.txt
3. Descoberta de Conteúdo
# Fuzzing com ffuf nos hosts ativos
cat httpx-results.txt | grep "200" | awk '{print $1}' | \
while read url; do
ffuf -u "${url}/FUZZ" -w /usr/share/wordlists/dirbuster/common.txt \
-mc 200,301,302,401,403 -o "ffuf-$(echo $url | md5sum | cut -c1-8).json"
done
4. Busca por Exposições Críticas
# Nuclei com templates de exposição
nuclei -l subs-hosts.txt \
-t exposures/ \
-t misconfiguration/ \
-t default-logins/ \
-severity medium,high,critical \
-o critical-findings.txt
# Verificar headers de segurança
cat subs-hosts.txt | httpx -silent -include-response-header \
-H "X-Frame-Options,Content-Security-Policy,Strict-Transport-Security" \
-o security-headers.txt
Considerações Operacionais e OPSEC
Limites de Rate e Detecção
| Taxa (pps) | Perfil | Risco de Detecção |
|---|---|---|
| < 1.000 | Stealth | Baixo |
| 1.000 – 10.000 | Normal | Médio |
| 10.000 – 100.000 | Agressivo | Alto |
| > 100.000 | Laboratorial | Muito alto / bloqueio garantido |
Boas práticas para Bug Bounty
- Confirme o escopo: Verificar se os IPs dos ranges realmente pertencem ao alvo antes de escanear (WHOIS confirmatório)
- Respeite exclusões: Ranges marcados como
out-of-scopeno programa devem ser removidos deranges.txt - Evite IPs de terceiros: Ranges de cloud compartilhado podem afetar outros clientes
- Documente tudo: Log de comandos + timestamps facilita o relatório e comprova que você agiu dentro do escopo
Infraestrutura recomendada
# VPS dedicada para scans (não use sua rede pessoal)
# Exemplo: Linode, DigitalOcean, Vultr — $5-10/mês
# Separar fases em sessões tmux
tmux new-session -s asn-recon
tmux new-window -t asn-recon -n masscan
tmux new-window -t asn-recon -n dnsx
tmux new-window -t asn-recon -n httpx
Referências e Ferramentas
| Ferramenta | Repositório | Uso neste pipeline |
|---|---|---|
masscan | github.com/robertdavidgraham/masscan | Port scanning em larga escala |
dnsx | github.com/projectdiscovery/dnsx | Resolução DNS em massa + PTR |
httpx | github.com/projectdiscovery/httpx | HTTP probing |
nuclei | github.com/projectdiscovery/nuclei | Detecção de vulnerabilidades |
amass | github.com/owasp-amass/amass | Enumeração de ASN e subdomínios |
metabigor | github.com/j3ssie/metabigor | OSINT de rede corporativa |
| BGPView | bgpview.io | Consulta de ASN e prefixos |
Este artigo descreve técnicas para uso exclusivo em programas de Bug Bounty com escopo autorizado ou engagements de pentest com contrato. Realizar varreduras em redes sem autorização explícita é ilegal em praticamente todas as jurisdições.
Sua infraestrutura está realmente protegida?
Não espere um ataque real para descobrir suas falhas. Agende um Pentest com a KatrinaSec.
Solicitar Auditoria Agora