📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 142편
이전 글: 141. SMB Traffic 이해 · 다음 글: 143. SYN Scan Packet 분석
포트 스캔은 여러 포트에 짧은 요청을 보내 응답의 모양으로 포트 상태를 판단하는 행위입니다. 이 글은 스캔 트래픽이 패킷 목록에서 어떤 모양으로 보이는지만 다룹니다. 공격자가 왜·어떻게 정찰하는지와 스캔 유형별 특징은 05 영역(201. 네트워크 스캔이란 무엇인가, 216. TCP Port Scan 특징), 보안장비의 탐지 규칙은 291. Port Scan 탐지에서 다룹니다.
| 스캔 트래픽의 기본 모양 | 정상 접속과의 차이 |
|---|---|
| 한 출발지 → 한 목적지의 많은 포트 (수직형) | 정상 접속은 소수의 서비스 포트만 사용 |
| 한 출발지 → 많은 목적지의 같은 포트 (수평형) | 정상 접속은 정해진 서버만 대상 |
| 연결마다 패킷 2~3개로 끝남 | 정상 접속은 데이터 교환이 이어짐 |
TCP 포트 하나에 대한 요청과 응답은 대상 상태에 따라 세 가지 모양 중 하나가 됩니다.
[열림 open] Scanner ── SYN ──→ Target:22
Scanner ←─ SYN/ACK ── Target → 이후 ACK(연결 완료) 또는 RST(143편)
[닫힘 closed] Scanner ── SYN ──→ Target:23
Scanner ←─ RST/ACK ── Target → 포트에 서비스 없음
[필터링 filtered] Scanner ── SYN ──→ Target:3389
(응답 없음, SYN 재전송)
또는 ←─ ICMP Type 3 (Code 1/2/3/9/10/13) ── 방화벽·라우터
↓
패킷 목록 = 포트 번호만 바뀌는 SYN이 빠르게 반복 + RST/ACK가 대량
UDP 스캔은 응답 규칙이 다릅니다. 닫힌 포트는 대상이 ICMP Port Unreachable(Type 3, Code 3) 로 답하고, 열린 포트는 서비스가 요청을 이해한 경우에만 UDP로 응답합니다. 응답이 없으면 "열림 또는 필터링"으로 구분이 어렵습니다.
상태별 확인 필터
| 확인 대상 | Display Filter |
|---|---|
| 연결 시도(SYN만) | tcp.flags.syn == 1 && tcp.flags.ack == 0 |
| 열린 포트 응답 | tcp.flags.syn == 1 && tcp.flags.ack == 1 |
| 닫힌 포트 응답 | tcp.flags.reset == 1 && tcp.flags.ack == 1 |
| UDP 닫힌 포트 | icmp.type == 3 && icmp.code == 3 |
| 관리적으로 차단 | icmp.type == 3 && icmp.code == 13 |
스캔을 한눈에 보는 Wireshark 기능
| 기능 | 메뉴 | 스캔일 때 보이는 모양 |
|---|---|---|
| Conversations (TCP 탭) | Statistics → Conversations | 같은 주소 쌍에 포트만 다른 행이 수백 개, 각 행 패킷 2~3개 |
| Endpoints (TCP 탭) | Statistics → Endpoints | 대상 IP의 포트 목록이 연속 번호로 나열 |
| I/O Graphs | Statistics → I/O Graphs | 짧은 시간에 SYN·RST 수가 급증 |
| Flow Graph | Statistics → Flow Graph | 같은 두 주소 사이 SYN → RST 화살표 반복 |
TCP Connect 방식(운영체제의 연결 함수 사용)은 열린 포트에서 3-Way Handshake를 완료한 뒤 곧바로 종료하고, SYN 방식은 완료하지 않습니다. 이 차이는 143. SYN Scan Packet 분석에서 다룹니다.
실습 예시 — ⚠️ 스캔은 본인 소유 실습망의 본인 VM에만 수행합니다. 타인 시스템 스캔은 법적 문제가 될 수 있습니다. 명령과 출력은 예시(값은 환경마다 다름)입니다. Nmap 설치는 Rocky sudo dnf install nmap, Ubuntu sudo apt install nmap입니다.
# 대상 VM(192.168.10.30)에서 스캐너(192.168.10.50) 트래픽 캡처 (Rocky/Ubuntu 공통)
sudo tcpdump -i ens33 -nn -w /tmp/scan.pcapng 'host 192.168.10.50'
# 스캐너 VM: 일반 사용자 권한 기본 스캔(Connect 방식), 포트 1~1024
nmap -p 1-1024 192.168.10.30
# 1) 대상이 보낸 응답 종류 분포
tshark -r /tmp/scan.pcapng -Y 'ip.src == 192.168.10.30 && tcp' -T fields -e tcp.flags.str \
| sort | uniq -c | sort -rn
# 2) 열린 포트 = 대상이 SYN/ACK를 보낸 출발지 포트
tshark -r /tmp/scan.pcapng -Y 'ip.src == 192.168.10.30 && tcp.flags.syn == 1 && tcp.flags.ack == 1' \
-T fields -e tcp.srcport | sort -nu
# 3) 출발지가 SYN을 보낸 서로 다른 목적지 포트 수
tshark -r /tmp/scan.pcapng -Y 'tcp.flags.syn == 1 && tcp.flags.ack == 0' -T fields -e ip.src -e tcp.dstport \
| sort -u | awk '{c[$1]++} END {for (s in c) print s, c[s]}'
1)번 결과의 형식 예시입니다. 닫힌 포트가 대부분이므로 RST/ACK가 압도적으로 많습니다.
1020 ·······A·R·· ← RST/ACK (닫힌 포트)
4 ·······A··S· ← SYN/ACK (열린 포트)
...
Wireshark의 공개 샘플 모음(Wireshark Wiki SampleCaptures)에도 스캔 형태의 캡처가 있으므로, 직접 스캔하지 않고 모양만 확인하는 연습에 활용할 수 있습니다. 샘플마다 환경이 다르므로 위 수치와 같게 나오지는 않습니다.
📷 [실습 화면 삽입 위치] Statistics → Conversations의 TCP 탭에서 같은 주소 쌍의 포트별 행이 연속으로 나열되고 각 행 패킷 수가 2~3개인 화면
📷 [실습 화면 삽입 위치] 필터
tcp.flags.reset == 1 && tcp.flags.ack == 1적용 후 목적지 포트만 바뀌며 반복되는 Packet List
패킷 모양만으로 "공격"을 확정하지 않습니다. 이 글에서 얻는 것은 스캔 형태의 트래픽이 있었다는 사실과 대상·범위·결과(열린 포트)입니다.
| 패킷 모양 | 정상일 수 있는 경우 | 추가 확인이 필요한 경우 |
|---|---|---|
| 한 목적지 다수 포트 | 승인된 취약점 점검 | 점검 일정에 없는 출발지 |
| 다수 목적지 같은 포트 | 자산 관리·모니터링 | 일반 사용자 단말에서 발생 |
| SYN/ACK를 받은 포트 존재 | — | 스캔 이후 그 포트로 실제 접속·공격 시도가 이어졌는가 |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | 스캔 범위·순서·속도, 열린 포트(SYN/ACK) |
| 방화벽 로그 | 차단된 다수 포트 이벤트 (234. Firewall에서 Scan 흔적 찾기) |
| IDS/IPS | 스캔 임계치 Alert (235. IDS에서 Scan Alert 확인) |
| 대상 호스트 | 서비스 로그의 짧은 연결 기록 (Connect 방식일 때) |
관제자가 확인할 질문
오탐 주의: 한쪽 방향만 보이는 캡처 지점에서는 정상 접속도 "응답 없는 SYN"처럼 보입니다. 로드밸런서 헬스체크, P2P 프로그램도 다수 포트·다수 대상 연결을 만듭니다.