
DHCPig v2.7.2
使用 Python 和 scapy 网络库编写的 DHCP 耗尽脚本
DHCPig
白帽 DHCP 加固验证:耗尽地址池,劫持邻居的租约,通过伪造 ARP 将主机从其地址上驱逐,并报告网络是否阻止了你。需要 root 权限和 Python 3.11+。
运行 Web UI
Debian / Kali: 从 Releases 获取最新的 .deb 并安装 —— 会将 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
直接以 root 身份安装到系统 Python 中,因此 sudo dhcpig-web 无需处理 .venv/bin/ 路径即可找到命令。--break-system-packages 会覆盖 Debian/Kali 中防止 pip 修改系统包的 PEP 668 保护 —— 该保护的存在是为了保护 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
打开打印出的 http://127.0.0.1:8787/?token=... URL。三个注意事项:
- 无论哪种方式都需要 root 权限(原始套接字)。从源码(venv)安装时,请使用完整的
.venv/bin/路径 ——sudo会重置PATH。 ?token=是必需的。 没有它你会收到 401 错误和一个空白页。- 无头环境? 它故意绑定回环地址。转发它,不要重新绑定:
ssh -L 8787:127.0.0.1:8787 user@<vm-ip>。去掉--open。
在 Debian/Kali 上,如果 venv 步骤失败,请先运行 sudo apt install -y python3-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
| 标志 | |
|---|---|
--dry-run | 仅侦察:ARP 扫描 + 控制事务真实运行,不发送任何修改性内容 |
--scope CIDR | 限定目标(可重复);默认为接口自身所在的网络 |
--rate N | pps,默认 7 —— 不适用于 exhaust,该模式自行控制节奏 |
--no-evict | 跳过 ARP 冲突阶段 |
--report FILE | 运行结束时将会话报告写入 FILE;格式取决于 FILE 的扩展名(.json/.csv/.html,默认 JSON) |
--client-mac MAC | 仅 exhaust;使用此 MAC 而不是随机 MAC(可重复 —— 在列表中循环使用) |
--request-option SPEC | exhaust/active-scan;要发送的 DHCP option-55(参数请求列表)内容,例如 12,14-19,23(默认:内置的 macOS 顺序配置文件) |
--no-spoof-eth-src | 仅 exhaust;所有帧均使用真实 NIC MAC 作为以太网源地址(Wi-Fi;AP 会丢弃源 MAC 不是关联站的帧) |
-v0 仅打印结果;-v3 增加数据包级调试。完整标志参考:man dhcpig(或在安装前查看 packaging/dhcpig.1)。
每种模式的作用
DHCP 耗尽(exhaust)—— 破坏性
- 对网段进行 ARP 清点,然后证明 DHCP 可从此机器以及未知 MAC 正常工作
- 对每个邻居的租约执行 DHCPRELEASE —— 协议不要求所有权证明
- 使用伪造的 MAC 洪泛 DISCOVER/REQUEST,直到服务器停止应答
- 地址池耗尽后,按名称(option 50)重新请求已释放的地址
- 针对其占用的地址伪造 RFC 5227 ARP 冲突,观察主机是否交出该地址
- 结论: 之后一个全新客户端还能获得地址吗?
DHCP 释放活动客户端(release)—— 破坏性
- 同样的流程但没有洪泛:清点 → 释放 → 按名称重新请求 → ARP 冲突
- 影响当前已连接的设备;地址池保持不变,因此大多数设备可以重新获取
- 结论: 是否有主机丢失地址且未能获得新地址?
耗尽后 / 重置(release-previous)—— 恢复
- 重放磁盘上的租约日志,归还此工具获取的每一个地址
- 过滤为此接口、网络和 DHCP 服务器;
--max-age丢弃过期条目 - 记录地址池是否已耗尽,但无论如何都会释放日志中的租约
- 结论: 地址池是否再次可用?
查找邻居(active-scan)—— 只读
- ARP 扫描整个范围,发送一个 DHCPINFORM 以识别 DHCP 服务器的指纹
- 不获取地址,不干扰租约
被动扫描(scan)—— 只读,仅 CLI
- 监听 DHCP 和 ARP;通过 option-55 顺序识别主机指纹,否则回退到 MAC 厂商
- 不发送任何内容。持续运行直到被停止
解读运行结果
所有内容都会进入事件日志,最严重者在前:先是发现,然后每个主机一行,最后是 OUTCOME 汇总。Verbosity 0(Web 界面)或 -v0(命令行)会隐藏数据包流量。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 或更高版本。