
DHCPig v2.7.2
scapyネットワークライブラリを使用してPythonで書かれたDHCP枯渇スクリプト
DHCPig
ホワイトハットDHCP堅牢化検証: プールを枯渇させ、隣接ホストのリースを乗っ取り、偽造ARPでホストをアドレスから追い出し、ネットワークがそれを阻止したかどうかを報告します。rootとPython 3.11+が必要です。
Web UIを実行する
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
rootとしてシステムPythonに直接インストールされるため、sudo dhcpig-web は .venv/bin/ のパス操作なしでコマンドを見つけられます。--break-system-packages は、pipがシステムパッケージに触れることを防ぐDebian/Kaliの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を開いてください。3つの注意点:
- いずれにせよrootが必要です (raw socket)。ソース(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オプション55(パラメータ要求リスト)の内容。例: 12,14-19,23(デフォルト: 組み込みのmacOS順プロファイル) |
--no-spoof-eth-src | exhaust のみ。すべてのフレームのEthernetソースとして実際のNIC MACを使用します(Wi-Fi。APは、ソースMACが関連付けられたステーションと一致しないフレームをドロップします) |
-v0 は結果のみを出力します。-v3 はパケットレベルのデバッグを追加します。全フラグのリファレンス: man dhcpig(インストール前は packaging/dhcpig.1)。
各モードの動作
DHCP Exhaustion (exhaust) — 破壊的
- セグメントをARPで調査し、このマシンと未知のMACに対してDHCPが機能することを確認します
- すべての隣接ホストのリースをDHCPRELEASEします — このプロトコルは所有権の証明を必要としません
- サーバーが応答を停止するまで、偽造MACからDISCOVER/REQUESTをフラッディングします
- プールが枯渇したら、解放されたアドレスを名前(オプション50)で再要求します
- 取得したアドレスに対してRFC 5227 ARP競合を偽装し、ホストがアドレスを譲るかどうかを確認します
- 判定: その後、まったく新しいクライアントはアドレスを取得できるでしょうか?
DHCP Release Active Clients (release) — 破壊的
- フラッディングを除いた同じ連鎖: 調査 → 解放 → 名前で再要求 → ARP競合
- 現在接続中のデバイスに作用します。プールはそのまま残るため、ほとんどは再取得できます
- 判定: アドレスを失い、新しいアドレスを取得できなかったホストはありましたか?
Post Exhaustion / Reset (release-previous) — 復旧
- ディスク上のリースジャーナルを再生し、このツールが取得したすべてのアドレスを返却します
- このインターフェース、ネットワーク、DHCPサーバーにフィルタリングされます。
--max-ageで古いエントリを除外します - プールがすでに枯渇していたかどうかを記録しますが、いずれにしてもジャーナル化されたリースは解放します
- 判定: プールは再び使用可能ですか?
Find Neighbors (active-scan) — 読み取り専用
- スコープをARPスイープし、DHCPサーバーのフィンガープリントを得るためにDHCPINFORMを1回送信します
- アドレスを取得せず、リースにも影響を与えません
Passive scan (scan) — 読み取り専用、CLIのみ
- DHCPとARPを監視し、オプション55の順序でホストをフィンガープリントし、フォールバックとしてMACベンダーを使用します
- 何も送信しません。停止するまで実行されます
実行結果を読む
すべてはイベントログに記録され、重大なものから順に表示されます: 検出結果、次にホストごとに1行、最後に OUTCOME の集計です。Verbosity 0(web)または -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以降。