📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 136편
이전 글: 135. DNS Packet 분석 · 다음 글: 137. HTTP Packet 분석
DHCP의 DORA 절차와 임대 갱신은 48. DHCP DORA 과정 — IP를 받는 4단계, DHCP 관련 공격과 탐지 원리는 71. DHCP 위장·고갈 공격의 원리와 탐지에서 다뤘습니다. 이 글은 Wireshark에서 DHCP 패킷의 어느 필드에 무엇이 들어 있고, 그것으로 "누가 누구에게 어떤 주소를 줬는가"를 확인하는 방법만 다룹니다.
Wireshark 3.0부터 해석기 이름이 bootp에서 dhcp로 바뀌었습니다. 오래된 자료의 bootp.* 필터는 dhcp.*로 바꿔 씁니다.
| 영역 | Wireshark 필드 | 읽는 내용 |
|---|---|---|
| 메시지 종류 | dhcp.option.dhcp | 1 Discover, 2 Offer, 3 Request, 4 Decline, 5 ACK, 6 NAK, 7 Release, 8 Inform |
| 방향 | dhcp.type | 1 Boot Request(클라이언트), 2 Boot Reply(서버) |
| 식별 | dhcp.id | Transaction ID, 한 번의 교환을 묶음 |
| 클라이언트 | dhcp.hw.mac_addr, dhcp.ip.client | 클라이언트 MAC, 기존 IP(갱신 시) |
| 할당 주소 | dhcp.ip.your | 서버가 주는 IP (yiaddr) |
| 중계 | dhcp.ip.relay | Relay Agent 주소 (giaddr) |
| 서버 | dhcp.option.dhcp_server_id | 응답한 DHCP 서버 식별 IP |
| 옵션 | dhcp.option.requested_ip_address, dhcp.option.hostname, dhcp.option.vendor_class_id | 요청 IP, 호스트 이름, 클라이언트 종류 |
| 네트워크 설정 | dhcp.option.router, dhcp.option.domain_name_server, dhcp.option.ip_address_lease_time | 게이트웨이, DNS, 임대 시간 |
캡처에서 한 번의 할당 과정을 묶어 읽는 순서입니다.
UDP 68 → 67 (클라이언트 → 서버), 67 → 68 (서버 → 클라이언트)
↓
dhcp.id 가 같은 패킷끼리 묶기
↓
Discover(1) → Offer(2) → Request(3) → ACK(5)
│ │
│ Offer/ACK에서 확인 │
├─ dhcp.ip.your : 줄 주소
├─ dhcp.option.dhcp_server_id : 준 서버
└─ dhcp.option.router / domain_name_server : 넘겨준 게이트웨이·DNS
↓
결과: "MAC X 가 서버 S 로부터 IP Y 를 받음"
0.0.0.0 → 255.255.255.255로 보냅니다. 따라서 IP 주소가 아니라 dhcp.hw.mac_addr로 클라이언트를 식별합니다.dhcp.flags.bc)와 서버 구현에 따라 다릅니다.dhcp.ip.relay에 중계 장비 주소가 채워집니다.메시지 종류별 확인 포인트
| 메시지 | 먼저 볼 필드 | 판단 |
|---|---|---|
| Discover | dhcp.hw.mac_addr, dhcp.option.hostname, dhcp.option.vendor_class_id | 어떤 장치가 새로 접속했는가 |
| Offer | dhcp.option.dhcp_server_id, dhcp.ip.your | 누가 응답했나, 서버가 둘 이상인가 |
| Request | dhcp.option.requested_ip_address, dhcp.option.dhcp_server_id | 여러 Offer 중 어느 서버를 선택했나 |
| ACK | dhcp.ip.your, lease time, router, DNS | 최종 할당 값 |
| NAK | 서버 ID | 요청 거부 (네트워크 이동 시 흔함) |
| Decline | 요청 IP | 받은 주소가 이미 사용 중 (IP 충돌) |
| Release | dhcp.ip.client | 주소 반납 |
자주 쓰는 Display Filter
| 필터 | 용도 |
|---|---|
dhcp.option.dhcp == 2 | 모든 Offer (응답 서버 확인) |
dhcp.option.dhcp == 5 && dhcp.ip.your == 192.168.10.57 | 특정 IP를 할당한 ACK |
dhcp.hw.mac_addr == 00:0c:29:aa:bb:cc | 특정 장치의 전체 DHCP 이력 |
dhcp.option.dhcp == 2 && !(dhcp.option.dhcp_server_id == 192.168.10.1) | 지정 서버(예시 주소) 외의 Offer |
dhcp.option.dhcp == 4 or dhcp.option.dhcp == 6 | Decline·NAK 확인 |
실습 예시 — 본인 소유 VM에서 DHCP 재요청을 유도한 캡처(유도 방법은 48. DHCP DORA 과정 — IP를 받는 4단계 4-3 참고)를 분석합니다. 명령과 출력은 예시(값은 환경마다 다름)입니다.
# 교환별 요약: 메시지 종류, 클라이언트 MAC, 할당 IP, 서버, 호스트 이름
tshark -r /tmp/dhcp.pcapng -Y dhcp -T fields -E header=y \
-e frame.number -e dhcp.id -e dhcp.option.dhcp -e dhcp.hw.mac_addr \
-e dhcp.ip.your -e dhcp.option.dhcp_server_id -e dhcp.option.hostname
# Offer를 보낸 서버 목록 (둘 이상이면 확인 필요)
tshark -r /tmp/dhcp.pcapng -Y 'dhcp.option.dhcp == 2' -T fields \
-e dhcp.option.dhcp_server_id -e eth.src | sort | uniq -c
# ACK로 넘겨준 게이트웨이·DNS
tshark -r /tmp/dhcp.pcapng -Y 'dhcp.option.dhcp == 5' -T fields \
-e dhcp.ip.your -e dhcp.option.router -e dhcp.option.domain_name_server -e dhcp.option.ip_address_lease_time
첫 번째 명령의 형식 예시입니다.
frame.number dhcp.id dhcp.option.dhcp dhcp.hw.mac_addr dhcp.ip.your server_id hostname
1 0x5d3a91c2 1 00:0c:29:aa:bb:cc 0.0.0.0 lab-rocky
2 0x5d3a91c2 2 00:0c:29:aa:bb:cc 192.168.10.57 192.168.10.1
3 0x5d3a91c2 3 00:0c:29:aa:bb:cc 0.0.0.0 192.168.10.1 lab-rocky
4 0x5d3a91c2 5 00:0c:29:aa:bb:cc 192.168.10.57 192.168.10.1
| 확인 포인트 | 읽는 법 |
|---|---|
같은 dhcp.id | 네 패킷이 한 번의 할당 과정 |
| Request의 server_id | 클라이언트가 192.168.10.1의 Offer를 선택 |
ACK의 dhcp.ip.your | 최종 할당 IP 192.168.10.57 |
📷 [실습 화면 삽입 위치] DHCP ACK 패킷 Details에서 Your (client) IP address와 Option(53) Message Type, Option(54) Server Identifier, Option(3) Router, Option(6) DNS를 펼친 화면
| 관찰 | 가능한 해석 | 확인할 것 |
|---|---|---|
| Offer의 서버 ID·출발지 MAC이 둘 이상 | 비인가 DHCP 서버 (오설정 장비 또는 공격) | 두 번째 서버의 MAC 제조사, 연결 스위치 포트 |
| ACK가 넘겨준 router·DNS가 표준 값과 다름 | 트래픽 우회 목적의 설정 배포 가능성 | 해당 ACK를 보낸 서버 |
| 짧은 시간 서로 다른 MAC의 Discover 폭증 | 주소 풀 고갈 시도 (71. DHCP 위장·고갈 공격의 원리와 탐지) | MAC 패턴, 유입 포트 |
| 알 수 없는 hostname·vendor class | 미등록 장치 접속 | 자산 목록 대조 |
| Decline 반복 | IP 충돌, 정적 IP 무단 사용 | 해당 IP의 ARP 응답 MAC (114. ARP 패킷 필드 분석 — opcode와 Sender·Target 필드로 IP-MAC 매핑 검증하기) |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | 메시지 전체, 모든 서버의 Offer |
| DHCP 서버 로그·임대 DB | 특정 시각에 IP를 받은 MAC·호스트 이름 |
| 스위치 | DHCP Snooping 위반 로그(설정 시), 포트별 MAC |
관제자가 확인할 질문
오탐 주의: 가정용 공유기·테스트 장비가 연결되어 의도치 않게 DHCP 서버로 동작하는 경우가 흔합니다. 또 IP는 임대 만료 후 다른 장치에 재할당되므로, IP만으로 장치를 특정하지 말고 반드시 시각 기준으로 임대 기록을 조회합니다.
dhcp.*이며, 메시지 종류는 dhcp.option.dhcp(1~8)로 구분합니다.dhcp.hw.mac_addr로 식별합니다.dhcp.id로 한 번의 교환을 묶고, ACK의 dhcp.ip.your와 dhcp.option.dhcp_server_id로 "누가 무엇을 줬는가"를 확인합니다.