📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 219편
이전 글: 218. ICMP Scan · 다음 글: 220. XMAS Scan
Null Scan 은 TCP 헤더의 플래그를 하나도 설정하지 않은 패킷을 여러 포트에 보내 응답으로 포트 상태를 추정하는 스캔입니다. 정상적인 TCP 통신에서는 모든 세그먼트가 적어도 하나의 플래그(SYN, ACK, RST 등)를 갖기 때문에, 플래그 없는 패킷은 정상 운영체제가 만들지 않는 패킷입니다.
그래서 방어자에게 Null Scan은 판단이 쉬운 편입니다. 이런 패킷이 여러 포트로 들어왔다는 사실 자체가 의도적인 탐색의 강한 근거가 됩니다. TCP 스캔 유형 전체 비교는 216. TCP Port Scan 특징에서 다뤘습니다.
| 항목 | 내용 |
|---|---|
| 보내는 패킷 | 플래그 없음(Flags 값 0x000) |
| 열린 포트 | 무응답(RFC 793에 따라 버림) |
| 닫힌 포트 | RST/ACK |
| 필터링 | 무응답 또는 ICMP Unreachable |
| 판단 한계 | 무응답이 열림인지 필터링인지 구분 불가 → open|filtered |
RFC 793은 LISTEN 상태 포트가 SYN도, ACK도, RST도 없는 세그먼트를 받으면 버리도록 정하고, 닫힌 포트는 RST가 아닌 모든 세그먼트에 RST로 응답하도록 정합니다. Null Scan은 이 차이를 이용합니다.
스캐너 ── TCP (플래그 없음) ──→ [상태 추적 방화벽]
│
세션에 속하지 않음 → INVALID 차단·로그 (장비·설정마다 다름)
│ (통과한 경우)
↓
[대상 호스트]
├─ 닫힌 포트 → RST/ACK 전송
└─ 열린 포트 → 버림(무응답)
↓
방어 측 흔적: 플래그 없는 인바운드 TCP / 대상의 RST 다수 / INVALID 로그
운영체제에 따라 결과가 달라집니다. 일부 운영체제(대표적으로 Windows 계열)는 규칙과 달리 포트 상태와 관계없이 RST를 보내는 것으로 알려져 있어, 이 경우 모든 포트가 닫힌 것처럼 보입니다. 이 차이는 역으로 OS 추정 단서가 되기도 합니다(212. OS Detection).
SYN, ACK처럼 줄 끝에 나열하는데, Null 패킷은 이 부분이 비어 있습니다. 로그 파서에서 플래그 필드가 공란으로 나오면 확인 대상입니다.| 기준 | 정상 TCP | Null Scan |
|---|---|---|
| 플래그 | 최소 1개 이상 | 없음 |
| 선행 SYN | 있음 | 없음 |
| 방화벽 상태 판정 | NEW·ESTABLISHED | INVALID |
| 목적지 포트 | 서비스 포트 소수 | 여러 포트 |
실습 예시 — 본인 소유 실습망에서 Null 패킷을 탐지·기록하는 방어 측 명령과 설정입니다(값은 환경마다 다름).
# 플래그 없는 TCP 패킷 캡처 (Rocky/Ubuntu 공통)
sudo tcpdump -nn -i ens33 'tcp[tcpflags] == 0'
# Wireshark 디스플레이 필터
# tcp.flags == 0x000
# 세션에 속하지 않는 패킷을 기록 후 차단 (iptables 예시, 순서·정책은 환경에 맞게)
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j LOG --log-prefix "FW-INVALID "
sudo iptables -A INPUT -m conntrack --ctstate INVALID -j DROP
nftables를 쓰는 환경(Rocky 기본)에서는 ct state invalid log prefix "FW-INVALID " drop 형태로 같은 목적을 표현할 수 있습니다.
방화벽 로그 형식 예시(값은 환경마다 다름, 일부 필드 생략):
kernel: FW-INVALID IN=ens33 SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=48211 DPT=21 WINDOW=1024 RES=0x00 URGP=0
kernel: FW-INVALID IN=ens33 SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=48211 DPT=22 WINDOW=1024 RES=0x00 URGP=0
kernel: FW-INVALID IN=ens33 SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=48211 DPT=80 WINDOW=1024 RES=0x00 URGP=0
| 관찰 | 해석 |
|---|---|
URGP=0 뒤에 플래그 표기 없음 | 플래그 없는 TCP → Null 패킷 |
| INVALID 접두어 | 세션에 속하지 않아 상태 판정 실패 |
| 같은 SPT, DPT만 변화 | 한 대상의 여러 포트 확인(수직형) |
| 흔적 위치 | 확인 내용 |
|---|---|
| 방화벽 | INVALID·세션 없는 패킷 차단 로그, 플래그 공란 |
| IDS | 플래그 없는 TCP 관련 시그니처(룰셋마다 이름 다름) |
| 패킷 캡처 | tcp.flags == 0x000, 대상의 RST 응답 |
| NDR | 비정상 플래그 통계 |
관제자가 확인할 질문
오탐 주의: 손상된 패킷이나 일부 장비의 비정상 구현으로 플래그 없는 패킷이 드물게 보일 수 있습니다. 단발성 1건보다 여러 포트에 걸친 반복을 기준으로 판단합니다.