ATT&CK: T1595.001 Scanning IP Blocks · Reconnaissance (TA0043)

Active Scanning의 1차 도구. 느리지만 정확하고 결과 포맷이 풍부해서, 대부분의 침투 테스트는 nmap으로 시작한다. 핵심은 “한 번에 다 긁지 말고 단계로 쪼개기”.

1. 호스트 발견

ICMP가 열려있을 때는 평범하게 ping sweep:

nmap -sn 10.0.0.0/24 -oA scans/ping
  • -sn: 포트 스캔 생략, 호스트 up/down만.
  • -oA: .nmap/.xml/.gnmap 세 포맷 동시 저장. 파싱이 편해진다.

ICMP가 차단되어 있으면 TCP SYN으로 몇 개 포트만 노크:

nmap -sn -PS22,80,443,445,3389 10.0.0.0/24

2. 1단계 — 열린 포트만 빠르게 식별

전 포트지만 서비스 식별은 생략해서 속도 확보:

nmap -p- --min-rate 2000 -T4 10.0.0.5 -oA scans/allports
  • -p-: 1–65535 전부.
  • --min-rate 2000: 느린 네트워크에서 체감 시간을 확 줄인다. ISP가 drop 걸면 2000 → 1000 → 500 식으로 낮춰야 결과가 안 빈다.
  • -T4: timing template. -T5는 공격적이지만 패킷 손실 위험.

3. 2단계 — 열린 포트만 깊게

1단계 결과에서 열린 포트만 뽑아서 서비스/버전/스크립트:

ports=$(grep '^[0-9]' scans/allports.gnmap \
          | grep -oE '[0-9]+/open' | cut -d/ -f1 | paste -sd, -)

nmap -sC -sV -p "$ports" 10.0.0.5 -oA scans/detail
  • -sV: 서비스/버전 탐지.
  • -sC: default NSE 스크립트. 흔한 정보(HTTP 타이틀, SSL 인증서, SMB OS 등)를 자동 수집.

4. 자주 쓰는 변형

UDP 스캔 (느림 — 상위 50개로 제한 추천):

nmap -sU --top-ports 50 10.0.0.5

-Pn 폴백 (호스트 발견 단계 생략, firewall이 ping을 다 끊을 때):

nmap -Pn -p 22,80,443,445,3389 --open 10.0.0.0/24

결과를 가볍게 보려면 --open: 열려있는 호스트/포트만 출력.

5. 파싱 팁

이후 단계에서 쓸 소스로 넘기려면 XML 출력(-oX 또는 -oA 포함)이 가장 안정적:

# 호스트+포트 쌍 추출
xmllint --xpath '//host/address/@addr | //host/ports/port[state/@state="open"]/@portid' \
        scans/detail.xml 2>/dev/null

더 편한 건 nmap-parse-output 같은 wrapper나, 그냥 Python xml.etree로 15줄짜리 파서를 쓰는 쪽.

6. OPSEC 메모

  • 기본 TCP SYN은 패킷 특성상 WAF/IDS가 쉽게 “scan” 라벨링한다.
  • 조용히 가야 하면 -T2(polite) + 포트 수 축소 + 소스 IP 분산.
  • NSE discovery 카테고리는 꽤 소란스럽다 — 범위 좁혀서만 사용.

참고