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

1. 개념

FIN Scan 은 연결 종료를 뜻하는 FIN 플래그만 설정한 패킷을 여러 포트로 보내는 스캔입니다. 원리는 Null·XMAS와 같아서 닫힌 포트는 RST로 응답하고 열린 포트는 버립니다(216. TCP Port Scan 특징).

FIN Scan이 Null·XMAS보다 관제자에게 까다로운 이유는 FIN이 정상 통신에서도 매우 흔한 플래그라는 점입니다. 모든 TCP 연결은 FIN으로 끝나므로, "FIN이 보인다"만으로는 판단할 수 없고 ACK 유무와 선행 세션을 봐야 합니다.

구분정상 연결 종료FIN Scan
플래그FIN + ACKFIN만 (0x001)
선행 세션같은 4-tuple의 Handshake·데이터없음
목적지 포트사용 중인 서비스 포트 하나여러 포트
상대 응답ACK, 이어서 FIN/ACK닫힌 포트 RST/ACK, 열린 포트 무응답

2. 동작 원리

TCP 규칙상 연결이 수립된 뒤에는 모든 세그먼트에 ACK가 설정됩니다. 따라서 ACK 없이 FIN만 있는 패킷은 연결 맥락이 없는 패킷이며, 정상 운영체제의 종료 과정에서는 나오지 않습니다.

[정상 종료]
 클라이언트 ── FIN/ACK ──→ 서버      (같은 세션의 데이터 교환 뒤)
 클라이언트 ←── ACK, FIN/ACK ── 서버
 클라이언트 ── ACK ──→ 서버

[FIN Scan]
 스캐너 ── FIN (ACK 없음) ──→ 대상:23    대상 → RST/ACK (닫힘)
 스캐너 ── FIN (ACK 없음) ──→ 대상:22    대상 → 무응답 (열림 또는 필터링)
        ↓
방어 측 판별: ACK 플래그 없음 + 선행 세션 없음 + 여러 포트 → FIN Scan

3. 주요 특징

  • 판별 핵심은 ACK 비트: 정상 FIN은 거의 항상 FIN/ACK입니다. 필터를 tcp.flags.fin == 1만 걸면 정상 종료가 대량으로 섞이므로 반드시 tcp.flags.ack == 0을 함께 겁니다.
  • 상태 추적 방화벽의 처리: 세션 없는 FIN은 INVALID 또는 "세션 없음"으로 차단되는 경우가 많습니다(장비·설정마다 다름). 이때 정상 연결의 늦은 FIN/ACK도 같은 차단 로그를 만들 수 있어 오탐 원인이 됩니다.
  • 결과 판단 한계: 무응답은 open|filtered이며, 일부 OS는 포트 상태와 관계없이 RST를 보냅니다.

늦게 도착한 정상 FIN과 FIN Scan은 다음 기준으로 구분합니다.

기준세션 만료 후 늦은 정상 FINFIN Scan
ACK 플래그있음(FIN/ACK)없음
같은 4-tuple의 과거 세션방화벽 세션 로그에 있음없음
목적지 포트이전에 쓰던 포트 하나여러 포트
발생 시점세션 타임아웃 직후스캔 시간대에 집중

4. 예시

실습 예시 — 본인 소유 실습망에서 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 재사용도구가 출발지 포트를 고정한 모양(도구·설정에 따라 다름)

5. 보안 관점

  • FIN Scan 결과는 제한적이지만, 비정상 패킷을 쓴다는 점에서 의도적 탐색입니다. 같은 출발지의 다른 방식 시도와 묶어 판단합니다.
  • 상태 비저장 필터 구간에서는 SYN만 막는 규칙을 FIN이 통과할 수 있습니다. "SYN 차단 = 스캔 차단"이 아니라는 점을 정책 점검에 반영합니다.
  • 방화벽 세션 타임아웃이 서비스 특성보다 짧으면 정상 종료가 세션 없음으로 차단되어 로그가 늘어납니다. 오탐을 줄이려면 타임아웃 설정도 함께 검토합니다.

6. SOC 관점

흔적 위치확인 내용
방화벽INVALID·세션 없음 차단, 로그의 플래그 표기(FIN 단독 여부)
방화벽 세션 로그같은 4-tuple의 과거 세션 존재 여부
패킷 캡처ACK 비트, 대상의 RST 응답
IDSFIN 단독 패킷 관련 시그니처(룰셋마다 이름 다름)

관제자가 확인할 질문

  • FIN 패킷에 ACK가 없는가? 여러 포트로 반복되는가?
  • 같은 출발지·목적지 조합의 과거 정상 세션이 있었는가?
  • 같은 출발지의 SYN·Null·XMAS 방식 시도가 함께 있는가?

오탐 주의: "세션 없는 FIN 차단" 로그의 상당수는 타임아웃·비대칭 라우팅·장비 재시작으로 인한 정상 연결의 흔적입니다. ACK 유무와 포트 수를 먼저 보고, ACK가 있는 단일 포트 이벤트는 스캔으로 올리지 않습니다.


7. 핵심 정리

  • FIN Scan은 ACK 없는 FIN 패킷으로 닫힌 포트의 RST와 열린 포트의 무응답 차이를 이용합니다.
  • FIN은 정상 종료에도 흔하므로 판별 핵심은 ACK 유무, 선행 세션, 목적지 포트 수입니다.
  • tcpdump·Wireshark 필터는 반드시 FIN과 함께 ACK 없음 조건을 겁니다.
  • 세션 만료 후 늦게 도착한 정상 FIN/ACK는 대표적 오탐이므로 과거 세션 로그로 확인합니다.
  • 상태 비저장 필터 구간에서는 SYN 차단만으로 FIN 탐색을 막지 못합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글