Voltar às atualizações
New releaseAug 2, 2026

DHCPig v2.7.2

Script de exaustão DHCP escrito em Python usando a biblioteca de rede scapy.

Compartilhar

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/sudo redefine PATH.
  • 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-runsomente reconhecimento: varredura ARP + transações de controle executadas de verdade, nada de mutação é enviado
--scope CIDRlimita os alvos (repetível); o padrão é a própria rede da interface
--rate Npps, padrão 7 — não em exhaust, que se auto-regula
--no-evictpula a fase de conflito ARP
--report FILEgrava 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 MACsomente exhaust; use este MAC em vez de um aleatório (repetível — rotaciona pela lista)
--request-option SPECexhaust/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-srcsomente 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-age descarta 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.

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.

Categorias