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

1. 개념

ACK Scan 은 연결 없이 ACK 플래그만 설정한 패킷을 여러 포트로 보내는 스캔입니다. 다른 TCP 스캔과 목적이 다릅니다. 열린 포트를 찾는 것이 아니라, 중간에 있는 방화벽이 그 포트를 필터링하는지, 상태 추적을 하는지를 알아내는 데 쓰입니다.

그래서 ACK Scan의 흔적은 "우리 방화벽 정책이 외부에서 어떻게 보이는지 조사당했다"는 의미로 해석합니다. TCP 스캔 유형 비교는 216. TCP Port Scan 특징에서 다뤘습니다.

대상 반응스캐너의 판단방어 측 의미
RST 수신unfiltered (패킷이 호스트까지 도달)이 경로에 상태 추적 차단이 없음
무응답 또는 ICMP Unreachablefiltered방화벽이 세션 없는 ACK를 차단

2. 동작 원리

RFC 793에 따르면 호스트는 연결이 없는 상태에서 ACK가 설정된 세그먼트를 받으면, 포트가 열려 있든 닫혀 있든 RST로 응답합니다. 그래서 ACK Scan으로는 열림·닫힘을 구분할 수 없고, RST가 돌아오는지(도달했는지) 만 알 수 있습니다.

스캐너 ── ACK (세션 없음) ──→ [방화벽] ──→ [대상 호스트]
                                │
      ┌─ 상태 추적 방화벽: 세션 테이블에 없음 → 차단(INVALID·세션 없음 로그)
      │     → 스캐너: 무응답 = filtered
      └─ 상태 비저장 필터: "ACK 있으면 응답 패킷으로 간주" 규칙이면 통과
            ↓
        대상: 열림·닫힘 관계없이 RST 응답
            → 스캐너: RST = unfiltered
            ↓
방어 측 흔적: 세션 없는 ACK 차단 로그 다수 / 통과 시 대상의 RST 다수

상태 비저장 필터에서 "ACK가 설정된 인바운드는 응답이므로 허용"하는 규칙은 흔한 설계였고, ACK Scan은 이런 규칙이 남아 있는지를 드러냅니다.


3. 주요 특징

  • 순수 ACK, 데이터 없음: 페이로드 없이 ACK만 설정되고, 확인 번호가 어떤 세션과도 맞지 않습니다.
  • 여러 포트·일정한 간격: 방화벽 규칙을 포트별로 확인하므로 여러 포트에 1회씩 도착합니다.
  • Host Discovery에도 사용: ACK 프로브에 RST가 오면 호스트 생존이 확인되므로 탐색 단계에서도 보입니다(205. Host Discovery).

"세션 없는 ACK 차단" 로그는 스캔 외 원인이 많으므로 구분이 핵심입니다.

원인모양구분 기준
ACK Scan한 출발지 → 여러 포트, 1회씩, 데이터 없음포트 다양성, 과거 세션 없음
세션 타임아웃한 포트, 기존 세션의 연속방화벽 세션 로그에 같은 4-tuple 존재
비대칭 라우팅특정 경로 트래픽이 지속적으로 차단정상 서비스 포트, 양방향 경로 불일치
백스캐터우리 주소를 위조한 공격의 응답(SYN/ACK·RST)SYN/ACK·RST 섞임, 다수 출발지의 서비스 포트에서 옴

4. 예시

실습 예시 — 본인 소유 실습망에서 데이터 없는 순수 ACK 패킷을 확인하는 방어 측 명령입니다(Rocky/Ubuntu 공통, 값은 환경마다 다름).

# ACK만 설정된 패킷(SYN·FIN·RST·PSH 없음)
sudo tcpdump -nn -i ens33 'tcp[13] == 0x10'

# 캡처 파일에서 데이터 없는 ACK의 출발지별 목적지 포트 수
tshark -r /tmp/ack.pcapng -Y 'tcp.flags == 0x010 && tcp.len == 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 | head

정상 연결에도 데이터 없는 ACK는 매우 많으므로, 위 결과는 목적지 포트 수로 판단합니다. 정상 클라이언트는 쓰는 서비스 포트 몇 개에 몰리고, ACK Scan은 수십~수천 개 포트로 퍼집니다.

방화벽 로그 형식 예시(값은 환경마다 다름, 일부 필드 생략):

kernel: FW-INVALID SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=37211 DPT=25 WINDOW=1024 ACK URGP=0
kernel: FW-INVALID SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=37211 DPT=53 WINDOW=1024 ACK URGP=0
kernel: FW-INVALID SRC=203.0.113.45 DST=192.168.10.20 PROTO=TCP SPT=37211 DPT=110 WINDOW=1024 ACK URGP=0
관찰해석
ACK 단독, DPT만 변화세션 없는 ACK로 포트별 필터링 확인
모두 INVALID 차단상태 추적 차단이 동작 → 상대 판단은 filtered
대상의 RST가 캡처된다면차단 없이 도달한 구간 → 정책 점검 대상

5. 보안 관점

  • ACK Scan은 방화벽 정책의 약점을 찾는 정찰입니다. 상태 비저장 규칙이 남은 구간은 이후 다른 비정상 패킷도 통과시킬 수 있습니다.
  • 경계와 내부 구간 모두 세션 없는 패킷을 차단하는지, 그리고 차단 시 로그가 남는지를 정기적으로 점검합니다.
  • 결과로 얻는 것이 "필터링 구조"이므로, ACK Scan 뒤에는 필터링되지 않은 포트를 대상으로 한 SYN 기반 스캔이 이어질 수 있습니다.

6. SOC 관점

흔적 위치확인 내용
방화벽세션 없는 ACK(INVALID) 차단, 목적지 포트 분포
방화벽 세션 로그같은 4-tuple의 과거 세션 여부(타임아웃 구분)
패킷 캡처데이터 없는 순수 ACK, 대상의 RST
IDSACK 스캔·세션 없는 패킷 관련 Alert

관제자가 확인할 질문

  • 세션 없는 ACK가 한 출발지에서 몇 개 포트로 들어왔는가?
  • 차단되지 않고 대상에서 RST가 나간 구간이 있는가?
  • 같은 출발지의 SYN 기반 스캔이 뒤이어 발생했는가?

오탐 주의: 세션 타임아웃, 비대칭 라우팅, 방화벽 재시작 직후의 기존 연결 트래픽이 대량의 세션 없는 ACK 로그를 만듭니다. 위 표의 구분 기준을 먼저 적용하고, 포트가 하나이거나 과거 세션이 있으면 스캔으로 올리지 않습니다.


7. 핵심 정리

  • ACK Scan은 열린 포트가 아니라 방화벽의 필터링·상태 추적 여부를 알아내는 스캔입니다.
  • 호스트는 세션 없는 ACK에 포트 상태와 관계없이 RST로 응답하므로 RST 수신은 unfiltered를 뜻합니다.
  • 상태 추적 방화벽은 세션 없는 ACK를 INVALID로 차단하며, 이 로그가 주요 흔적입니다.
  • 세션 타임아웃·비대칭 라우팅·백스캐터와는 포트 다양성, 과거 세션, 플래그 조합으로 구분합니다.
  • ACK Scan 뒤에는 필터링되지 않은 포트를 노린 후속 스캔이 이어지는지 확인합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글