
DHCPig v2.7.2
scapy 네트워크 라이브러리를 사용하여 Python으로 작성된 DHCP 고갈 스크립트
DHCPig
화이트햇 DHCP 강화 검증: 풀(pool)을 고갈시키고, 이웃의 임대(lease)를 가로채고, 위조된 ARP로 호스트를 해당 주소에서 축출하며, 네트워크가 이를 차단했는지 보고합니다. root 권한과 Python 3.11+가 필요합니다.
웹 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을 여세요. 주의할 점 세 가지:
- 어느 쪽이든 root가 필요합니다 (raw socket 사용). 소스(venv)에서 실행할 때는 전체
.venv/bin/경로를 사용하세요 —sudo는PATH를 재설정합니다. ?token=은 필수입니다. 없으면 401 오류와 빈 페이지가 표시됩니다.- 헤드리스(headless) 환경인가요? 의도적으로 loopback에 바인딩합니다. 재바인딩하지 말고 포워딩하세요:
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
| 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 대신 이 MAC을 사용함 (반복 가능 — 목록을 순환) |
--request-option SPEC | exhaust/active-scan; 전송할 DHCP option-55(parameter-request-list) 내용, 예: 12,14-19,23 (기본값: 내장된 macOS 순서 프로필) |
--no-spoof-eth-src | exhaust 전용; 모든 프레임의 Ethernet 소스로 실제 NIC MAC을 사용함 (Wi-Fi; AP는 연결된 스테이션의 MAC이 아닌 소스 MAC의 프레임을 버림) |
-v0는 결과만 출력하고, -v3는 패킷 수준 디버그를 추가합니다. 전체 플래그 참조: man dhcpig
(또는 설치 전에는 packaging/dhcpig.1).
각 모드가 수행하는 작업
DHCP 고갈 (exhaust) — 파괴적
- 세그먼트를 ARP로 인벤토리한 다음, 이 머신과 알 수 없는 MAC에 대해 DHCP가 작동함을 증명
- 모든 이웃의 임대를 DHCPRELEASE — 프로토콜은 소유권 증명을 요구하지 않음
- 서버가 응답을 멈출 때까지 위조된 MAC으로 DISCOVER/REQUEST를 플러딩
- 풀이 고갈되면 해제된 주소를 이름(option 50)으로 재요청
- 호스트가 주소를 포기하는지 확인하기 위해, 가져간 주소에 대해 RFC 5227 ARP 충돌을 위조
- 결과 판정: 이후에 완전히 새로운 클라이언트가 여전히 주소를 받을 수 있었나?
활성 클라이언트 DHCP 해제 (release) — 파괴적
- 플러딩이 없는 동일한 체인: 인벤토리 → 해제 → 이름으로 재요청 → ARP 충돌
- 지금 연결된 장치를 대상으로 함; 풀은 그대로 유지되므로 대부분이 다시 획득 가능
- 결과 판정: 주소를 잃고 새 주소를 얻지 못한 호스트가 있었나?
고갈 후 / 리셋 (release-previous) — 복구
- 디스크의 임대 저널을 재생하여 이 도구가 가져간 모든 주소를 반환
- 이 인터페이스, 네트워크 및 DHCP 서버로 필터링됨;
--max-age는 오래된 항목을 제거 - 풀이 이미 고갈되었는지 기록하지만, 어느 쪽이든 저널링된 임대를 해제
- 결과 판정: 풀을 다시 사용할 수 있나?
이웃 찾기 (active-scan) — 읽기 전용
- 범위를 ARP 스캔하고, DHCP 서버를 핑거프린팅하기 위해 DHCPINFORM 하나를 전송
- 주소를 가져가지 않고, 임대를 방해하지 않음
수동 스캔 (scan) — 읽기 전용, CLI 전용
- DHCP와 ARP를 관찰; option-55 순서로 호스트를 핑거프린팅하고, 실패 시 MAC 벤더로 대체
- 아무것도 전송하지 않음. 중지할 때까지 실행
실행 결과 읽기
모든 것은 이벤트 로그에 심각도 순으로 기록됩니다: 발견 사항, 그다음 호스트별 한 줄, 마지막으로 OUTCOME 요약. Verbosity 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 이상.