📚 네트워크 · 패킷 분석 › 05. 네트워크 스캔 징후 분석 — 221편
이전 글: 220. XMAS Scan · 다음 글: 222. ACK Scan
FIN Scan 은 연결 종료를 뜻하는 FIN 플래그만 설정한 패킷을 여러 포트로 보내는 스캔입니다. 원리는 Null·XMAS와 같아서 닫힌 포트는 RST로 응답하고 열린 포트는 버립니다(216. TCP Port Scan 특징).
FIN Scan이 Null·XMAS보다 관제자에게 까다로운 이유는 FIN이 정상 통신에서도 매우 흔한 플래그라는 점입니다. 모든 TCP 연결은 FIN으로 끝나므로, "FIN이 보인다"만으로는 판단할 수 없고 ACK 유무와 선행 세션을 봐야 합니다.
| 구분 | 정상 연결 종료 | FIN Scan |
|---|---|---|
| 플래그 | FIN + ACK | FIN만 (0x001) |
| 선행 세션 | 같은 4-tuple의 Handshake·데이터 | 없음 |
| 목적지 포트 | 사용 중인 서비스 포트 하나 | 여러 포트 |
| 상대 응답 | ACK, 이어서 FIN/ACK | 닫힌 포트 RST/ACK, 열린 포트 무응답 |
TCP 규칙상 연결이 수립된 뒤에는 모든 세그먼트에 ACK가 설정됩니다. 따라서 ACK 없이 FIN만 있는 패킷은 연결 맥락이 없는 패킷이며, 정상 운영체제의 종료 과정에서는 나오지 않습니다.
[정상 종료]
클라이언트 ── FIN/ACK ──→ 서버 (같은 세션의 데이터 교환 뒤)
클라이언트 ←── ACK, FIN/ACK ── 서버
클라이언트 ── ACK ──→ 서버
[FIN Scan]
스캐너 ── FIN (ACK 없음) ──→ 대상:23 대상 → RST/ACK (닫힘)
스캐너 ── FIN (ACK 없음) ──→ 대상:22 대상 → 무응답 (열림 또는 필터링)
↓
방어 측 판별: ACK 플래그 없음 + 선행 세션 없음 + 여러 포트 → FIN Scan
tcp.flags.fin == 1만 걸면 정상 종료가 대량으로 섞이므로 반드시 tcp.flags.ack == 0을 함께 겁니다.늦게 도착한 정상 FIN과 FIN Scan은 다음 기준으로 구분합니다.
| 기준 | 세션 만료 후 늦은 정상 FIN | FIN Scan |
|---|---|---|
| ACK 플래그 | 있음(FIN/ACK) | 없음 |
| 같은 4-tuple의 과거 세션 | 방화벽 세션 로그에 있음 | 없음 |
| 목적지 포트 | 이전에 쓰던 포트 하나 | 여러 포트 |
| 발생 시점 | 세션 타임아웃 직후 | 스캔 시간대에 집중 |
실습 예시 — 본인 소유 실습망에서 ACK 없는 FIN만 골라내는 방어 측 명령입니다(Rocky/Ubuntu 공통, 값은 환경마다 다름).
# FIN만 설정되고 ACK가 없는 패킷
sudo tcpdump -nn -i ens33 'tcp[tcpflags] & (tcp-fin|tcp-ack) == tcp-fin'
# 캡처 파일에서 ACK 없는 FIN의 출발지별 목적지 포트 수
tshark -r /tmp/fin.pcapng -Y 'tcp.flags.fin == 1 && tcp.flags.ack == 0' \
-T fields -e ip.src -e tcp.dstport | sort -u \
| awk '{c[$1]++} END {for (s in c) print c[s], s}' | sort -rn
방화벽 로그 형식 예시(값은 환경마다 다름, 일부 필드 생략):
kernel: FW-INVALID SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=55310 DPT=110 WINDOW=1024 FIN URGP=0
kernel: FW-INVALID SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=55310 DPT=143 WINDOW=1024 FIN URGP=0
kernel: FW-INVALID SRC=198.51.100.7 DST=192.168.10.20 PROTO=TCP SPT=50811 DPT=443 WINDOW=501 ACK FIN URGP=0
| 관찰 | 해석 |
|---|---|
203.0.113.45: FIN만, DPT 변화 | ACK 없는 FIN, 여러 포트 → FIN Scan 형태 |
198.51.100.7: ACK FIN, 443 하나 | 세션 만료 뒤 늦은 정상 종료 가능성 → 과거 세션 확인 |
| 같은 SPT 재사용 | 도구가 출발지 포트를 고정한 모양(도구·설정에 따라 다름) |
| 흔적 위치 | 확인 내용 |
|---|---|
| 방화벽 | INVALID·세션 없음 차단, 로그의 플래그 표기(FIN 단독 여부) |
| 방화벽 세션 로그 | 같은 4-tuple의 과거 세션 존재 여부 |
| 패킷 캡처 | ACK 비트, 대상의 RST 응답 |
| IDS | FIN 단독 패킷 관련 시그니처(룰셋마다 이름 다름) |
관제자가 확인할 질문
오탐 주의: "세션 없는 FIN 차단" 로그의 상당수는 타임아웃·비대칭 라우팅·장비 재시작으로 인한 정상 연결의 흔적입니다. ACK 유무와 포트 수를 먼저 보고, ACK가 있는 단일 포트 이벤트는 스캔으로 올리지 않습니다.