Script PowerShell qui surveille le trafic DNS Windows via pktmon pour détecter l'empoisonnement, l'usurpation, les réponses de résolveurs malveillants et les changements de MAC de passerelle, en journalisant les alertes.
Un script PowerShell monofichier qui surveille le propre trafic réseau d'une machine Windows à la recherche de signes d'empoisonnement / usurpation DNS, en utilisant pktmon — l'outil de capture de paquets intégré à Windows 10 (1809+), Windows 11 et Windows Server 2019+. Aucun outil de capture tiers (Wireshark, Npcap, tcpdump) n'est requis.
Il capture le trafic DNS (UDP/TCP port 53) au niveau de la pile réseau du système d'exploitation, ce qui couvre à la fois le trafic LAN et WAN sur une machine typique, puis analyse lui-même les paquets bruts — format binaire pcapng, en-têtes Ethernet/IP/UDP/TCP, et le format des messages DNS, y compris les pointeurs de compression de noms — entièrement en PowerShell natif.
Une version bash/tcpdump complémentaire couvre macOS et Linux.
| Signal | Pourquoi c'est important |
|---|---|
| Réponses contradictoires à la même requête DNS | La signature typique d'une tentative d'empoisonnement : un attaquant fait la course entre une réponse falsifiée et la vraie, espérant que la réponse falsifiée arrive en premier et soit mise en cache. |
| Réponses provenant d'un serveur DNS que vous n'avez jamais configuré | Comparé à Get-DnsClientServerAddress. Une réponse d'un serveur non reconnu peut indiquer un attaquant hors chemin injectant des réponses. |
| Réponses sans requête en attente correspondante | Une réponse à une question que le moniteur n'a jamais vue posée — signe possible de trafic injecté/usurpé (avec une période de grâce au démarrage pour éviter les faux positifs). |
| Changement de l'adresse MAC de la passerelle par défaut en cours de session | Interrogée via Get-NetNeighbor à chaque cycle de capture. L'usurpation ARP est généralement la première étape des attaquants pour se positionner en vue d'une altération DNS sur le LAN. |
Chaque alerte affiche deux parties :
[TECHNICAL] — détail brut du paquet, pour toute personne souhaitant approfondir[WHAT THIS MEANS] — une explication en langage clair de pourquoi cela compteToute la sortie est également écrite dans un fichier journal horodaté.
pktmon.exe disponible (intégré à tous ceux-ci)pktmon pcapng (utilisé pour convertir les captures en vue de l'analyse) a été ajouté après la version initiale 1809 ; s'il est absent, mettez Windows à jourgit clone https://github.com/microlaser/dns-watchdog.git
cd dns-watchdog\windows
Aucun module ni dépendance externe à installer — juste le script lui-même.
Depuis un PowerShell élevé (Administrateur) :
.\dns_watchdog.ps1
Par défaut, le script détecte automatiquement votre passerelle par défaut et vos serveurs DNS configurés, et capture sur toutes les cartes réseau (pktmon opère au niveau de la pile réseau du système d'exploitation, ce qui couvre naturellement à la fois le trafic LAN et WAN sans choisir une carte spécifique). Arrêtez la surveillance avec Ctrl+C ; un résumé de session s'affiche à la sortie.
.\dns_watchdog.ps1 [-LogFile <path>] [-CaptureIntervalSeconds <n>] [-GraceResponses <n>] [-KeepCaptures]
| Paramètre | Description |
|---|---|
-LogFile | Chemin du journal de session (par défaut : .\dns_watchdog_<timestamp>.log) |
-CaptureIntervalSeconds | Durée de chaque fenêtre de capture avant sa conversion et son analyse. Plus bas = moins de latence de détection, plus de surcharge. Par défaut : 5 |
-GraceResponses | Nombre de réponses à observer avant l'activation des alertes « aucune requête correspondante », afin d'éviter le bruit au démarrage. Par défaut : 10 |
-KeepCaptures | Conserver les fichiers .etl/.pcapng de chaque fenêtre sur le disque au lieu de les supprimer après analyse |
=========================================================================
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 n'a pas d'équivalent direct à rediriger tcpdump vers un analyseur de texte — la sortie console en direct de pktmon est constituée d'octets bruts, pas de lignes décodées. Ce script procède donc autrement :
pktmon par courtes fenêtres rotatives (5 secondes par défaut), en capturant vers .etl.pcapng (pktmon pcapng)Une particularité à connaître : Windows capture fréquemment les paquets générés localement (sortants) avant que l'en-tête Ethernet ne soit ajouté à certains points de contrôle de la pile, de sorte que les requêtes DNS sortantes peuvent arriver sous forme de paquets IP bruts sans aucune trame de couche liaison, tandis que les réponses entrantes arrivent entièrement encadrées en Ethernet depuis le réseau. L'analyseur détecte et gère les deux cas. pktmon a également tendance à signaler le même paquet physique plus d'une fois (capturé à plusieurs points de la pile réseau) ; le script déduplique les répétitions strictement identiques au sein de chaque fenêtre de capture afin qu'un seul paquet réel ne déclenche pas plusieurs alertes — une réponse réellement contradictoire/empoisonnée a un contenu différent, elle n'est donc jamais affectée par cette déduplication.