📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 205편
이전 글: 204. Nmap 기본 사용법 · 다음 글: 206. Ping Scan
Host Discovery(호스트 탐색) 는 IP 대역 안에서 실제로 응답하는 호스트가 어느 것인지 확인하는 정찰 단계입니다. 포트 스캔 전에 대상을 줄이기 위해 수행되며, 관리자의 자산 파악에도 같은 방식이 쓰입니다.
방어자에게 Host Discovery는 정찰의 가장 이른 흔적입니다. 포트 스캔보다 트래픽 양이 적어 놓치기 쉽지만, 한 출발지가 대역 전체에 짧은 요청을 뿌린다는 점에서 구분할 수 있습니다. ICMP Echo만 사용하는 방식은 206. Ping Scan에서 따로 다룹니다.
| 방식 | 사용 계층 | 흔적이 보이는 위치 | 비고 |
|---|---|---|---|
| ARP 요청 | L2 | 같은 LAN의 패킷 캡처, 스위치·NDR | 라우터를 넘지 않음 |
| ICMP Echo / Timestamp | L3 | 방화벽 ICMP 로그, IDS | Type 8 / Type 13 |
| TCP SYN·ACK 프로브 | L4 | 방화벽 로그 | 443·80 같은 흔한 포트 |
| TCP 연결 시도 | L4 | 방화벽·서비스 로그 | 관리자 권한 없을 때 |
| UDP 프로브 | L4 | 방화벽 로그, ICMP Port Unreachable | 닫힌 포트의 응답으로 생존 판단 |
Host Discovery는 응답이 오기만 하면 살아 있다고 판단합니다. 포트가 닫혀 RST가 와도, ICMP 오류가 와도 호스트는 존재한다는 뜻입니다.
탐색 출발지
│
├─ 같은 LAN인가? ── 예 ──→ ARP Request (Broadcast) "who-has 192.168.10.x"
│ ↓
│ ARP Reply 수신 → 살아 있음 (IP 계층 차단과 무관)
│
└─ 원격 대역 ────────→ ICMP Echo(8) / Timestamp(13), TCP SYN(443), TCP ACK(80) 등
↓
Echo Reply(0), Timestamp Reply(14), SYN/ACK, RST 중 하나라도 수신
↓
살아 있음 → 포트 스캔 대상 목록에 추가
모두 무응답 → 없음 또는 모두 차단됨
Nmap의 기본 동작을 예로 들면, 관리자 권한으로 같은 이더넷 LAN을 탐색할 때는 ARP를 사용하고, 원격 대역에는 ICMP Echo, TCP SYN(443), TCP ACK(80), ICMP Timestamp를 함께 보냅니다. 일반 사용자 권한이면 80·443 포트로 TCP 연결을 시도합니다(버전에 따라 다를 수 있음). 방어자 입장에서 이 조합은 한 대상에 ICMP와 TCP가 거의 동시에 도착하는 흔적으로 나타납니다.
| 관찰 지표 | 정상 통신 | Host Discovery |
|---|---|---|
| 한 출발지의 ARP 요청 대상 수 | 게이트웨이·자주 쓰는 서버 몇 개 | 대역의 대부분(수십~수백) |
| 존재하지 않는 IP에 대한 요청 | 드묾 | 많음(응답 없는 ARP·ICMP) |
| 같은 대상에 ICMP+TCP 동시 도착 | 드묾 | 원격 탐색의 전형적 조합 |
| 이후 트래픽 | 서비스 이용 | 응답한 호스트에만 포트 스캔 |
실습 예시 — 본인 소유 실습망에서 ARP 기반 탐색 흔적을 찾는 방어 측 명령입니다(Rocky/Ubuntu 공통, 인터페이스명은 환경마다 다름).
# ARP Request만 캡처 (ARP opcode 1 = Request)
sudo tcpdump -nn -i ens33 'arp[6:2] == 1'
# 저장된 캡처에서 요청자별로 질의한 서로 다른 IP 수 집계
tshark -r /tmp/lan.pcapng -Y 'arp.opcode == 1' -T fields -e arp.src.proto_ipv4 -e arp.dst.proto_ipv4 \
| sort -u | awk '{c[$1]++} END {for (s in c) print c[s], s}' | sort -rn
tcpdump 출력 형식 예시(값은 환경마다 다름):
10:21:04.101 ARP, Request who-has 192.168.10.1 tell 192.168.10.50, length 28
10:21:04.101 ARP, Request who-has 192.168.10.2 tell 192.168.10.50, length 28
10:21:04.102 ARP, Request who-has 192.168.10.3 tell 192.168.10.50, length 28
10:21:04.102 ARP, Request who-has 192.168.10.4 tell 192.168.10.50, length 28
집계 결과 형식 예시:
254 192.168.10.50
3 192.168.10.1
2 192.168.10.15
192.168.10.50이 1초 안에 대역 전체의 ARP를 요청했고, 게이트웨이(192.168.10.1)와 일반 단말은 몇 개만 질의했습니다. Wireshark에서는 arp.opcode == 1 && arp.src.proto_ipv4 == 192.168.10.50 필터로 같은 흐름을 볼 수 있습니다.
📷 [실습 화면 삽입 위치] Wireshark에서
arp.opcode == 1필터 적용 후 Target IP만 1씩 증가하는 ARP Request 목록 화면
| 흔적 위치 | 확인 내용 |
|---|---|
| 패킷 캡처·NDR | 한 출발지의 순차 ARP Request, 응답 없는 IP 비율 |
| 방화벽 | 다수 목적지로의 ICMP Type 8/13, 세션 없는 TCP ACK 차단 |
| IDS | ICMP 스윕·Timestamp 요청 관련 Alert |
| EDR | 탐색을 일으킨 프로세스(스캔 도구, 스크립트) |
관제자가 확인할 질문
오탐 주의: DHCP 서버의 주소 충돌 확인, NAC·자산관리 솔루션, 네트워크 프린터·NAS의 장치 탐색, 게이트웨이의 ARP 갱신, 가상화 호스트는 ARP 요청을 많이 만듭니다. IPv6 환경에서는 ARP 대신 Neighbor Solicitation(ICMPv6)으로 같은 모양이 나타납니다.