📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 219편
이전 글: 218. ICMP Scan · 다음 글: 220. XMAS Scan

1. 개념

Null Scan 은 TCP 헤더의 플래그를 하나도 설정하지 않은 패킷을 여러 포트에 보내 응답으로 포트 상태를 추정하는 스캔입니다. 정상적인 TCP 통신에서는 모든 세그먼트가 적어도 하나의 플래그(SYN, ACK, RST 등)를 갖기 때문에, 플래그 없는 패킷은 정상 운영체제가 만들지 않는 패킷입니다.

그래서 방어자에게 Null Scan은 판단이 쉬운 편입니다. 이런 패킷이 여러 포트로 들어왔다는 사실 자체가 의도적인 탐색의 강한 근거가 됩니다. TCP 스캔 유형 전체 비교는 216. TCP Port Scan 특징에서 다뤘습니다.

항목내용
보내는 패킷플래그 없음(Flags 값 0x000)
열린 포트무응답(RFC 793에 따라 버림)
닫힌 포트RST/ACK
필터링무응답 또는 ICMP Unreachable
판단 한계무응답이 열림인지 필터링인지 구분 불가 → open|filtered

2. 동작 원리

RFC 793은 LISTEN 상태 포트가 SYN도, ACK도, RST도 없는 세그먼트를 받으면 버리도록 정하고, 닫힌 포트는 RST가 아닌 모든 세그먼트에 RST로 응답하도록 정합니다. Null Scan은 이 차이를 이용합니다.

스캐너 ── TCP (플래그 없음) ──→ [상태 추적 방화벽]
                                   │
                  세션에 속하지 않음 → INVALID 차단·로그 (장비·설정마다 다름)
                                   │ (통과한 경우)
                                   ↓
                              [대상 호스트]
                   ├─ 닫힌 포트 → RST/ACK 전송
                   └─ 열린 포트 → 버림(무응답)
                                   ↓
방어 측 흔적: 플래그 없는 인바운드 TCP / 대상의 RST 다수 / INVALID 로그

운영체제에 따라 결과가 달라집니다. 일부 운영체제(대표적으로 Windows 계열)는 규칙과 달리 포트 상태와 관계없이 RST를 보내는 것으로 알려져 있어, 이 경우 모든 포트가 닫힌 것처럼 보입니다. 이 차이는 역으로 OS 추정 단서가 되기도 합니다(212. OS Detection).


3. 주요 특징

  • 로그에서 플래그 표기가 비어 있음: iptables LOG는 설정된 플래그를 SYN, ACK처럼 줄 끝에 나열하는데, Null 패킷은 이 부분이 비어 있습니다. 로그 파서에서 플래그 필드가 공란으로 나오면 확인 대상입니다.
  • 세션 없는 패킷: 연결 시작(SYN)이 없으므로 상태 추적 방화벽에서는 대부분 차단되고, 상태 비저장 필터(ACL)만 있는 구간에서는 통과할 수 있습니다.
  • 응답이 적음: 열린 포트는 답하지 않으므로, 대상 방향 트래픽은 닫힌 포트의 RST뿐입니다.
기준정상 TCPNull Scan
플래그최소 1개 이상없음
선행 SYN있음없음
방화벽 상태 판정NEW·ESTABLISHEDINVALID
목적지 포트서비스 포트 소수여러 포트

4. 예시

실습 예시 — 본인 소유 실습망에서 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만 변화한 대상의 여러 포트 확인(수직형)

5. 보안 관점

  • Null 패킷은 정상 통신에서 나오지 않으므로, 한 건이라도 여러 포트로 반복되면 의도적 탐색으로 판단할 근거가 충분합니다.
  • 상태 비저장 ACL만 있는 구간(일부 라우터 필터, 내부 구간)에서는 통과할 수 있습니다. 구간별로 INVALID 차단이 적용되는지 점검합니다.
  • 결과가 open|filtered로만 나오는 방식이므로 상대는 보통 다른 방식으로 추가 확인합니다. 같은 출발지의 SYN 기반 스캔이 이어지는지 봅니다.

6. SOC 관점

흔적 위치확인 내용
방화벽INVALID·세션 없는 패킷 차단 로그, 플래그 공란
IDS플래그 없는 TCP 관련 시그니처(룰셋마다 이름 다름)
패킷 캡처tcp.flags == 0x000, 대상의 RST 응답
NDR비정상 플래그 통계

관제자가 확인할 질문

  • 플래그 없는 패킷이 몇 개 포트·몇 개 대상으로 들어왔는가?
  • 방화벽에서 차단되었는가, 대상까지 도달해 RST 응답이 나갔는가?
  • 같은 출발지가 다른 비정상 플래그(FIN, XMAS)나 SYN 스캔도 시도했는가?

오탐 주의: 손상된 패킷이나 일부 장비의 비정상 구현으로 플래그 없는 패킷이 드물게 보일 수 있습니다. 단발성 1건보다 여러 포트에 걸친 반복을 기준으로 판단합니다.


7. 핵심 정리

  • Null Scan은 플래그 없는 TCP 패킷으로 닫힌 포트의 RST와 열린 포트의 무응답 차이를 이용합니다.
  • 플래그 없는 TCP는 정상 운영체제가 만들지 않으므로 여러 포트에 반복되면 강한 탐색 신호입니다.
  • 상태 추적 방화벽에서는 INVALID로 차단되며, iptables 로그의 플래그 표기가 비어 있는 것이 단서입니다.
  • 일부 OS는 포트 상태와 관계없이 RST를 보내 결과가 달라집니다.
  • 차단 여부, 대상 응답, 같은 출발지의 다른 스캔 방식 시도를 함께 확인합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글