📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 210편
이전 글: 209. UDP Scan · 다음 글: 211. Service Detection
Port Range Scan 은 대상 호스트의 정해진 포트 구간(예: 1~1024)을 확인하는 스캔입니다. 스캔을 탐지한 관제자에게 포트 범위가 중요한 이유는, 범위가 곧 상대가 무엇을 알아냈을 수 있는지와 어떤 서비스에 관심이 있는지를 알려주기 때문입니다.
이 글은 로그에서 스캔 범위를 복원하고 해석하는 방법을 다룹니다. 소수 포트만 노린 경우는 214. 특정 Port Scan, 0~65535 전체를 다룬 경우는 215. 전체 Port Scan에서 따로 다룹니다. 포트 번호 체계 자체는 02 영역(55. Dynamic Port 등)에서 다뤘습니다.
| IANA 구간 | 범위 | 스캔 범위 해석 |
|---|---|---|
| Well-known | 0~1023 | 표준 서비스(SSH, HTTP, SMB 등) 존재 확인 |
| Registered | 1024~49151 | DB, 원격관리, 애플리케이션 서버까지 확인 |
| Dynamic/Private | 49152~65535 | 비표준 포트에 숨긴 서비스, 백도어 포트까지 확인 |
스캔 도구는 사용자가 지정한 범위나 도구의 기본 목록을 대상으로 포트를 순서대로 또는 섞어서 확인합니다. 방어자는 거꾸로 로그의 목적지 포트 집합으로 범위를 복원합니다.
방화벽·IDS 로그에서 한 출발지 → 한 목적지 이벤트 추출
↓
목적지 포트 집합 계산: 최소값, 최대값, 서로 다른 포트 수, 소요 시간
↓
분포 모양 판단
├─ 최소~최대가 촘촘히 채워짐 → 연속 범위 스캔 (예: 1~1024)
├─ 약 1,000개가 넓게 흩어짐, 잘 알려진 포트 위주 → 도구 기본 "자주 쓰는 포트" 목록
├─ 65,000개 이상 → 전체 범위 스캔 (215편)
└─ 수 개~수십 개의 특정 포트 → 특정 서비스 탐색 (214편)
↓
열림 응답(SYN/ACK, 허용 세션)이 있었던 포트 확인 → 노출 정보 평가
Nmap 같은 도구는 범위를 지정하지 않으면 프로토콜별로 자주 쓰이는 포트 1,000개를 확인합니다(203. Nmap이란 무엇인가). 그래서 실무 로그에서는 1~65535 중 약 1,000개가 비연속적으로 흩어진 모양이 자주 보이며, 이를 "1~1024 연속 범위"와 구분할 수 있어야 합니다.
| 분포 모양 | 로그 특징 | 관심 대상 추정 |
|---|---|---|
| 1~1024 연속 | 최소 1, 최대 1024 근처, 거의 빈틈 없음 | 표준 서비스 |
| 상위 포트 목록 | 개수 약 1,000, 최대값이 수만 대, 3389·5900·8080 등 포함 | 일반적인 노출 서비스 전반 |
| 특정 구간 | 예: 8000~8100, 3300~3400만 | 웹 애플리케이션, 특정 DB |
| 전체 범위 | 서로 다른 포트 수가 65,000 이상 | 비표준 포트 서비스까지 전수 조사 |
실습 예시 — 본인 소유 실습망의 방화벽(iptables LOG) 로그에서 한 출발지·목적지 쌍의 스캔 범위를 복원하는 방어 측 명령입니다. Rocky는 /var/log/messages, Ubuntu는 /var/log/kern.log에 기록되며, 값은 환경마다 다릅니다.
SRC=203.0.113.45; DST=192.168.10.20
sudo grep "SRC=$SRC DST=$DST" /var/log/kern.log \
| grep -o 'DPT=[0-9]*' | cut -d= -f2 | sort -n | uniq \
| awk 'NR==1{min=$1} {max=$1; n++} END {print "min="min, "max="max, "distinct="n}'
# 첫 이벤트와 마지막 이벤트 시각(소요 시간)
sudo grep "SRC=$SRC DST=$DST" /var/log/kern.log | sed -n '1p;$p' | awk '{print $1, $2, $3}'
결과 형식 예시 두 가지(값은 환경마다 다름):
[사례 A] min=1 max=1024 distinct=1019 소요 약 3초
[사례 B] min=1 max=65389 distinct=997 소요 약 5초
| 사례 | 해석 |
|---|---|
| A | 1~1024가 거의 빈틈없이 채워짐 → 연속 범위 스캔, 몇 개 포트는 허용 정책이라 차단 로그에서 빠졌을 가능성 |
| B | 최대값이 크지만 개수는 약 1,000 → 전체 범위가 아니라 도구 기본의 자주 쓰는 포트 목록 |
사례 A에서 빠진 포트(1~1024 중 로그에 없는 번호)를 허용 세션 로그와 대조하면, 방화벽이 허용해서 대상까지 도달한 포트, 즉 상대가 open 여부를 확인할 수 있었던 포트를 찾을 수 있습니다.
| 흔적 위치 | 범위 복원에 쓰는 정보 |
|---|---|
| 방화벽 차단 로그 | 차단된 목적지 포트 집합 |
| 방화벽 허용 세션 로그 | 대상까지 도달한 포트 (차단 로그에서 빠진 부분) |
| IDS 스캔 Alert | 임계치 도달 시점과 대표 포트, 세부는 원본 로그로 확인 |
| 패킷 캡처 | SYN/ACK를 보낸 포트 = 열림으로 확인된 포트 |
관제자가 확인할 질문
오탐 주의: P2P·게임·VoIP 프로그램은 넓은 범위의 동적 포트로 연결을 시도해 범위 스캔처럼 보일 수 있습니다. 이 경우 목적지가 다수의 외부 주소이고 실제 데이터가 오간다는 점이 다릅니다. 방화벽 NAT 환경에서는 목적지가 아니라 출발지 포트가 넓게 분포하는 것이 정상이므로 필드를 혼동하지 않습니다.