
PowerShell-Skript, das Windows-DNS-Verkehr über pktmon überwacht, um Poisoning, Spoofing, Antworten von rogue Resolvern und Gateway-MAC-Änderungen zu erkennen und Warnungen zu protokollieren.
Ein Single-File-PowerShell-Skript, das den eigenen Netzwerkverkehr einer Windows-Maschine auf Anzeichen von DNS-Poisoning / Spoofing überwacht – mithilfe von pktmon, dem in Windows 10 (1809+), Windows 11 und Windows Server 2019+ integrierten Paket-Capture-Tool. Es wird kein Drittanbieter-Capture-Tool (Wireshark, Npcap, tcpdump) benötigt.
Es erfasst DNS-Verkehr (UDP/TCP Port 53) am Netzwerk-Stack des Betriebssystems, was sowohl LAN- als auch WAN-Verkehr auf einer typischen Maschine abdeckt, und parst anschließend die Rohpakete selbst – pcapng-Binärformat, Ethernet/IP/UDP/TCP-Header und das DNS-Nachrichtenformat, einschließlich Name-Compression-Pointern – vollständig in nativem PowerShell.
Eine begleitende bash/tcpdump-Version deckt macOS und Linux ab.
| Signal | Warum es wichtig ist |
|---|---|
| Widersprüchliche Antworten auf dieselbe DNS-Anfrage | Die textbook-Signatur eines Poisoning-Versuchs: Ein Angreifer lässt eine gefälschte Antwort gegen die echte antreten, in der Hoffnung, dass die gefälschte Antwort zuerst eintrifft und gecacht wird. |
| Antworten von einem DNS-Server, den Sie nie konfiguriert haben | Abgeglichen mit Get-DnsClientServerAddress. Eine Antwort von einem unbekannten Server kann auf einen Off-Path-Angreifer hindeuten, der Antworten injiziert. |
| Antworten ohne passende ausstehende Anfrage | Eine Antwort auf eine Frage, die der Monitor nie gestellt sah – ein mögliches Anzeichen für injizierten/gefälschten Verkehr (mit einer Start-Grace-Period zur Vermeidung von False Positives). |
| Änderungen der MAC-Adresse des Standard-Gateways während der Sitzung | Wird über Get-NetNeighbor in jedem Capture-Zyklus abgefragt. ARP-Spoofing ist üblicherweise der erste Schritt von Angreifern, um sich für DNS-Manipulation im LAN zu positionieren. |
Jeder Alarm gibt zwei Teile aus:
[TECHNICAL] – Rohpaket-Details für alle, die weiter untersuchen möchten[WHAT THIS MEANS] – eine Erklärung in einfacher Sprache, warum es wichtig istAlle Ausgaben werden zusätzlich in eine zeitgestempelte Logdatei geschrieben.
pktmon.exe (in allen diesen Versionen enthalten)pktmon pcapng (wird zur Konvertierung von Captures für die Analyse verwendet) wurde nach dem ursprünglichen 1809-Release hinzugefügt; falls es fehlt, Windows aktualisierengit clone https://github.com/microlaser/dns-watchdog.git
cd dns-watchdog\windows
Keine Module oder externen Abhängigkeiten zu installieren – nur das Skript selbst.
Aus einer erhöhten (Administrator) PowerShell:
.\dns_watchdog.ps1
Standardmäßig erkennt das Skript automatisch Ihr Standard-Gateway und Ihre konfigurierten DNS-Server und erfasst über alle Netzwerkadapter (pktmon arbeitet am Netzwerk-Stack des Betriebssystems, sodass dies auf natürliche Weise sowohl LAN- als auch WAN-Verkehr abdeckt, ohne einen bestimmten Adapter auszuwählen). Beenden Sie die Überwachung mit Ctrl+C; beim Beenden wird eine Sitzungszusammenfassung ausgegeben.
.\dns_watchdog.ps1 [-LogFile <path>] [-CaptureIntervalSeconds <n>] [-GraceResponses <n>] [-KeepCaptures]
| Parameter | Beschreibung |
|---|---|
-LogFile | Pfad zum Sitzungslog (Standard: .\dns_watchdog_<timestamp>.log) |
-CaptureIntervalSeconds | Länge jedes Capture-Fensters, bevor es konvertiert und analysiert wird. Niedriger = geringere Erkennungslatenz, mehr Overhead. Standard: 5 |
-GraceResponses | Anzahl der Antworten, die beobachtet werden, bevor „keine passende Anfrage"-Alarme aktiviert werden, um Startrauschen zu vermeiden. Standard: 10 |
-KeepCaptures | Die .etl/.pcapng-Dateien jedes Fensters auf der Festplatte behalten, anstatt sie nach der Analyse zu löschen |
=========================================================================
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 hat kein direktes Analogon zum Weiterleiten von tcpdump an einen Textparser – die Live-Konsolenausgabe von pktmon besteht aus Rohbytes, nicht aus dekodierten Zeilen. Daher geht dieses Skript stattdessen wie folgt vor:
pktmon in kurzen rotierenden Fenstern aus (standardmäßig 5 Sekunden) und erfasst in .etl.pcapng (pktmon pcapng)Eine erwähnenswerte Eigenheit: Windows erfasst häufig lokal generierte (ausgehende) Pakete bevor der Ethernet-Header an einigen Stack-Checkpoints hinzugefügt wird, sodass ausgehende DNS-Anfragen als reine IP-Pakete ohne jegliches Link-Layer-Framing ankommen können, während eingehende Antworten vollständig Ethernet-gerahmt von der Leitung kommen. Der Parser erkennt und behandelt beides. pktmon neigt außerdem dazu, dasselbe physische Paket mehr als einmal zu melden (an mehreren Punkten im Netzwerk-Stack erfasst); das Skript dedupliziert byte-identische Wiederholungen innerhalb jedes Capture-Fensters, damit ein echtes Paket nicht mehrfach alarmiert wird – eine tatsächlich widersprüchliche/vergiftete Antwort hat anderen Inhalt und ist von dieser Deduplizierung nie betroffen.