
DHCPig v2.7.2
Скрипт истощения DHCP, написанный на python с использованием сетевой библиотеки scapy.
DHCPig
Белошляпная проверка защищённости DHCP: истощите пул адресов, перехватите аренды соседей, вытесните хосты с их адресов поддельными ARP-сообщениями и узнайте, остановила ли вас сеть. Требуются root-права и Python 3.11+.
Запуск веб-интерфейса
Debian / Kali: возьмите свежий .deb из
Releases и установите его —
команды dhcpig и dhcpig-web появятся в PATH, 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
Глобальная установка (любой Linux, Python 3.11+, без venv):
git clone https://github.com/kamorin/DHCPig && cd DHCPig
sudo pip install --break-system-packages .
sudo dhcpig-web --open
Установка идёт напрямую в системный Python от root, поэтому sudo dhcpig-web находит команду без возни с путями вида .venv/bin/. Флаг --break-system-packages отключает защиту PEP 668 в Debian/Kali, которая запрещает pip трогать системные пакеты, — эта защита существует для сохранности пакетов, управляемых через apt, а не потому, что такая установка необычна; .deb или venv позволяют вообще не прибегать к ней.
Из исходников (любой 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
Откройте напечатанный URL http://127.0.0.1:8787/?token=.... Три подводных камня:
- Root-права нужны в любом случае (raw-сокеты). При установке из исходников (venv) используйте полный путь
.venv/bin/—sudoсбрасываетPATH. - Параметр
?token=обязателен. Без него вы получите 401 и пустую страницу. - Нет браузера на машине? Он намеренно слушает loopback. Прокиньте порт, а не меняйте адрес:
ssh -L 8787:127.0.0.1:8787 user@<vm-ip>. Уберите--open.
В Debian/Kali сначала выполните sudo apt install -y python3-venv, если шаг с venv завершится ошибкой.
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 | только разведка: ARP-скан и контрольные транзакции выполняются по-настоящему, ничего изменяющего состояние не отправляется |
--scope CIDR | ограничивает цели (можно повторять); по умолчанию — собственная сеть интерфейса |
--rate N | пакетов в секунду, по умолчанию 7 — не для exhaust, который сам регулирует темп |
--no-evict | пропустить фазу ARP-конфликтов |
--report FILE | записать отчёт о сессии в FILE по завершении запуска; формат зависит от расширения FILE (.json/.csv/.html, по умолчанию JSON) |
--client-mac MAC | только для exhaust; использовать этот MAC вместо случайного (можно повторять — перебирается по списку) |
--request-option SPEC | exhaust/active-scan; содержимое DHCP-опции 55 (список запрашиваемых параметров) для отправки, например 12,14-19,23 (по умолчанию встроенный профиль порядка macOS) |
--no-spoof-eth-src | только для exhaust; использовать реальный MAC сетевой карты как Ethernet-источник для каждого кадра (Wi-Fi; точки доступа отбрасывают кадры, чей MAC-источник не соответствует ассоциированной станции) |
-v0 выводит только результаты; -v3 добавляет отладку на уровне пакетов. Полный справочник флагов: man dhcpig (или packaging/dhcpig.1 до установки).
Что делает каждый режим
Истощение DHCP (exhaust) — разрушительный
- Проводит ARP-инвентаризацию сегмента, затем проверяет, что DHCP работает с этой машины и для неизвестного MAC
- Выполняет DHCPRELEASE для всех аренд соседей — протокол не требует подтверждения владения
- Заливает DISCOVER/REQUEST с выдуманных MAC, пока сервер не перестанет отвечать
- После истощения пула повторно запрашивает освобождённые адреса по имени (опция 50)
- Подделывает ARP-конфликты RFC 5227 против занятых адресов, чтобы проверить, сдадут ли хосты адрес
- Вывод: сможет ли после этого новый клиент всё ещё получить адрес?
Освобождение DHCP для активных клиентов (release) — разрушительный
- Та же цепочка без заливки: инвентаризация → освобождение → повторный запрос по имени → ARP-конфликт
- Воздействует на устройства, подключённые прямо сейчас; пул остаётся нетронутым, поэтому большинство сможет получить адрес заново
- Вывод: потерял ли какой-нибудь хост свой адрес и не смог получить новый?
После истощения / Сброс (release-previous) — восстановление
- Воспроизводит журнал аренд с диска и возвращает каждый адрес, который занял этот инструмент
- Фильтрация по этому интерфейсу, сети и DHCP-серверу;
--max-ageотбрасывает устаревшие записи - Фиксирует, был ли пул уже истощён, но в любом случае освобождает аренды из журнала
- Вывод: можно ли снова пользоваться пулом?
Поиск соседей (active-scan) — только чтение
- Сканирует диапазон ARP-запросами и отправляет один DHCPINFORM для идентификации DHCP-серверов
- Не занимает адресов и не затрагивает аренды
Пассивное сканирование (scan) — только чтение, только CLI
- Наблюдает за DHCP и ARP; идентифицирует хосты по порядку опции 55, при отсутствии данных — по вендору MAC
- Ничего не отправляет. Работает, пока не остановят
Разбор результатов запуска
Всё попадает в журнал событий, сначала самое важное: находки, затем по одной строке на хост, затем сводка OUTCOME. Уровень подробности 0 (в вебе) или -v0 (в CLI) скрывает трафик пакетов. JSON-экспорт — это полная запись; журнал — лишь сводка.
Отмена запуска
После запуска аренды сохраняются, чтобы можно было проверить состояние истощения. Освободите их:
sudo .venv/bin/dhcpig restore eth0 # same process still running
sudo .venv/bin/dhcpig release-previous eth0 # any time later, from the lease journal
Журнал ($XDG_STATE_HOME/dhcpig/leases-<iface>.jsonl) хранит MAC, IP, сервер и временную метку для каждой взятой аренды — данные о проведённой работе. Удалите его, когда закончите.
Отказ от ответственности
Запускайте этот инструмент только в сетях, которыми вы владеете или на тестирование которых у вас есть явное разрешение. release и exhaust намеренно нарушают работу активных клиентов; --scope необязателен и по умолчанию охватывает весь сегмент. Авторы не несут ответственности за неправомерное использование.
Заметки по дизайну и внутренностям: docs/DESIGN.md. Участие в разработке: CONTRIBUTING.md. Лицензия: GPL v2 или более поздняя.