📚 네트워크 · 패킷 분석 › 01. TCP/IP 구조 이해 — 43편
이전 글: 42. TCP 상태 전이 — LISTEN부터 TIME_WAIT까지 · 다음 글: 44. SYN, SYN/ACK, ACK

1. 개념

TCP Flag(Control Bits)는 TCP 헤더 안의 1비트짜리 스위치 8개로, 이 Segment가 연결에 대해 무엇을 하려는지를 나타냅니다. "연결을 시작하자(SYN)", "받았다(ACK)", "그만 보낸다(FIN)", "당장 끊는다(RST)" 같은 신호입니다.

각 비트의 이름과 위치는 40. TCP와 UDP 헤더 비교 — 신뢰성과 속도의 차이에서 표로 정리했습니다. 이 글은 한 걸음 더 나아가 Flag를 조합으로 읽는 법, 그리고 여러 도구가 같은 Flag를 어떻게 다르게 표기하는지에 집중합니다.

Flag는 헤더의 오프셋 13바이트에 모여 있어서, 8개 비트를 합친 16진수 한 바이트로 표현할 수 있습니다.

비트:   CWR  ECE  URG  ACK  PSH  RST  SYN  FIN
값:    0x80 0x40 0x20 0x10 0x08 0x04 0x02 0x01

예) SYN + ACK = 0x02 + 0x10 = 0x12
    PSH + ACK = 0x08 + 0x10 = 0x18
    FIN + ACK = 0x01 + 0x10 = 0x11

2. 동작 원리

Flag는 양쪽 호스트의 연결 상태(State)를 바꾸는 계기입니다. 상태 전체는 42. TCP 상태 전이 — LISTEN부터 TIME_WAIT까지에서 다뤘고, 여기서는 "어떤 Flag가 어떤 단계에 등장하는가"만 흐름으로 봅니다.

[연결 수립]      SYN ──→  ←── SYN+ACK  ──→ ACK           (44편, 41편)
                  │
                  ↓
[데이터 전송]    PSH+ACK (데이터 포함) ⇄ ACK (확인만)     (46편)
                  │   ※ 수립 이후 거의 모든 Segment에 ACK가 켜져 있음
                  ↓
[정상 종료]      FIN+ACK ──→ ←── ACK, ←── FIN+ACK ──→ ACK  (42편)
                  │
[강제 중단]      RST 또는 RST+ACK (어느 단계에서든)        (45편)

[혼잡 알림(ECN)] SYN에 ECE+CWR로 지원 여부 협상 → 이후 ECE/CWR로 혼잡 통지

이 흐름에서 나오는 판단 규칙이 있습니다.

  • 첫 Segment에는 ACK가 없습니다. 연결을 여는 SYN은 아직 상대 번호를 모르므로 ACK를 켜지 않습니다. 반대로 SYN 없이 ACK만 있는 패킷이 아무 연결도 없는 상대에게 도착하면 RST가 돌아옵니다.
  • SYN과 FIN, SYN과 RST는 정상 흐름에서 한 Segment에 함께 나타나지 않습니다. "시작"과 "끝"을 동시에 말하는 셈이기 때문입니다.
  • PSH는 "데이터가 있다"는 뜻이 아닙니다. 버퍼링하지 말고 애플리케이션에 바로 넘기라는 힌트이며, 데이터가 있는 Segment에 PSH가 없는 경우도 흔합니다. 데이터 유무는 페이로드 길이로 판단합니다.

3. 주요 특징

정상 통신에서 자주 보는 조합입니다.

조합16진수등장 위치의미
SYN0x02연결 시작연결 요청
SYN+ACK0x12연결 시작 응답요청 수락
ACK0x10전 구간확인 응답(데이터 없을 수 있음)
PSH+ACK0x18데이터 전송데이터를 바로 전달
FIN+ACK0x11종료더 보낼 데이터 없음
RST0x04거부·중단즉시 끊음
RST+ACK0x14닫힌 포트 응답 등받은 Segment를 확인하며 거부
SYN+ECE+CWR0xC2연결 시작ECN 지원 협상 (정상)

정상 흐름에 없는 조합과 그 해석입니다. 이런 패킷은 대개 사람이 만든(Crafted) 패킷이며 스캔 도구의 흔적으로 알려져 있습니다.

조합16진수흔히 불리는 이름해석
Flag 없음0x00NULL정상 TCP에는 없음 → 스캔·조작 패킷 가능성
FIN만 (ACK 없음)0x01FIN 스캔연결이 없는데 종료 신호
FIN+PSH+URG0x29Xmas 스캔여러 비트를 "켜 둔" 조작 패킷
SYN+FIN0x03—시작과 종료 동시. 필터 우회·OS 식별 시도 가능성
SYN+RST0x06—정상 흐름에 없음
ACK만 (연결 없음)0x10ACK 스캔방화벽이 상태 기반인지 확인하려는 시도일 수 있음

이러한 스캔 기법별 흔적은 05. 네트워크 스캔 징후 분석 영역(219. Null Scan, 220. XMAS Scan, 221. FIN Scan, 222. ACK Scan)에서 다룹니다.


4. 예시

같은 Flag를 도구마다 다르게 표기하므로, 로그를 오갈 때 변환할 수 있어야 합니다. 아래 표기는 형식 예시(값은 환경마다 다름)입니다.

