Como hackeei um site gov.br
Em teoria um site do governo deveria ser um desafio e tanto quando se trata de segurança, mas os gov.br são internacionalmente reconhecidos como os mais vulneráveis a ataques básicos, como o que vou mostrar nesse artigo.
Então, já que não servem como exemplo de segurança, ao menos podemos ver o que NÃO fazer!
Por que escrevo isso?
Escrevo esse artigo para documentar como esse processo foi feito, como você pode se proteger e evitar que seus sistemas ou de sua empresa sofram o mesmo. E também para que você, que esteja estudando para ser um pentester ou trabalhar com cibersegurança, possa aprender mais uma forma de invasão relativamente comum em sites cujos administradores se descuidaram das configurações DNS.
Pré-requisitos
- Um servidor (de preferência que tenha um IPv4 fixo… IPv6 é bom, mas não é obrigatório) (opcional)
- Um pouquinho de dinheiro (eu sei, às vezes você tem que gastar e nem sempre vai ter retorno)
- Força de vontade
- Curiosidade
Explicações básicas
Se você não sabe muito sobre DNS, domínios, rede, etc. talvez precise ler esse tópico, mas se já souber, parabéns, pode pular direto para Setup.
Se ainda está aqui, significa que quer aprender algumas coisas. Então vamos lá…
O que é um domínio?
Bem, imagine um domínio como os nomes bonitinhos para os servidores. Assim como você não lembra do número de telefone de todos os seus contatos, seria impossível lembrar o número de IP de todos os sites que você acessa. Fora que grandes empresas ou sites que usam sistemas em múltiplos servidores (como balanceadores de carga ou distribuição geográfica) ficariam completamente inviáveis de serem usados.
Então os domínios entram exatamente para solucionar isso. São nomes fixos que tornam o acesso a sites muito mais fácil e possibilitam que sistemas avançados de distribuição entre múltiplos servidores sejam viáveis.
Como meu computador sabe aonde ir?
Certo, mas como meu computador ou celular sabem qual servidor ele tem que acessar? Afinal, o IP não é a única forma de um computador saber um endereço na rede?
E parabéns, você está no caminho certo! Um computador se comunica na internet utilizando o IP (Internet Protocol) e com isso, só consegue encontrar outro dispositivo utilizando esse protocolo.
É aí que entra o DNS (Domain Name System) - é tipo uma lista telefônica gigante da internet. Quando você digita www.gov.br, seu computador pergunta “ei, qual o IP desse cara aí?” para um servidor DNS, que responde algo como “ah, é 161.148.164.31”.
Por que sites gov.br são tão vulneráveis?
Olha, não é que eles são ruins de propósito (às vezes são). Mas alguns fatores colaboram:
- Contratos de terceirização mal fiscalizados
- Equipes de TI sobrecarregadas (ou inexistentes)
- Sistemas legados que ninguém quer mexer
- Falta de testes regulares de segurança
- Configurações DNS feitas na pressa e nunca revisadas
Setup
Server DNS
Para este proof-of-concept você vai precisar acessar seu servidor e instalar um Server DNS. Eu particularmente gosto do BIND9 (Berkeley Internet Name Domain). Simples, rápido para a maioria das demandas e seguro se bem configurado. O feijão com arroz do DNS, por assim dizer.
# Instalação no Ubuntu/Debian
sudo apt update && sudo apt install bind9 bind9utils bind9-doc
# Configuração básica em /etc/bind/named.conf.local
zone "hackerfofo.gov.br" {
type master;
file "/etc/bind/db.hackerfofo.gov.br";
allow-query { any; };
};Se não quiser ou simplesmente não souber configurar algo assim, tudo bem! Também pode utilizar um DNS-as-a-Service como o da NS1, mas vai ser necessário fazer uma certa “gambiarra”, por assim dizer.
Scan DNS
Agora que temos um servidor DNS pronto para atender qualquer domínio que desejarmos, vamos iniciar o processo de procura por um domínio vulnerável. Não são necessárias ferramentas ou táticas muito avançadas.
Nesse caso, queremos algum domínio *.gov.br, então podemos vasculhar todos os subdomínios, que, por comodidade, estão listados publicamente em dados.gov.br, junto com seus respectivos registrantes.
Com isso em mãos, podemos utilizar scripts simples ou ferramentas avançadas, como o SecurityTrails ou o DNSGov (da DataDNS), para obter o que precisamos. Ou usar o verificador de DNS do próprio Registro.br.
Mas o que, especificamente, estamos procurando?
Sabendo que todo domínio precisa de pelo menos um Name Server (no caso do .br, são no mínimo dois), precisamos procurar por domínios que tenham seus servidores de nomes (NS) esquecidos. Isso mesmo!
Servidor DNS que antes atendiam aquele domínio, mas hoje já não o atendem mais e alguém esqueceu de atualizar. Então, pode ser que aquele domínio tenha sido simplesmente removido do Servidor DNS ou o domínio do NS tenha expirado e atualmente encontra-se disponível para registro.
No meu caso, foi a segunda opção. O órgão em questão havia contratado uma empresa de TI para gerenciar e desenvolver seu site. Mas por algum motivo eles já não tinham mais nenhum vínculo. Acredito que em parte tenha sido pela troca de TLD que antes usavam *.gov.br e posteriormente passou-se a utilizar o site principal do órgão federal gestor.

Então, a empresa contratada tinha dois domínios. Vamos supor, para fins de entendimento:
empresa-ns1.com e empresa-ns2.com
Mas o domínio “empresa-ns1.com” expirou e ficou disponível para registro. O domínio “empresa-ns2.com” contínuo em pose da empresa, mas o servidor DNS associado a ele já não respondia mais ao domínio .gov.br e com isso sempre retorna “Domínio Não Autorizado”.
E aqui vem a jogada! Registrei o “empresa-ns1.com” e o apontei para o meu servidor DNS. Adicionei o domínio *.gov.br nele e agora meu servidor DNS respondia a consultas DNS desse domínio. Com isso em mãos, eu podia responder a pelo menos 50% das consultas DNS desse domínio.
Mas é aí que tá… o sistema global de DNS atualmente é bastante adepto a cache TTL e com isso em mente eu defini outros DNS Servers para aquele domínio (vou mostrar em imagens).
Então basicamente, no registro.br havia para esse domínio os seguintes NS:
empresa-ns1.com ⇾ Respondendo OK
empresa-ns2.com ⇾ Recusando as consultas
E o meu server (empresa-ns1.com) dizia ao client que os Name Servers eram:
takey-havara.hackerfofo.com
eukity-komo.hackerfofo.com

Assim, quando um servidor DNS publico requisitar e acertar exatamente o meu server ele ira salvar essa informação pelo máximo de tempo possível no cache. E dessa forma meu servidor passa a receber 85% das consultas DNS.

E com isso temos o total controle do domínio! A partir daqui podemos alterar o site principal, configurar um servidor de e-mails, entrar em portais internos, etc.
Então, agora você já sabe como manter o seu site seguro! Sempre mantenha seus Name Servers atualizados e funcionando, e se possível, use o DNSSEC ;)