Certificate Transparency: como descobrir subdomínios com crt.sh e Censys
Mapear os subdomínios de um alvo é uma das primeiras etapas de qualquer reconhecimento. A boa notícia para quem faz OSINT é que existe uma fonte pública, confiável e passiva para isso: os logs de Certificate Transparency (CT). Toda vez que uma autoridade certificadora emite um certificado TLS, esse evento é registrado em logs públicos e auditáveis. Como quase todo subdomínio acaba recebendo um certificado em algum momento, esses logs revelam nomes que a enumeração tradicional dificilmente encontraria, e tudo isso sem enviar um único pacote ao servidor do alvo.
O que é Certificate Transparency
Certificate Transparency é um padrão criado para detectar certificados emitidos de forma indevida. Autoridades certificadoras publicam cada certificado em logs append-only, que qualquer pessoa pode consultar. Do ponto de vista de OSINT, isso tem um efeito colateral valioso: os campos Subject Alternative Name (SAN) de cada certificado contêm os nomes de host cobertos, incluindo subdomínios internos, ambientes de homologação e ativos esquecidos.
Duas ferramentas se destacam para consultar esses logs: o crt.sh (um front-end gratuito mantido pela Sectigo) e o Censys (plataforma de busca de ativos na internet).
Consultando o crt.sh
O crt.sh agrega dados de vários logs CT e permite buscas com curingas no estilo SQL. O caractere % funciona como curinga.
Pela interface web
No campo de busca de crt.sh, uma consulta como %.exemplo.com.br retorna certificados que cobrem subdomínios de exemplo.com.br. Já %exemplo.com.br amplia a busca para qualquer nome que contenha o termo.
Pela API JSON (linha de comando)
O crt.sh pode devolver JSON diretamente, o que permite montar um fluxo de consulta, extração e deduplicação em uma linha. Lembre que o % precisa ser codificado como %25 na URL:
curl -s 'https://crt.sh/?q=%25.exemplo.com.br&output=json' \
| jq -r '.[].name_value' \
| sed 's/\*\.//g' \
| sort -u
O que cada parte faz:
curl -sbaixa o JSON em modo silencioso.jq -r '.[].name_value'extrai o camponame_value, que traz os nomes de host (um certificado pode listar vários, separados por quebra de linha).sed 's/\*\.//g'remove o prefixo de curinga*.dos certificados wildcard.sort -uordena e elimina duplicatas.
Uma saída típica se parece com isto:
api.exemplo.com.br
homolog.exemplo.com.br
mail.exemplo.com.br
vpn.exemplo.com.br
www.exemplo.com.br
Monitoramento contínuo via feed
Para acompanhar novos certificados de um domínio ao longo do tempo, o crt.sh oferece um feed Atom:
https://crt.sh/atom?q=exemplo.com.br
Basta assinar esse feed em um leitor de RSS para ser avisado quando um novo subdomínio ganhar certificado. Isso é especialmente útil para detectar ambientes recém-publicados.
Consultando o Censys
O Censys mantém um índice próprio de certificados e usa a Censys Query Language. Na plataforma atual, o operador de regex é o =~, que casa com qualquer parte do campo.
Para buscar nomes de certificado por regex, a documentação indica o campo cert.parsed.subject.common_name com o operador =~:
cert.parsed.subject.common_name=~`exemplo\.com\.br$`
O operador : usa tokenização de subdomínio nos campos de certificado, então para casar por um componente específico da string a forma recomendada é o regex com =~. Vale lembrar que o uso de regex em consultas é um recurso restrito a clientes pagos no Censys.
Para automação, o Censys oferece um cliente Python e há projetos de código aberto, como o censys-subdomain-finder, que consomem a API para enumerar subdomínios a partir dos certificados.
Na prática: fluxo de enumeração passiva
Um roteiro enxuto para um alvo autorizado:
- Colete pelo crt.sh. Rode o comando
curl/jqacima e salve a lista bruta de nomes em um arquivo. - Complemente com o Censys. Use a busca por
cert.namesou regex para pegar certificados que o crt.sh eventualmente não tenha indexado. - Deduplique e normalize. Junte as duas listas, remova wildcards e ordene (
sort -u). - Resolva o DNS. Nem todo nome em certificado ainda aponta para um host ativo. Resolva cada candidato para separar o que está vivo:
cat subdominios.txt | while read d; do
dig +short "$d" | grep -q . && echo "$d"
done
- Documente a origem. Registre que a coleta foi 100% passiva, via logs públicos.
Armadilhas comuns
- Wildcards mascarando subdomínios: um certificado
*.exemplo.com.brnão revela os subdomínios reais por trás dele. Trate o wildcard como pista, não como resposta. - Ruído histórico: os logs guardam certificados antigos. Muitos nomes já não resolvem. Sempre valide com DNS antes de concluir que algo existe.
- Domínios compartilhados: certificados de CDNs e provedores de hospedagem podem listar nomes de vários clientes. Confirme a titularidade.
- Limites de taxa: o crt.sh pode ficar lento ou aplicar limites em consultas pesadas. Espace as requisições e evite loops agressivos.
Tabela comparativa
| Recurso | crt.sh | Censys |
|---|---|---|
| Custo | Gratuito | Gratuito com limites; regex é pago |
| Saída programática | JSON e feed Atom | API e cliente Python |
| Monitoramento contínuo | Feed Atom por domínio | Alertas na plataforma |
| Ponto forte | Rapidez e simplicidade | Riqueza de metadados |
Ética e legalidade
Consultar logs de Certificate Transparency é coleta passiva de informação pública: você não toca a infraestrutura do alvo. Ainda assim, no Brasil a LGPD e o Marco Civil da Internet exigem finalidade legítima para qualquer tratamento de dados. Use essas técnicas em alvos próprios, em programas de bug bounty autorizados ou em investigações com base legal. Resolver DNS e varrer portas já deixa o campo passivo e pode exigir autorização: tenha clareza sobre o escopo antes de avançar.
Mapeou a superfície de um domínio com CT logs e quer validar seu método? Traga seu fluxo para a comunidade OsintHunters Brasil e compare notas com outros investigadores.