도구SYN+ACK 표기 예비고
tcpdumpFlags [S.].이 ACK. S SYN, F FIN, R RST, P PSH, U URG, E ECE, W CWR
Wireshark Info 열[SYN, ACK]필터는 tcp.flags == 0x012 (예약 비트까지 3자리로 표시)
Snort·Suricata 룰flags:SA;룰 키워드. 추가 비트 허용 여부를 수식어로 지정
플로우 로그(Suricata flow 등)"tcp_flags": "12" 형태세션 전체 Flag를 OR로 누적한 값인 경우가 많음

실습 예시 — 본인 소유 Linux VM(Rocky/Ubuntu 공통)에서 Flag 조건으로 캡처합니다. 인터페이스 ens33은 예시입니다.

# SYN만 켜진 패킷 (ACK 없음) = 연결 요청
sudo tcpdump -nn -i ens33 'tcp[tcpflags] == tcp-syn'

# Flag 바이트 값으로 직접 비교: PSH+ACK(0x18)
sudo tcpdump -nn -i ens33 'tcp[13] == 0x18'

# 비정상 조합 감시: NULL(0x00) 또는 SYN+FIN이 함께 켜진 패킷
sudo tcpdump -nn -i ens33 'tcp[13] == 0 or tcp[13] & 0x03 == 0x03'

tcpdump 출력 형식 예시:

IP 192.168.10.10.51000 > 192.168.10.20.80: Flags [S], seq 1000, win 64240, length 0
IP 192.168.10.20.80 > 192.168.10.10.51000: Flags [S.], seq 5000, ack 1001, win 65160, length 0
IP 192.168.10.10.51000 > 192.168.10.20.80: Flags [P.], seq 1:78, ack 1, win 502, length 77
IP 192.168.10.10.51000 > 192.168.10.20.80: Flags [F.], seq 78, ack 300, win 501, length 0

플로우 로그의 누적 Flag는 세션 요약에 유용합니다. 예를 들어 누적값이 0x02(SYN만)이면 응답 없는 시도, 0x1b(FIN+SYN+PSH+ACK)이면 데이터가 오간 뒤 정상 종료된 세션일 가능성이 큽니다. Wireshark에서 Flag를 필드 단위로 분석하는 방법은 03. Wireshark 패킷 분석 영역 128. TCP Flag 분석에서 다룹니다.


5. 보안 관점

  • Flag는 출발지가 마음대로 설정할 수 있습니다. 운영체제의 일반 소켓은 규칙대로 Flag를 만들지만, raw 소켓을 쓰는 도구는 어떤 조합이든 만들 수 있습니다. 그래서 비정상 조합은 "도구가 개입했다"는 강한 신호입니다.
  • 닫힌 포트와 열린 포트가 이상한 Flag에 다르게 반응하는 규칙이 스캔 기법의 기반이 됩니다(RFC상 규칙과 OS 구현 차이 포함). 관제 입장에서는 기법 이름보다 "정상 흐름에 없는 조합이 짧은 시간에 여러 포트로 갔다"는 사실이 핵심입니다.
  • 상태 기반 방화벽은 연결 없이 도착한 ACK·FIN 등을 차단하거나 "invalid"로 기록합니다. 상태 비저장(Stateless) 필터는 SYN만 막고 다른 Flag는 통과시키는 경우가 있어 우회 시도 대상이 됩니다.

6. SOC 관점

흔적 위치확인할 수 있는 것
패킷 캡처패킷별 Flag 바이트, 조합의 정상 여부
IDS/IPSflags 조건 시그니처(NULL·Xmas·SYN+FIN 등), 스트림 이상 이벤트
방화벽 로그상태 불일치(invalid, out-of-state) 차단 이벤트 — 명칭은 장비마다 다름
플로우 로그세션 누적 Flag로 성립·종료 방식 요약

관제자가 확인할 질문

  • 이 Flag 조합은 정상 흐름(수립·전송·종료·중단) 중 어디에 해당하는가?
  • 비정상 조합이라면 한 목적지의 여러 포트, 또는 여러 목적지로 반복되었는가?
  • 대상은 어떻게 응답했는가(RST, 무응답)?

오탐 주의: ECN 협상(SYN+ECE+CWR)은 정상입니다. 세션 타임아웃 이후 늦게 도착한 ACK·FIN, 비대칭 경로로 한쪽 방향만 보이는 센서 위치에서는 정상 트래픽도 "연결 없는 ACK"나 out-of-state로 기록될 수 있습니다. 조합 하나보다 반복 패턴으로 판단합니다.


7. 핵심 정리

  • TCP Flag는 헤더 오프셋 13의 8개 비트로, 연결을 시작·확인·종료·중단하는 신호입니다.
  • 한 바이트 16진수로 읽을 수 있으며 SYN 0x02, SYN+ACK 0x12, PSH+ACK 0x18, FIN+ACK 0x11, RST+ACK 0x14가 대표적입니다.
  • tcpdump([S.]), Wireshark(0x012), IDS 룰(flags:SA), 플로우 로그(누적 16진수) 표기를 서로 변환할 수 있어야 합니다.
  • NULL, FIN 단독, FIN+PSH+URG, SYN+FIN처럼 정상 흐름에 없는 조합은 조작 패킷의 흔적입니다.
  • ECN 협상, 늦게 도착한 패킷, 비대칭 센서 위치 같은 오탐 요인을 고려해 반복 패턴으로 판단합니다.
profile
코드에 숨겨진 위협을 읽고 AI로 보안의 미래를 설계합니다. 프론트엔드 개발 경험을 자산 삼아 더 견고하고 지능적인 보안 운영 시스템을 구축해 나가는 과정을 기록합니다

0개의 댓글