
DHCPig v2.7.2
Script di esaurimento DHCP scritto in Python utilizzando la libreria di rete scapy
DHCPig
Validazione whitehat dell'hardening DHCP: esaurisci un pool, dirotta i lease dei vicini, sfratta gli host dai loro indirizzi con ARP contraffatto e segnala se la rete ti ha fermato. Richiede root e Python 3.11+.
Esegui la web UI
Debian / Kali: scarica l'ultimo .deb da Releases e installalo — mette dhcpig e dhcpig-web sul PATH, senza bisogno di venv:
curl -LO https://github.com/kamorin/DHCPig/releases/download/v2.7.2/dhcpig_2.7.2-1_all.deb
sudo apt install ./dhcpig_2.7.2-1_all.deb
sudo dhcpig-web --open
Installazione globale (qualsiasi Linux, Python 3.11+, senza venv):
git clone https://github.com/kamorin/DHCPig && cd DHCPig
sudo pip install --break-system-packages .
sudo dhcpig-web --open
Installa direttamente nel Python di sistema come root, quindi sudo dhcpig-web trova il comando senza dover maneggiare percorsi .venv/bin/. --break-system-packages disattiva la protezione PEP 668 di Debian/Kali che impedisce a pip di toccare i pacchetti di sistema — quella protezione esiste per salvaguardare i pacchetti gestiti da apt, non perché questa installazione sia anomala; il .deb o una venv evitano del tutto di averne bisogno.
Da sorgente (qualsiasi Linux, Python 3.11+):
git clone https://github.com/kamorin/DHCPig && cd DHCPig
python3 -m venv .venv && .venv/bin/pip install -e .
sudo .venv/bin/dhcpig-web --open
Apri l'URL stampato http://127.0.0.1:8787/?token=.... Tre insidie:
- Root è richiesto in ogni caso (socket raw). Da sorgente (venv), usa il percorso completo
.venv/bin/—sudoazzeraPATH. ?token=è obbligatorio. Senza di esso ottieni 401 e una pagina vuota.- Niente interfaccia grafica? Si lega al loopback di proposito. Inoltra la porta, non rilegarla:
ssh -L 8787:127.0.0.1:8787 user@<vm-ip>. Togli--open.
Su Debian/Kali, esegui prima sudo apt install -y python3-venv se il passaggio della venv fallisce.
CLI
sudo .venv/bin/dhcpig exhaust eth0 --report run.json
sudo .venv/bin/dhcpig release eth0 --scope 192.168.4.0/22 # DESTRUCTIVE
sudo .venv/bin/dhcpig active-scan eth0 --scope 192.168.4.0/22 # read-only
sudo .venv/bin/dhcpig release-previous eth0 # undo a previous run
dhcpig ifaces
| Flag | |
|---|---|
--dry-run | solo ricognizione: ARP sweep e transazioni di controllo eseguite realmente, nulla di mutante viene inviato |
--scope CIDR | limita i target (ripetibile); il default è la rete dell'interfaccia stessa |
--rate N | pps, default 7 — non su exhaust, che si auto-regola |
--no-evict | salta la fase di conflitto ARP |
--report FILE | scrive un report della sessione su FILE al termine dell'esecuzione; il formato segue l'estensione di FILE (.json/.csv/.html, default JSON) |
--client-mac MAC | solo exhaust; usa questo MAC invece di uno casuale (ripetibile — ruota nella lista) |
--request-option SPEC | exhaust/active-scan; contenuto dell'opzione DHCP 55 (parameter-request-list) da inviare, es. 12,14-19,23 (default: il profilo integrato in ordine macOS) |
--no-spoof-eth-src | solo exhaust; usa il MAC reale della NIC come sorgente Ethernet per ogni frame (Wi-Fi; gli AP scartano i frame il cui MAC sorgente non è la stazione associata) |
-v0 stampa solo i risultati; -v3 aggiunge il debug a livello di pacchetto. Riferimento completo delle flag: man dhcpig (o packaging/dhcpig.1 prima dell'installazione).
Cosa fa ogni modalità
Esaurimento DHCP (exhaust) — distruttiva
- Inventaria il segmento via ARP, poi dimostra che il DHCP funziona da questa macchina e per un MAC sconosciuto
- Invia DHCPRELEASE per ogni lease dei vicini — il protocollo non richiede prova di proprietà
- Inonda di DISCOVER/REQUEST da MAC inventati finché il server smette di rispondere
- Richiede nuovamente gli indirizzi rilasciati per nome (opzione 50) una volta che il pool è esaurito
- Forgia conflitti ARP RFC 5227 contro ciò che ha preso, per vedere se gli host cedono l'indirizzo
- Verdetto: un client nuovo di zecca riuscirebbe comunque a ottenere un indirizzo dopo?
Rilascio dei client attivi DHCP (release) — distruttiva
- Stessa catena senza l'inondazione: inventario → rilascio → nuova richiesta per nome → conflitto ARP
- Colpisce i dispositivi connessi in questo momento; il pool resta intatto così la maggior parte può riottenere un indirizzo
- Verdetto: qualche host ha perso il suo indirizzo e non è riuscito a ottenerne uno nuovo?
Post esaurimento / Reset (release-previous) — recupero
- Riproduce il journal dei lease su disco e restituisce ogni indirizzo preso da questo strumento
- Filtrato per questa interfaccia, rete e server DHCP;
--max-agescarta le voci obsolete - Registra se il pool era già esaurito, ma rilascia comunque i lease registrati nel journal
- Verdetto: il pool è di nuovo utilizzabile?
Trova vicini (active-scan) — sola lettura
- Esegue un ARP sweep sullo scope, invia un DHCPINFORM per il fingerprinting dei server DHCP
- Non prende indirizzi, non disturba i lease
Scansione passiva (scan) — sola lettura, solo CLI
- Osserva DHCP e ARP; identifica gli host tramite l'ordine dell'opzione 55, ricadendo sul vendor MAC
- Non invia nulla. Esegue finché non viene fermata
Leggere un run
Tutto finisce nel log degli eventi, prima i più gravi: i finding, poi una riga per host, poi un riepilogo OUTCOME. La Verbosity 0 (web) o -v0 (CLI) nasconde il traffico dei pacchetti. L'export JSON è la registrazione completa: il log è un riepilogo.
Annullare un run
I lease vengono mantenuti dopo un run così lo stato di esaurimento può essere verificato. Rilasciali:
sudo .venv/bin/dhcpig restore eth0 # same process still running
sudo .venv/bin/dhcpig release-previous eth0 # any time later, from the lease journal
Il journal ($XDG_STATE_HOME/dhcpig/leases-<iface>.jsonl) registra MAC, IP, server e timestamp per ogni lease preso — dati dell'engagement. Eliminalo quando hai finito.
Disclaimer
Esegui questo strumento solo su reti di tua proprietà o per cui hai esplicita autorizzazione a testare. release ed exhaust interrompono di proposito i client attivi; --scope è opzionale e il default è l'intero segmento. Gli autori non sono responsabili per un uso improprio.
Note di progettazione e dettagli interni: docs/DESIGN.md. Contributi: CONTRIBUTING.md. Licenza: GPL v2 o successiva.