
Script de agotamiento de DHCP escrito en Python utilizando la librería de red scapy.
Validación de endurecimiento DHCP para whitehat: agota un pool, secuestra las concesiones de los vecinos, expulsa hosts de sus direcciones con ARP falsificado y reporta si la red te lo impidió. Requiere root y Python 3.11+.
Debian / Kali: descarga el .deb más reciente desde
Releases e instálalo —
coloca dhcpig y dhcpig-web en PATH, sin necesidad 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
Instalación global (cualquier Linux, Python 3.11+, sin venv):
git clone https://github.com/kamorin/DHCPig && cd DHCPig
sudo pip install --break-system-packages .
sudo dhcpig-web --open
Se instala directamente en el Python del sistema como root, así que sudo dhcpig-web encuentra el comando sin tener que lidiar con rutas .venv/bin/. --break-system-packages anula la protección PEP 668 de Debian/Kali contra que pip toque paquetes del sistema — esa protección existe para resguardar paquetes gestionados por apt, no porque esta instalación sea inusual; el .deb o un venv evitan necesitarla por completo.
Desde el código fuente (cualquier 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
Abre la URL impresa http://127.0.0.1:8787/?token=.... Tres advertencias:
.venv/bin/ — sudo restablece PATH.?token= es obligatorio. Sin él obtienes 401s y una página en blanco.ssh -L 8787:127.0.0.1:8787 usuario@<ip-vm>. Omite --open.En Debian/Kali, ejecuta sudo apt install -y python3-venv primero si el paso del venv falla.
sudo .venv/bin/dhcpig exhaust eth0 --report run.json
sudo .venv/bin/dhcpig release eth0 --scope 192.168.4.0/22 # DESTRUCTIVO
sudo .venv/bin/dhcpig active-scan eth0 --scope 192.168.4.0/22 # solo lectura
sudo .venv/bin/dhcpig release-previous eth0 # deshace una ejecución anterior
dhcpig ifaces
| Flag | |
|---|---|
--dry-run | solo reconocimiento: el barrido ARP y las transacciones de control se ejecutan de verdad, no se envía nada mutador |
--scope CIDR | limita los objetivos (repetible); por defecto usa la propia red de la interfaz |
--rate N | pps, por defecto 7 — no en exhaust, que se auto-regula |
--no-evict | omite la fase de conflicto ARP |
--report FILE | escribe un informe de sesión en FILE cuando termina la ejecución; el formato sigue la extensión de FILE (.json/.csv/.html, por defecto JSON) |
--client-mac MAC | solo exhaust; usa esta MAC en lugar de una aleatoria (repetible — rota a través de la lista) |
--request-option SPEC | exhaust/active-scan; contenido de la opción DHCP 55 (lista de parámetros solicitados) a enviar, p. ej. 12,14-19,23 (por defecto: el perfil integrado de orden macOS) |
--no-spoof-eth-src | solo exhaust; usa la MAC real de la NIC como origen Ethernet para cada trama (Wi-Fi; los AP descartan tramas cuya MAC de origen no sea la de la estación asociada) |
-v0 imprime solo resultados; -v3 añade depuración a nivel de paquete. Referencia completa de flags: man dhcpig
(o packaging/dhcpig.1 antes de la instalación).
Agotamiento DHCP (exhaust) — destructivo
Liberación DHCP de clientes activos (release) — destructivo
Post agotamiento / Restablecimiento (release-previous) — recuperación
--max-age descarta entradas obsoletasEncontrar vecinos (active-scan) — solo lectura
Escaneo pasivo (scan) — solo lectura, solo CLI
Todo termina en el registro de eventos, lo peor primero: hallazgos, luego una línea por host, y después un resumen OUTCOME. La verbosidad 0 (web) o -v0 (CLI) oculta el tráfico de paquetes. La exportación JSON es el registro completo — el log es un resumen.
Las concesiones se conservan después de una ejecución para que el estado agotado pueda verificarse. Libéralas:
sudo .venv/bin/dhcpig restore eth0 # mismo proceso aún en ejecución
sudo .venv/bin/dhcpig release-previous eth0 # en cualquier momento posterior, desde el diario de concesiones
El diario ($XDG_STATE_HOME/dhcpig/leases-<iface>.jsonl) registra MAC, IP, servidor y
marca de tiempo por concesión tomada — datos de compromiso. Bórralo cuando termines.
Ejecuta esto solo contra redes que poseas o para las que tengas autorización explícita de prueba. release y
exhaust interrumpen clientes en vivo por diseño; --scope es opcional y por defecto cubre todo el
segmento. Los autores no son responsables del mal uso.
Notas de diseño e internals: docs/DESIGN.md. Contribuciones: CONTRIBUTING.md.
Licencia: GPL v2 o posterior.