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

nmap으로 /16 전 포트를 돌리면 몇 시간~며칠이 걸린다. masscan은 자체 유저랜드 TCP 스택으로 커널 네트워킹을 거의 거치지 않아 수십 kpps를 뽑는다. 대신 결과 신뢰도가 nmap보다 떨어지므로 “범위 축소용"으로 쓰고, 상세는 nmap에 넘기는 패턴이 정석.

1. 기본 명령

masscan -p1-65535 10.0.0.0/16 --rate 10000 -oG scans/mass.gnmap
  • --rate: 초당 패킷. 네트워크 수용력에 맞춰야 한다. 과하면 ISP가 drop/throttle 걸면서 결과가 조용히 비는 식으로 실패한다.
  • -oG: nmap과 호환되는 grepable 포맷. 다음 단계로 넘기기 편함.
  • 포트는 쉼표/범위 섞어서 지정 가능: -p22,80,443,8000-9000.

2. 소스 포트/MAC 지문 바꾸기

OPSEC: masscan 기본 지문은 꽤 특이해서 IDS가 쉽게 라벨링한다. 흔한 완화책:

masscan 10.0.0.0/16 -p443 \
  --rate 5000 \
  --source-port 40000-40100 \
  --banners
  • --source-port: 소스 포트를 특정 범위로 고정/제한해 상태 추적을 분산.
  • --banners: SYN+ACK 후 간단한 배너 수집 — nmap -sV의 아주 얕은 대체재.

3. 결과 → nmap으로 상세화

masscan은 “어디가 열려있는지"만 안다. 서비스/버전은 nmap으로 넘긴다:

# masscan 결과에서 "IP:PORT" 꺼내기
awk '/open/ {print $4":"$3}' scans/mass.gnmap > scans/targets.txt

# nmap에게 전달 (파일로 호스트 목록, -p로 포트 지정)
cut -d: -f1 scans/targets.txt | sort -u > scans/hosts.txt
ports=$(cut -d: -f2 scans/targets.txt | sort -un | paste -sd, -)
nmap -sC -sV -p "$ports" -iL scans/hosts.txt -oA scans/mass-detail

4. 흔한 함정

  • 방화벽/라우터가 상태 테이블 터짐: 송신 측 라우터가 비싼 상태 추적을 하는 환경에서 --rate 50000 식으로 올리면 로컬에서 먼저 깨진다. 결과가 빈 걸 보기 전에 네트워크 담당자가 먼저 알아챈다.
  • UDP는 신뢰 불가: --udp-ports 옵션은 있지만 UDP 특성상 “응답 없음"과 “포트 열림"을 masscan은 잘 구분 못 함. UDP는 nmap -sU로.
  • 대상이 cloud VPC면 쿼타 걸림: AWS/Azure가 송신 측에서 소스 IP를 자동 차단할 수 있다. VPS 하나로 /16 긁지 말 것.

5. 속도 vs 조용함 트레이드오프 가이드라인

상황 –rate 권장 비고
소규모 /24 테스트 1000 사실 nmap으로 충분
중규모 /20 5000 안정 구간
대규모 /16+ 10000~20000 네트워크 수용력 확인 후
OPSEC 중시 100~500 + 시간 분산 24시간 분할

참고