
Script PowerShell que monitoriza o tráfego DNS do Windows através do pktmon para detetar envenenamento, spoofing, respostas de resolvedores maliciosos e alterações de MAC do gateway, registando alertas.
Um script PowerShell de arquivo único que monitora o próprio tráfego de rede de uma máquina Windows em busca de sinais de envenenamento / falsificação de DNS, usando pktmon — a ferramenta de captura de pacotes integrada ao Windows 10 (1809+), Windows 11 e Windows Server 2019+. Nenhuma ferramenta de captura de terceiros (Wireshark, Npcap, tcpdump) é necessária.
Ele captura tráfego DNS (UDP/TCP porta 53) na pilha de rede do SO, o que cobre tanto tráfego de LAN quanto de WAN em uma máquina típica, e então analisa os pacotes brutos por conta própria — formato binário pcapng, cabeçalhos Ethernet/IP/UDP/TCP e o formato de mensagem DNS, incluindo ponteiros de compressão de nomes — inteiramente em PowerShell nativo.
Uma versão companheira em bash/tcpdump cobre macOS e Linux.
| Sinal | Por que importa |
|---|---|
| Respostas conflitantes para a mesma consulta DNS | A assinatura clássica de uma tentativa de envenenamento: um atacante corre com uma resposta forjada contra a real, esperando que a resposta forjada chegue primeiro e seja armazenada em cache. |
| Respostas de um servidor DNS que você nunca configurou | Comparado com Get-DnsClientServerAddress. Uma resposta de um servidor não reconhecido pode indicar um atacante fora do caminho injetando respostas. |
| Respostas sem consulta pendente correspondente | Uma resposta para uma pergunta que o monitor nunca viu ser feita — um possível sinal de tráfego injetado/falsificado (com um período de carência na inicialização para evitar falsos positivos). |
| Mudanças no endereço MAC do gateway padrão no meio da sessão | Consultado via Get-NetNeighbor a cada ciclo de captura. O spoofing de ARP é o primeiro passo usual que os atacantes tomam para se posicionarem para a adulteração de DNS na LAN. |
Cada alerta imprime duas partes:
[TECHNICAL] — detalhe bruto do pacote, para quem quiser investigar mais[WHAT THIS MEANS] — uma explicação em linguagem simples de por que isso importaToda a saída também é gravada em um arquivo de log com carimbo de data/hora.
pktmon.exe disponível (integrado em todos esses)pktmon pcapng (usado para converter capturas para análise) foi adicionado após o lançamento inicial do 1809; se estiver faltando, atualize o Windowsgit clone https://github.com/microlaser/dns-watchdog.git
cd dns-watchdog\windows
Nenhum módulo ou dependência externa para instalar — apenas o próprio script.
De um PowerShell elevado (Administrador):
.\dns_watchdog.ps1
Por padrão, o script detecta automaticamente seu gateway padrão e servidores DNS configurados, e captura em todos os adaptadores de rede (o pktmon opera na pilha de rede do SO, então isso naturalmente cobre tanto tráfego de LAN quanto de WAN sem escolher um adaptador específico). Pare o monitoramento com Ctrl+C; um resumo da sessão é impresso na saída.
.\dns_watchdog.ps1 [-LogFile <path>] [-CaptureIntervalSeconds <n>] [-GraceResponses <n>] [-KeepCaptures]
| Parâmetro | Descrição |
|---|---|
-LogFile | Caminho para o log da sessão (padrão: .\dns_watchdog_<timestamp>.log) |
-CaptureIntervalSeconds | Duração de cada janela de captura antes de ser convertida e analisada. Menor = menos latência de detecção, mais sobrecarga. Padrão: 5 |
-GraceResponses | Número de respostas a observar antes que os alertas de "nenhuma consulta correspondente" sejam ativados, para evitar ruído na inicialização. Padrão: 10 |
-KeepCaptures | Manter os arquivos .etl/.pcapng de cada janela no disco em vez de excluí-los após a análise |
=========================================================================
DNS Watchdog (Windows) - DNS poisoning / spoofing monitor
=========================================================================
Capturing on: all network adapters (pktmon captures at the OS networking stack,
which covers this host's LAN and WAN traffic together)
Default gateway: 192.168.1.1 (MAC baseline: 60-95-F8-2B-5E-78)
Configured DNS: 192.168.0.1, 192.168.1.1
Log file: .\dns_watchdog_20260918_204725.log
...
[20:47:44.872] [ALERT] Conflicting DNS responses for the same query
[TECHNICAL] txn=64878 query=example.com (type 28) first_response=[AAAA:2607:f8b0:...] conflicting_response(src=10.0.0.9)=[AAAA:dead:beef::1]
[WHAT THIS MEANS] This machine's DNS question got two DIFFERENT answers back. Legitimate DNS servers don't normally do this. This is the textbook signature of a DNS poisoning attempt, where an attacker races a forged answer against the real one, hoping the forged one arrives first and gets cached.
O Windows não tem um análogo direto de canalizar tcpdump para um analisador de texto — a saída do console ao vivo do pktmon são bytes brutos, não linhas decodificadas. Então este script, em vez disso:
pktmon em janelas curtas e rotativas (5 segundos por padrão), capturando para .etl.pcapng (pktmon pcapng)Uma peculiaridade que vale a pena conhecer: O Windows frequentemente captura pacotes gerados localmente (de saída) antes que o cabeçalho Ethernet seja adicionado em alguns pontos de verificação da pilha, então consultas DNS de saída podem chegar como pacotes IP puros sem nenhum enquadramento de camada de enlace, enquanto respostas de entrada chegam totalmente enquadradas em Ethernet vindas do fio. O analisador detecta e lida com ambos. O pktmon também tende a reportar o mesmo pacote físico mais de uma vez (capturado em vários pontos da pilha de rede); o script deduplica repetições byte a byte idênticas dentro de cada janela de captura para que um único pacote real não gere alertas múltiplas vezes — uma resposta genuinamente conflitante/envenenada tem conteúdo diferente, então nunca é afetada por essa deduplicação.
pktmon pcapng requer uma build do Windows razoavelmente atual; sistemas muito antigos da era 1809 podem precisar recorrer a pktmon etl2txt em vez disso (não implementado aqui).MIT (ou atualize para corresponder à sua preferência).