
Script d'épuisement DHCP écrit en Python utilisant la bibliothèque réseau Scapy
Validation whitehat du durcissement DHCP : épuisez un pool, détournez les baux des voisins, expulsez des hôtes de leurs adresses avec de l'ARP forgé, et indiquez si le réseau vous a arrêté. Nécessite root et Python 3.11+.
Debian / Kali : récupérez la dernière .deb depuis Releases et installez-la — place dhcpig et dhcpig-web dans PATH, pas besoin de 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
Installation globale (tout Linux, Python 3.11+, sans venv) :
git clone https://github.com/kamorin/DHCPig && cd DHCPig
sudo pip install --break-system-packages .
sudo dhcpig-web --open
S'installe directement dans le Python système en tant que root, donc sudo dhcpig-web trouve la commande sans jongler avec le chemin .venv/bin/. --break-system-packages contourne la protection PEP 668 de Debian/Kali contre pip touchant aux paquets système — cette protection existe pour préserver les paquets gérés par apt, pas parce que cette installation est inhabituelle ; le .deb ou un venv évitent d'en avoir besoin.
Depuis les sources (tout 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
Ouvrez l'URL http://127.0.0.1:8787/?token=... affichée. Trois pièges :
.venv/bin/ — sudo réinitialise PATH.?token= est obligatoire. Sans lui, vous obtenez des 401 et une page vide.ssh -L 8787:127.0.0.1:8787 user@<vm-ip>. Retirez --open.Sur Debian/Kali, exécutez d'abord sudo apt install -y python3-venv si l'étape venv échoue.
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
-v0 n'affiche que les résultats ; -v3 ajoute le débogage au niveau des paquets. Référence complète des options : man dhcpig (ou packaging/dhcpig.1 avant installation).
Épuisement DHCP (exhaust) — destructif
Libération DHCP des clients actifs (release) — destructif
Post-épuisement / Réinitialisation (release-previous) — récupération
--max-age supprime les entrées obsolètesTrouver les voisins (active-scan) — lecture seule
Scan passif (scan) — lecture seule, CLI uniquement
Tout se retrouve dans le journal d'événements, les pires en premier : les constatations, puis une ligne par hôte, puis un récapitulatif OUTCOME. La verbosité 0 (web) ou -v0 (CLI) masque le trafic de paquets. L'export JSON est l'enregistrement complet — le journal n'est qu'un résumé.
Les baux sont conservés après une exécution afin que l'état d'épuisement puisse être vérifié. Libérez-les :
sudo .venv/bin/dhcpig restore eth0 # same process still running
sudo .venv/bin/dhcpig release-previous eth0 # any time later, from the lease journal
Le journal ($XDG_STATE_HOME/dhcpig/leases-<iface>.jsonl) enregistre la MAC, l'IP, le serveur et l'horodatage pour chaque bail pris — des données de l'engagement. Supprimez-le lorsque vous avez terminé.
N'exécutez cet outil que contre des réseaux dont vous êtes propriétaire ou explicitement autorisé à tester. release et exhaust perturbent les clients actifs par conception ; --scope est facultatif et par défaut, tout le segment. Les auteurs ne sont pas responsables d'un mauvais usage.
Notes de conception et internals : docs/DESIGN.md. Contribution : CONTRIBUTING.md. Licence : GPL v2 ou ultérieure.
| Option |
|---|
--dry-run | recon uniquement : balayage ARP + transactions de contrôle réellement exécutées, rien de modifiant n'est envoyé |
--scope CIDR | limite les cibles (répétable) ; par défaut, le réseau de l'interface |
--rate N | pps, défaut 7 — pas sur exhaust, qui s'auto-régule |
--no-evict | ignore la phase de conflit ARP |
--report FILE | écrit un rapport de session dans FILE à la fin de l'exécution ; le format suit l'extension de FILE (.json/.csv/.html, défaut JSON) |
--client-mac MAC | exhaust uniquement ; utilise cette MAC au lieu d'une MAC aléatoire (répétable — effectue une rotation dans la liste) |
--request-option SPEC | exhaust/active-scan ; contenu de l'option-55 DHCP (parameter-request-list) à envoyer, p. ex. 12,14-19,23 (défaut : le profil intégré dans l'ordre macOS) |
--no-spoof-eth-src | exhaust uniquement ; utilise la vraie MAC de la carte réseau comme source Ethernet pour chaque trame (Wi-Fi ; les points d'accès ignorent les trames dont la MAC source n'est pas la station associée) |