
Script PowerShell che monitora il traffico DNS di Windows tramite pktmon per rilevare avvelenamento, spoofing, risposte di resolver malevoli e cambiamenti del MAC del gateway, registrando gli avvisi.
Uno script PowerShell in singolo file che monitora il traffico di rete della macchina Windows stessa alla ricerca di segnali di DNS poisoning / spoofing, utilizzando pktmon — lo strumento di cattura pacchetti integrato in Windows 10 (1809+), Windows 11 e Windows Server 2019+. Non è richiesto alcuno strumento di cattura di terze parti (Wireshark, Npcap, tcpdump).
Cattura il traffico DNS (UDP/TCP porta 53) a livello dello stack di rete del sistema operativo, il che copre sia il traffico LAN che WAN su una macchina tipica, quindi analizza i pacchetti grezzi da solo — formato binario pcapng, header Ethernet/IP/UDP/TCP e il formato dei messaggi DNS, inclusi i puntatori di compressione dei nomi — interamente in PowerShell nativo.
Una versione companion bash/tcpdump copre macOS e Linux.
| Segnale | Perché è importante |
|---|---|
| Risposte in conflitto alla stessa query DNS | La firma da manuale di un tentativo di poisoning: un attaccante fa correre una risposta falsificata contro quella reale, sperando che la risposta falsificata arrivi per prima e venga messa in cache. |
| Risposte da un server DNS che non hai mai configurato | Confrontate con Get-DnsClientServerAddress. Una risposta da un server non riconosciuto può indicare un attaccante off-path che inietta risposte. |
| Risposte senza una query in sospeso corrispondente | Una risposta per una domanda che il monitor non ha mai visto porre — un possibile segno di traffico iniettato/falsificato (con un periodo di grazia all'avvio per evitare falsi positivi). |
| Cambi dell'indirizzo MAC del gateway predefinito a metà sessione | Rilevati tramite Get-NetNeighbor a ogni ciclo di cattura. L'ARP spoofing è il solito primo passo che gli attaccanti compiono per posizionarsi in vista di manomissioni DNS sulla LAN. |
Ogni avviso stampa due parti:
[TECHNICAL] — dettaglio grezzo del pacchetto, per chi vuole indagare ulteriormente[WHAT THIS MEANS] — una spiegazione in linguaggio semplice del perché è importanteTutto l'output viene anche scritto in un file di log con timestamp.
pktmon.exe disponibile (integrato in tutti questi)pktmon pcapng (usato per convertire le catture ai fini dell'analisi) è stato aggiunto dopo la release iniziale 1809; se manca, aggiorna Windowsgit clone https://github.com/microlaser/dns-watchdog.git
cd dns-watchdog\windows
Nessun modulo o dipendenza esterna da installare — solo lo script stesso.
Da un PowerShell elevato (Amministratore):
.\dns_watchdog.ps1
Per impostazione predefinita lo script rileva automaticamente il gateway predefinito e i server DNS configurati, e cattura su tutti gli adattatori di rete (pktmon opera a livello dello stack di rete del sistema operativo, quindi copre naturalmente sia il traffico LAN che WAN senza scegliere un adattatore specifico). Interrompi il monitoraggio con Ctrl+C; un riepilogo della sessione viene stampato all'uscita.
.\dns_watchdog.ps1 [-LogFile <path>] [-CaptureIntervalSeconds <n>] [-GraceResponses <n>] [-KeepCaptures]
| Parametro | Descrizione |
|---|---|
-LogFile | Percorso del log della sessione (predefinito: .\dns_watchdog_<timestamp>.log) |
-CaptureIntervalSeconds | Durata di ogni finestra di cattura prima che venga convertita e analizzata. Più basso = meno latenza di rilevamento, più overhead. Predefinito: 5 |
-GraceResponses | Numero di risposte da osservare prima che si attivino gli avvisi "nessuna query corrispondente", per evitare rumore all'avvio. Predefinito: 10 |
-KeepCaptures | Mantiene i file .etl/.pcapng di ogni finestra su disco invece di eliminarli dopo l'analisi |
=========================================================================
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 non ha un analogo diretto al piping di tcpdump in un parser testuale — l'output live della console di pktmon è byte grezzi, non righe decodificate. Quindi questo script invece:
pktmon in brevi finestre rotanti (5 secondi per impostazione predefinita), catturando su .etl.pcapng (pktmon pcapng)Una particolarità che vale la pena conoscere: Windows cattura frequentemente i pacchetti generati localmente (in uscita) prima che l'header Ethernet venga aggiunto in alcuni checkpoint dello stack, quindi le query DNS in uscita possono arrivare come pacchetti IP nudi senza alcun framing di link-layer, mentre le risposte in entrata arrivano completamente incorniciate in Ethernet dal filo. Il parser rileva e gestisce entrambi. pktmon tende anche a riportare lo stesso pacchetto fisico più di una volta (catturato in più punti nello stack di rete); lo script deduplica le ripetizioni identiche byte per byte all'interno di ogni finestra di cattura, così un singolo pacchetto reale non genera più avvisi — una risposta realmente in conflitto/avvelenata ha contenuto diverso, quindi non è mai influenzata da questa deduplicazione.
pktmon pcapng richiede una build di Windows ragionevolmente recente; sistemi molto vecchi dell'era 1809 potrebbero dover ripiegare su pktmon etl2txt (non implementato qui).MIT (o aggiorna per adattarla alle tue preferenze).