
Script de PowerShell que monitorea el tráfico DNS de Windows mediante pktmon para detectar envenenamiento, suplantación, respuestas de resolutores no autorizados y cambios de MAC de puerta de enlace, registrando alertas.
Un script de PowerShell de un solo archivo que vigila el propio tráfico de red de una máquina Windows en busca de señales de envenenamiento / suplantación de DNS, usando pktmon — la herramienta de captura de paquetes integrada en Windows 10 (1809+), Windows 11 y Windows Server 2019+. No se requiere ninguna herramienta de captura de terceros (Wireshark, Npcap, tcpdump).
Captura el tráfico DNS (UDP/TCP puerto 53) en la pila de red del sistema operativo, lo que cubre tanto el tráfico de LAN como el de WAN en una máquina típica, y luego analiza los paquetes en bruto por sí mismo — formato binario pcapng, cabeceras Ethernet/IP/UDP/TCP y el formato de mensaje DNS, incluidos los punteros de compresión de nombres — enteramente en PowerShell nativo.
Una versión bash/tcpdump complementaria cubre macOS y Linux.
| Señal | Por qué importa |
|---|---|
| Respuestas en conflicto a la misma consulta DNS | La firma de manual de un intento de envenenamiento: un atacante compite con una respuesta falsificada contra la real, esperando que la respuesta falsificada llegue primero y se almacene en caché. |
| Respuestas de un servidor DNS que nunca configuraste | Comparado con Get-DnsClientServerAddress. Una respuesta de un servidor no reconocido puede indicar un atacante fuera de ruta inyectando respuestas. |
| Respuestas sin una consulta pendiente coincidente | Una respuesta a una pregunta que el monitor nunca vio formular — una posible señal de tráfico inyectado/suplantado (con un período de gracia inicial para evitar falsos positivos). |
| Cambios en la dirección MAC de la puerta de enlace predeterminada a mitad de sesión | Sondeado mediante Get-NetNeighbor en cada ciclo de captura. La suplantación ARP es el primer paso habitual que dan los atacantes para posicionarse y manipular el DNS en la LAN. |
Cada alerta imprime dos partes:
[TECHNICAL] — detalle del paquete en bruto, para quien quiera investigar más a fondo[WHAT THIS MEANS] — una explicación en lenguaje sencillo de por qué importaToda la salida también se escribe en un archivo de registro con marca de tiempo.
pktmon.exe disponible (incluido de serie en todos ellos)pktmon pcapng (usado para convertir las capturas para su análisis) se añadió después del lanzamiento inicial de 1809; si falta, actualiza Windowsgit clone https://github.com/microlaser/dns-watchdog.git
cd dns-watchdog\windows
No hay módulos ni dependencias externas que instalar — solo el propio script.
Desde un PowerShell elevado (Administrador):
.\dns_watchdog.ps1
Por defecto, el script autodetecta tu puerta de enlace predeterminada y los servidores DNS configurados, y captura en todos los adaptadores de red (pktmon opera en la pila de red del sistema operativo, por lo que esto cubre naturalmente tanto el tráfico de LAN como el de WAN sin elegir un adaptador específico). Detén la monitorización con Ctrl+C; al salir se imprime un resumen de la sesión.
.\dns_watchdog.ps1 [-LogFile <path>] [-CaptureIntervalSeconds <n>] [-GraceResponses <n>] [-KeepCaptures]
| Parámetro | Descripción |
|---|---|
-LogFile | Ruta al registro de la sesión (por defecto: .\dns_watchdog_<timestamp>.log) |
-CaptureIntervalSeconds | Duración de cada ventana de captura antes de que se convierta y analice. Menor = menos latencia de detección, más sobrecarga. Por defecto: 5 |
-GraceResponses | Número de respuestas a observar antes de que se activen las alertas de "sin consulta coincidente", para evitar ruido al inicio. Por defecto: 10 |
-KeepCaptures | Conservar los archivos .etl/.pcapng de cada ventana en disco en lugar de eliminarlos tras el análisis |
=========================================================================
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.
Windows no tiene un análogo directo a canalizar tcpdump hacia un analizador de texto — la salida en vivo por consola de pktmon son bytes en bruto, no líneas decodificadas. Así que este script, en su lugar:
pktmon en ventanas cortas rotativas (5 segundos por defecto), capturando a .etl.pcapng (pktmon pcapng)Una peculiaridad que conviene conocer: Windows con frecuencia captura los paquetes generados localmente (salientes) antes de que se añada la cabecera Ethernet en algunos puntos de control de la pila, por lo que las consultas DNS salientes pueden llegar como paquetes IP desnudos sin ningún entramado de capa de enlace, mientras que las respuestas entrantes llegan completamente entramadas en Ethernet desde el cable. El analizador detecta y maneja ambos casos. pktmon también tiende a reportar el mismo paquete físico más de una vez (capturado en múltiples puntos de la pila de red); el script deduplica las repeticiones idénticas byte a byte dentro de cada ventana de captura para que un solo paquete real no genere alertas múltiples — una respuesta genuinamente en conflicto/envenenada tiene contenido diferente, por lo que nunca se ve afectada por esta deduplicación.