📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 143편
이전 글: 142. Port Scan Packet 분석 · 다음 글: 144. DNS 악용 유형 — 터널링·DGA·비정상 질의 탐지
SYN 스캔(Half-open 스캔)은 SYN을 보내고 응답만 확인한 뒤 연결을 완성하지 않는 방식입니다. 포트 스캔 전반의 패킷 모양은 142. Port Scan Packet 분석, SYN 스캔이 정찰에서 쓰이는 이유와 공격자 관점은 208. SYN Scan에서 다룹니다. 이 글은 SYN 스캔 패킷 자체의 모양과 식별 필드만 다룹니다.
| 구분 | SYN 스캔 | Connect 스캔 |
|---|---|---|
| 필요 권한 | Raw 패킷 생성 권한 (보통 root) | 일반 사용자 |
| 열린 포트에서 | SYN → SYN/ACK → RST | SYN → SYN/ACK → ACK → 곧바로 종료 |
| 연결 완료 여부 | 미완료 (Half-open) | 완료 |
| 대상 서비스 로그 | 대부분 남지 않음 | 짧은 연결로 남을 수 있음 |
열린 포트에서 SYN/ACK를 받은 스캐너 쪽 운영체제는 자신이 연 적 없는 연결에 대한 응답이므로 RST를 보냅니다. 그래서 Handshake의 세 번째 패킷 자리에 ACK 대신 RST가 옵니다.
[열림] 192.168.10.50:43210 ── SYN ─────────→ 192.168.10.30:22
192.168.10.50:43210 ←── SYN/ACK ───── 192.168.10.30:22
192.168.10.50:43210 ── RST ─────────→ 192.168.10.30:22 ← ACK 없이 RST
[닫힘] 192.168.10.50:43210 ── SYN ─────────→ 192.168.10.30:23
192.168.10.50:43210 ←── RST/ACK ───── 192.168.10.30:23
[필터링] 192.168.10.50:43210 ── SYN ─────────→ 192.168.10.30:3389
(응답 없음 → 같은 포트로 SYN 재전송)
↓
Wireshark: 연결마다 tcp.stream이 새로 부여되고, 각 stream은 2~3개 패킷으로 끝남
연결 완성도 필드 tcp.completeness (Wireshark 3.6 이후 계열에서 제공, 버전에 따라 표시 방식이 다를 수 있음)
| 비트 값 | 의미 |
|---|---|
| 1 | SYN 보임 |
| 2 | SYN/ACK 보임 |
| 4 | ACK 보임 |
| 8 | 데이터 보임 |
| 16 | FIN 보임 |
| 32 | RST 보임 |
합계로 연결의 모양을 판단합니다. SYN 스캔의 열린 포트는 1+2+32 = 35, 닫힌 포트는 1+32 = 33, 무응답은 1이 됩니다. Connect 스캔의 열린 포트는 ACK가 포함되므로 4 비트가 켜집니다.
스캔 도구가 만든 SYN의 특징 (일반적인 경향이며 도구·버전·옵션에 따라 다름)
| 필드 | 운영체제가 만든 일반 SYN | 스캔 도구의 Raw SYN에서 흔한 모양 |
|---|---|---|
tcp.window_size_value | 64240, 65535 등 OS 기본값 | 1024 같은 작은 고정값 |
| TCP 옵션 | MSS, SACK_PERM, Timestamps, Window Scale 등 여러 개 | MSS 하나만 있거나 옵션이 거의 없음 |
tcp.srcport | 연결마다 바뀜 | 여러 목적지 포트에 같은 값 반복 |
| 패킷 크기 | 옵션 때문에 60~74바이트 전후 | 옵션이 적어 더 작음 |
옵션 필드의 의미는 119. TCP 헤더와 Flag 분석 — 포트·시퀀스·Flag·옵션 필드 읽는 법을 참고합니다.
실습 예시 — ⚠️ 본인 소유 실습망의 본인 VM에만 수행합니다. 명령과 출력은 예시(값은 환경마다 다름)입니다. 스캐너 192.168.10.50, 대상 192.168.10.30입니다.
# 대상 VM에서 캡처 (Rocky/Ubuntu 공통)
sudo tcpdump -i ens33 -nn -w /tmp/synscan.pcapng 'host 192.168.10.50'
# 스캐너 VM: root 권한 SYN 스캔, 소수 포트만
sudo nmap -sS -p 21,22,23,80,443,3389 192.168.10.30
# 1) 연결별 완성도 값 분포
tshark -r /tmp/synscan.pcapng -2 -Y 'tcp.flags.syn == 1 && tcp.flags.ack == 0' \
-T fields -e tcp.completeness | sort | uniq -c
# 2) 스캐너 SYN의 출발지 포트·Window·옵션 길이
tshark -r /tmp/synscan.pcapng -Y 'ip.src == 192.168.10.50 && tcp.flags.syn == 1 && tcp.flags.ack == 0' \
-T fields -e tcp.srcport -e tcp.dstport -e tcp.window_size_value -e tcp.hdr_len
# 3) 비교용: 같은 VM에서 일반 접속 1회 (OS가 만든 SYN)
curl -s -o /dev/null http://192.168.10.30/
2)번 결과의 형식 예시입니다.
tcp.srcport tcp.dstport tcp.window_size_value tcp.hdr_len
43210 22 1024 24 ← 헤더 20 + MSS 옵션 4
43210 80 1024 24
43210 3389 1024 24
51544 80 64240 40 ← curl: OS 기본 SYN (옵션 여러 개)
Display Filter로는 tcp.completeness == 35(열린 포트 SYN 스캔 흔적)처럼 바로 걸러 볼 수 있습니다. 완성도 값은 두 번 읽기(-2) 또는 GUI에서 전체 로딩 후 정확해집니다.
📷 [실습 화면 삽입 위치] 열린 포트 하나의 SYN → SYN/ACK → RST 세 패킷과 SYN의 Window·Options가 펼쳐진 Packet Details
📷 [실습 화면 삽입 위치] 스캔 SYN과 일반 curl SYN의 TCP 옵션 부분을 나란히 비교한 화면
| 관찰 | 해석 |
|---|---|
tcp.completeness 35 연결 다수 | SYN 스캔으로 열린 포트가 확인됨 → 해당 포트 노출 점검 |
| 33이 대부분 | 닫힌 포트 대량 탐색 |
| 1만 대량 (무응답) | 방화벽이 차단 중이거나 캡처 지점이 한 방향만 봄 |
| 스캔 SYN 모양이 여러 출발지에서 동일 | 같은 도구의 분산 스캔 가능성 (05 영역에서 다룸) |
⚠️ Window 1024, 옵션 부족 같은 특징은 도구 식별의 보조 단서이지 확정 근거가 아닙니다. 옵션으로 쉽게 바꿀 수 있고, 일부 네트워크 장비도 비슷한 SYN을 만듭니다.
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | Half-open 모양, SYN 필드 특징, 열린 포트 |
| 방화벽 로그 | 완료되지 않은 세션, 다수 포트 차단 |
| IDS/IPS | SYN 스캔 임계치 이벤트 (291. Port Scan 탐지에서 규칙 다룸) |
| 대상 서비스 로그 | 대부분 남지 않음 → 패킷·네트워크 장비 로그가 핵심 근거 |
관제자가 확인할 질문
오탐 주의: 정상 연결도 캡처가 중간에 끊기거나 비대칭 경로면 완성도 값이 낮게 나옵니다. 클라이언트가 SYN/ACK 도착 전에 연결을 포기해도 RST가 생깁니다.
tcp.completeness(35 = 열림, 33 = 닫힘, 1 = 무응답)로 연결 모양을 빠르게 분류합니다.