📚 네트워크 · 패킷 분석 › 03. Wireshark 패킷 분석 — 146편
이전 글: 145. HTTP 메서드와 상태코드로 보는 이상징후 · 다음 글: 147. 외부 비정상 통신 분석
"비정상 TCP"는 두 가지로 나눠 봐야 합니다. 하나는 규격상 나올 수 없는 패킷(Flag 조합 등), 다른 하나는 규격에는 맞지만 양이나 흐름이 평소와 다른 트래픽입니다. 재전송·중복 ACK처럼 네트워크 품질 문제로 생기는 현상은 131. TCP Retransmission·132. Duplicate ACK에서, Flag 각각의 의미는 128. TCP Flag 분석에서 다뤘습니다.
| 분류 | 예 | 원인 가능성 |
|---|---|---|
| 규격 위반 | SYN+FIN 동시, Flag 없음, SYN에 RST 동시 | 스캔·회피 시도, 조작된 패킷 |
| 흐름 이상 | 완료되지 않은 SYN 대량, RST 폭주 | SYN Flood, 서비스 장애, 스캔 |
| 값 이상 | 창 밖 시퀀스의 RST, 같은 연결 내 TTL 급변 | 연결 강제 종료(주입) 시도, 경로 변경 |
| 품질 문제 | 재전송, Zero Window | 대부분 네트워크·서버 성능 문제 |
Wireshark는 TCP 연결을 추적하면서 예상과 다른 패킷에 Expert Info와 tcp.analysis.* 플래그를 붙입니다. 규격 위반 Flag는 Expert Info가 없어도 필드 조건으로 직접 찾습니다.
캡처 파일
↓
① Analyze → Expert Information : Warning·Error 항목 수 확인
↓
② tcp.analysis.flags : Wireshark가 문제로 표시한 패킷
↓
③ Flag 조합 필터 : 규격상 불가능한 조합 직접 검색
↓
④ Conversations / I/O Graphs : 양·시간 분포로 흐름 이상 확인
↓
⑤ 품질 문제 vs 의도적 트래픽 구분 → 필요한 경우 05·06 영역 분석으로 연계
규격 위반 Flag 조합 필터 (정상 통신에서는 거의 나오지 않음)
| 형태 | Display Filter | 참고 |
|---|---|---|
| SYN + FIN | tcp.flags.syn == 1 && tcp.flags.fin == 1 | 연결 시작과 종료를 동시에 요청 |
| SYN + RST | tcp.flags.syn == 1 && tcp.flags.reset == 1 | 모순된 조합 |
| Flag 없음 | tcp.flags == 0x000 | Null 형태 (219. Null Scan) |
| FIN + PSH + URG | tcp.flags.fin == 1 && tcp.flags.push == 1 && tcp.flags.urg == 1 | XMAS 형태 (220. XMAS Scan) |
| 데이터가 실린 SYN | tcp.flags.syn == 1 && tcp.len > 0 | TCP Fast Open 등 일부 정상 사례 존재 |
Wireshark 분석 플래그 (tcp.analysis.*)
| 필드 | 뜻 | 보안 관점 활용 |
|---|---|---|
tcp.analysis.retransmission | 재전송 | 응답 없는 SYN 재전송 대량 → 필터링된 대상 또는 Flood 피해 |
tcp.analysis.zero_window | 수신 버퍼 가득 참 | 서버 과부하, 느린 읽기형 자원 고갈 |
tcp.analysis.reused_ports | 이전 연결과 같은 포트 쌍으로 새 SYN | 스캔 도구의 고정 출발지 포트 |
tcp.analysis.out_of_order | 순서 뒤바뀜 | 다중 경로, 드물게 조작 패킷 |
tcp.analysis.lost_segment | 이전 구간 누락 | 대부분 캡처 누락 (센서 성능 확인) |
분석 방법 예시 — 이미 확보한 캡처 파일에서 비정상 TCP를 유형별로 세어 봅니다. 명령과 출력은 예시(값은 환경마다 다름)입니다. 연습용 파일은 Wireshark Wiki SampleCaptures의 공개 샘플 중 TCP 관련 파일을 쓸 수 있으며, 결과는 파일마다 다릅니다.
# tshark는 Rocky: wireshark-cli, Ubuntu: tshark 패키지
# 1) Expert Info 요약 (심각도별 항목)
tshark -r sample.pcapng -q -z expert,warn
# 2) 규격 위반 Flag 조합 건수
for f in 'tcp.flags.syn==1 && tcp.flags.fin==1' \
'tcp.flags.syn==1 && tcp.flags.reset==1' \
'tcp.flags == 0x000' \
'tcp.flags.fin==1 && tcp.flags.push==1 && tcp.flags.urg==1'; do
printf '%-60s %s\n' "$f" "$(tshark -r sample.pcapng -Y "$f" | wc -l)"
done
# 3) 완료되지 않은 연결: SYN만 보인 연결(completeness 1)의 목적지별 수
tshark -r sample.pcapng -2 -Y 'tcp.flags.syn==1 && tcp.flags.ack==0 && tcp.completeness==1' \
-T fields -e ip.dst -e tcp.dstport | sort | uniq -c | sort -rn | head
# 4) 같은 연결 안에서 TTL이 여러 값으로 나타나는 stream
tshark -r sample.pcapng -T fields -e tcp.stream -e ip.src -e ip.ttl \
| sort -u | awk '{k=$1" "$2; n[k]++} END {for (k in n) if (n[k]>1) print k, n[k]}'
3)번 결과가 하나의 목적지·포트에 집중되고 출발지가 매우 다양하다면 SYN Flood 형태, 하나의 출발지가 여러 포트에 걸쳐 있다면 스캔 형태(142. Port Scan Packet 분석)로 먼저 분류할 수 있습니다. 4)번에서 TTL이 달라지는 연결은 경로 변경일 수도 있지만, 제3자가 주입한 RST가 섞인 경우에도 나타날 수 있어 해당 패킷의 시퀀스 번호가 창 안에 있는지 함께 확인합니다(129. Sequence Number 분석).
📷 [실습 화면 삽입 위치] Analyze → Expert Information 창에서 Warning/Note 항목을 펼쳐 해당 패킷으로 이동한 화면
📷 [실습 화면 삽입 위치] I/O Graph에
tcp.flags.syn==1 && tcp.flags.ack==0과tcp.flags.syn==1 && tcp.flags.ack==1두 그래프를 그려 SYN 대비 SYN/ACK 비율이 보이는 화면
| 관찰 | 정상·장애일 수 있는 경우 | 의도적 트래픽을 의심할 경우 |
|---|---|---|
| SYN 대량, SYN/ACK 적음 | 서버 다운, 방화벽 차단 | 다수 출발지 → 한 포트 집중 (SYN Flood) |
| RST 대량 | 서비스 재시작, 로드밸런서 동작 | 연결 중간에 창 밖 시퀀스 RST 반복 |
| 규격 위반 Flag | 거의 없음 | 스캔·장비 회피 시도 (05 영역) |
| Zero Window 장시간 | 느린 클라이언트, 서버 과부하 | 연결을 붙잡아 자원을 고갈시키는 형태 |
| 체크섬 오류 | 송신 측 캡처의 Checksum Offload | 수신 측 캡처에서도 반복되면 장비 이상 |
| 흔적 위치 | 확인할 수 있는 것 |
|---|---|
| 패킷 캡처 | Flag 조합, 분석 플래그, 시퀀스·TTL 값 |
| 방화벽 로그 | 비정상 Flag 차단(invalid 상태), 반개방 세션 수 |
| IDS/IPS | 비정상 Flag·Flood 이벤트 (294. 비정상 Network Traffic 탐지에서 다룸) |
| 서버 지표 | 반개방 연결 수(ss -tan state syn-recv), 연결 거부 |
관제자가 확인할 질문
오탐 주의: lost_segment, ack_lost_segment는 센서가 패킷을 놓친 경우에도 대량으로 표시됩니다. 송신 호스트에서 캡처하면 체크섬 오프로드 때문에 정상 패킷이 체크섬 오류로 보일 수 있습니다.
tcp.completeness와 I/O Graph로 확인합니다.tcp.analysis.*는 출발점이며, 대부분은 네트워크·캡처 문제일 수 있습니다.