
DHCPig v2.7.2
Script de exaustão DHCP escrito em Python usando a biblioteca de rede scapy.
DHCPig
Validação de hardening de DHCP whitehat: esgotar um pool, sequestrar leases de vizinhos, expulsar hosts de seus endereços com ARP forjado e relatar se a rede impediu você. Requer root e Python 3.11+.
Executar a interface web
Debian / Kali: baixe o .deb mais recente de
Lançamentos e instale-o —
ele coloca dhcpig e dhcpig-web no PATH, sem precisar 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
Instalação global (qualquer Linux, Python 3.11+, sem venv):
git clone https://github.com/kamorin/DHCPig && cd DHCPig
sudo pip install --break-system-packages .
sudo dhcpig-web --open
Instala direto no Python do sistema como root, então sudo dhcpig-web encontra o comando sem
complicações de caminho .venv/bin/. --break-system-packages substitui a proteção PEP 668 do Debian/Kali
contra o pip tocar em pacotes do sistema — essa proteção existe para proteger pacotes gerenciados pelo apt, não
porque esta instalação é incomum; o .deb ou um venv evitam precisar dela completamente.
A partir do código-fonte (qualquer 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
Abra a URL impressa http://127.0.0.1:8787/?token=.... Três pegadinhas:
- Root é necessário de qualquer forma (soquetes raw). A partir do código-fonte (venv), use o caminho completo
.venv/bin/—sudoredefinePATH. - O
?token=é obrigatório. Sem ele, você recebe 401s e uma página em branco. - Sem interface gráfica? Ele vincula ao loopback de propósito. Faça o encaminhamento, não re-vincule:
ssh -L 8787:127.0.0.1:8787 user@<vm-ip>. Remova--open.
No Debian/Kali, execute sudo apt install -y python3-venv primeiro se a etapa do venv falhar.
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
| Opção | |
|---|---|
--dry-run | somente reconhecimento: varredura ARP + transações de controle executadas de verdade, nada de mutação é enviado |
--scope CIDR | limita os alvos (repetível); o padrão é a própria rede da interface |
--rate N | pps, padrão 7 — não em exhaust, que se auto-regula |
--no-evict | pula a fase de conflito ARP |
--report FILE | grava um relatório de sessão em FILE quando a execução termina; o formato segue a extensão de FILE (.json/.csv/.html, padrão JSON) |
--client-mac MAC | somente exhaust; use este MAC em vez de um aleatório (repetível — rotaciona pela lista) |
--request-option SPEC | exhaust/active-scan; conteúdo da opção DHCP 55 (parameter-request-list) a enviar, ex.: 12,14-19,23 (padrão: o perfil integrado na ordem do macOS) |
--no-spoof-eth-src | somente exhaust; use o MAC real da NIC como origem Ethernet para cada quadro (Wi-Fi; APs descartam quadros cujo MAC de origem não é o da estação associada) |
-v0 imprime apenas os resultados; -v3 adiciona depuração em nível de pacote. Referência completa das opções: man dhcpig
(ou packaging/dhcpig.1 antes da instalação).
O que cada modo faz
Exaustão de DHCP (exhaust) — destrutivo
- Faz inventário ARP do segmento, depois prova que o DHCP funciona a partir desta máquina e para um MAC desconhecido
- Envia DHCPRELEASE para o lease de cada vizinho — o protocolo não exige prova de propriedade
- Inunda com DISCOVER/REQUEST de MACs fabricados até o servidor parar de responder
- Re-solicita os endereços liberados pelo nome (opção 50) assim que o pool é esgotado
- Forja conflitos ARP RFC 5227 contra o que ele tomou, para ver se os hosts abandonam o endereço
- Veredito: um cliente totalmente novo ainda conseguiria obter um endereço depois disso?
Liberação de DHCP para clientes ativos (release) — destrutivo
- Mesma cadeia sem o dilúvio: inventário → liberação → re-solicitação por nome → conflito ARP
- Atinge dispositivos conectados agora; o pool é mantido intacto para que a maioria possa readquirir
- Veredito: algum host perdeu seu endereço e não conseguiu obter um novo?
Pós-exaustão / Reset (release-previous) — recuperação
- Reproduz o diário de leases em disco e devolve cada endereço que esta ferramenta tomou
- Filtrado por esta interface, rede e servidor DHCP;
--max-agedescarta entradas obsoletas - Registra se o pool já estava esgotado, mas libera os leases registrados de qualquer forma
- Veredito: o pool está utilizável novamente?
Encontrar vizinhos (active-scan) — somente leitura
- Varre o escopo com ARP e envia um DHCPINFORM para identificar os servidores DHCP por impressão digital
- Não toma endereços, não perturba leases
Varredura passiva (scan) — somente leitura, apenas CLI
- Observa DHCP e ARP; identifica hosts pela ordem da opção-55, recorrendo ao fabricante do MAC como fallback
- Não envia nada. Executa até ser interrompido
Lendo uma execução
Tudo vai para o log de eventos, do pior primeiro: descobertas, depois uma linha por host, depois um
resumo OUTCOME. Verbosity 0 (web) ou -v0 (CLI) oculta o tráfego de pacotes. A exportação JSON
é o registro completo — o log é um resumo.
Desfazendo uma execução
Os leases são mantidos após uma execução para que o estado esgotado possa ser verificado. Libere-os:
sudo .venv/bin/dhcpig restore eth0 # same process still running
sudo .venv/bin/dhcpig release-previous eth0 # any time later, from the lease journal
O diário ($XDG_STATE_HOME/dhcpig/leases-<iface>.jsonl) registra MAC, IP, servidor e
timestamp por lease tomado — dados da operação. Apague-o ao terminar.
Aviso legal
Execute isso apenas contra redes que você possui ou para as quais está explicitamente autorizado a testar. release e
exhaust interrompem clientes ativos por design; --scope é opcional e tem como padrão o segmento
inteiro. Os autores não são responsáveis pelo uso indevido.
Notas de design e detalhes internos: docs/DESIGN.md. Contribuição: CONTRIBUTING.md.
Licença: GPL v2 ou posterior.