호스트 탐색 & 포트 스캔¶
요약
어떤 호스트가 살아 있는지(-sn), 그다음 어떤 포트가 응답하는지(-sS, -sT, -sU)를 찾습니다. 핵심은 Nmap이 붙인 상태를 읽고, 그 사이에 있는 네트워크에 대해 그 상태가 무엇을 말해 주는지 아는 것입니다.
호스트 탐색¶
sudo nmap 10.129.2.0/24 -sn -oA tnet | grep for | cut -d" " -f5
sudo nmap 10.129.2.18 -sn -PE --packet-trace --reason
| 플래그 | 의미 |
|---|---|
-sn |
호스트 탐색만, 포트 스캔 생략 |
-PE |
ICMP Echo 요청 사용 |
-PS/-PA/-PU |
TCP SYN / TCP ACK / UDP 탐색 프로브 |
-Pn |
탐색 생략, 모든 호스트를 살아 있다고 간주 (ICMP가 막혔을 때) |
-n |
DNS 조회 안 함 (빠르고 DNS 로그에 덜 남음) |
--disable-arp-ping |
같은 세그먼트에서는 기본이 ARP인데, 이를 끄고 ICMP를 강제 |
--packet-trace |
패킷 하나하나 표시 |
--reason |
상태를 붙인 이유 표시 (arp-response, syn-ack 등) |
같은 Layer-2 세그먼트에서는 Nmap이 ARP를 우선 쓰며, 호스트 방화벽은 ARP를 막지 못합니다. 출력의 reason: arp-response가 그 신호입니다. 라우터를 넘으면 ICMP echo로 바뀌므로 ICMP를 버리는 호스트는 죽은 것처럼 보입니다. 이때는 -Pn으로 다시 돌립니다.
TTL은 대략적인 OS 힌트입니다. 약 64는 Linux/Unix, 약 128은 Windows, 약 255는 네트워크 장비인 경우가 많습니다.
포트 상태¶
| 상태 | 의미 |
|---|---|
open |
서비스가 연결을 받음 (SYN-ACK) |
closed |
호스트가 RST로 응답 — 도달은 되지만 listen 중인 것이 없음 |
filtered |
응답이 없거나 ICMP 오류 — 방화벽이 답을 가리고 있음 |
unfiltered |
도달은 되지만 open/closed 구분 불가 (ACK 스캔 전용) |
open\|filtered |
응답 없음, 열려 있거나 드롭됨 (UDP, FIN/NULL/Xmas) |
closed\|filtered |
closed와 filtered 구분 불가 (idle 스캔 전용) |
DROP vs REJECT¶
방화벽이 조용히 DROP하면 Nmap은 아무것도 받지 못하고 재시도 끝에 filtered로 표시합니다 (느림). REJECT하는 방화벽은 type 3 code 3(port unreachable) 같은 ICMP 오류나 RST를 보내므로 빠르고, 이것도 filtered/closed로 보입니다. --packet-trace --reason으로 구분할 수 있습니다. no-response면 DROP, port-unreach나 reset이면 REJECT입니다. 필터링이 어디에 있고 스캔 속도를 얼마나 낼 수 있는지 알려 줍니다.
스캔 유형¶
| 스캔 | 플래그 | 동작 | 비고 |
|---|---|---|---|
| SYN ("half-open") | -sS |
SYN → SYN-ACK → RST | root일 때 기본. 핸드셰이크를 끝내지 않음 |
| TCP Connect | -sT |
3-way handshake 완료 | root가 아니면 기본. 애플리케이션 로그에 남음 |
| ACK | -sA |
ACK만 전송 | 방화벽 규칙 파악(filtered vs unfiltered), 열린 포트는 못 찾음 |
| UDP | -sU |
빈 또는 프로토콜별 데이터그램 | ICMP type 3 code 3 = closed, 응답 = open, 무응답 = open\|filtered. 느림 |
$ sudo nmap 10.129.2.28 -p 80 -sS --packet-trace -Pn -n --disable-arp-ping
SENT (0.0429s) TCP 10.10.14.2:63090 > 10.129.2.28:80 S ttl=56 ...
RCVD (0.0573s) TCP 10.129.2.28:80 > 10.10.14.2:63090 SA ttl=64 ...
PORT STATE SERVICE
80/tcp open http
S는 우리가 보낸 SYN, SA는 SYN-ACK이므로 포트가 열려 있습니다. RA가 오면 closed입니다.
UDP는 인내가 필요합니다. 먼저 -sU --top-ports 100을 돌리고, 특정 포트에 -sV를 붙이세요. UDP 서비스는 버전 프로브로만 응답하는 경우가 많습니다.
펜테스터 관점¶
- 전체 TCP(
-p-)를 먼저, 상위 UDP 포트는 그다음, 백그라운드로 돌립니다. - 랩에서는
--min-rate 1000이 괜찮습니다. 고객 운영망에서는 보수적으로, 속도를 합의하고 진행합니다. - 계속
filtered인 포트는 "닫힘"이 아닙니다. 메모해 두고 범위가 허용하면 다른 출발지나 경로에서 재시도하세요.
방어자 관점¶
- SYN 스캔은 Zeek
conn_state에S0/REJ로 남고 애플리케이션 로그에는 닿지 않으므로, 호스트 로그가 놓치는 것을 방화벽과 네트워크 센서가 잡습니다. - Connect 스캔(
-sT)은 서비스 로그에 남습니다 (예: SSH의 "connection closed by ... [preauth]", 웹 접근 로그). - 한 호스트에서 ICMP type 3이 쏟아지면 UDP 스캔에 대한 응답인 경우가 많습니다.