네트워크 스트림 추적하기

WiresharkBeginner
지금 연습하기

소개

네트워크 트래픽은 전송되기 전에 흔히 '패킷'이라는 더 작은 단위로 분할됩니다. 클라이언트와 서버가 통신할 때, 이들은 수많은 패킷을 주고받습니다. "스트림 (Stream)"은 단일 연결에 대해 이러한 패킷들이 완전하고 순서대로 나열된 시퀀스를 의미합니다.

패킷과 스트림의 차이를 이해하는 것은 프로토콜 분석에서 가장 중요한 사고방식의 전환 중 하나입니다. 개별 패킷은 특정 순간에 무슨 일이 일어났는지를 보여주지만, 스트림은 전체 대화 내용을 보여줍니다. 로그인, 양식 제출, 파일 전송과 같은 많은 애플리케이션 계층 이벤트는 개별 패킷을 하나씩 들여다보는 것보다 대화 전체를 재구성했을 때 훨씬 더 명확하게 이해할 수 있습니다.

이번 실습에서는 tshark(Wireshark 의 명령줄 버전) 를 사용하여 파편화된 네트워크 대화를 재구성하는 방법을 배웁니다. 완전한 TCP 스트림을 추적함으로써 개별 패킷을 다시 하나로 묶고, 클라이언트와 서버 간의 전체 상호작용을 읽기 쉬운 텍스트 형태로 확인할 수 있습니다. 이는 네트워크 문제 해결 및 보안 분석을 위한 필수 기술입니다.

TCP 스트림 식별하기

이 단계에서는 네트워크 캡처 파일에 존재하는 다양한 TCP 스트림을 식별하는 방법을 배웁니다.

tshark가 캡처 파일을 읽을 때, 동일한 연결 (동일한 소스 IP, 소스 포트, 대상 IP, 대상 포트) 에 속한 패킷을 자동으로 그룹화하고 고유한 정수 인덱스를 할당합니다. 이 인덱스를 tcp.stream 필드라고 합니다.

tcp.stream은 분석기가 생성한 대화 라벨이라고 생각하면 됩니다. 이는 네트워크 자체에서 프로토콜 필드로 제공되는 것이 아닙니다. 대신 tshark는 특정 패킷들이 동일한 연결 종단점과 이벤트 순서를 공유하기 때문에 서로 연관되어 있다고 추론합니다. 이것이 바로 스트림 분석이 데이터에 대한 매우 유용한 "분석가 관점"을 제공하는 이유입니다.

실습 환경의 ~/project 디렉토리에는 sample_traffic.pcap이라는 샘플 캡처 파일이 준비되어 있습니다. 이 파일에는 기본적인 웹 트래픽이 포함되어 있습니다.

이 캡처 파일에 있는 모든 고유 TCP 스트림을 확인하려면, tshark를 사용하여 모든 패킷에서 tcp.stream 필드를 추출하고, 결과를 정렬한 뒤 고유한 값만 표시하도록 설정하면 됩니다.

터미널에서 다음 명령어를 실행하세요:

tshark -r sample_traffic.pcap -T fields -e tcp.stream | sort -n | uniq

명령어의 구성 요소는 다음과 같습니다:

  • -r sample_traffic.pcap: tshark에게 지정된 캡처 파일을 읽도록 지시합니다.
  • -T fields: 기본 패킷 요약 대신 특정 필드를 출력하도록 지정합니다.
  • -e tcp.stream: 각 패킷에 대한 TCP 스트림 인덱스를 출력하도록 tshark에 지시합니다.
  • | sort -n | uniq: 출력을 표준 Linux 유틸리티로 전달하여 숫자를 오름차순으로 정렬하고 중복을 제거합니다.

다음과 유사한 출력이 나타날 것입니다:

0
1

이 출력은 캡처 파일에 두 개의 개별 TCP 대화 (Stream 0 및 Stream 1) 가 기록되어 있음을 나타냅니다.

TCP 스트림 재구성하기

이제 TCP 스트림의 인덱스 번호를 알았으므로 전체 대화를 재구성할 수 있습니다. 이 과정은 Wireshark 그래픽 인터페이스의 "Follow TCP Stream" 기능과 동일합니다.

재구성은 HTTP, SMTP 및 많은 레거시 애플리케이션 프로토콜과 같은 텍스트 기반 프로토콜에서 특히 유용합니다. 분석가가 애플리케이션이 경험한 순서대로 요청과 응답을 읽을 수 있기 때문입니다. 기본 교환 과정이 여러 패킷에 걸쳐 있더라도, 재구성된 스트림은 전체 맥락을 복원해 줍니다.

이 단계에서는 Stream 0 을 재구성합니다. 이 스트림에는 클라이언트가 서버에 웹 페이지를 요청하는 HTTP GET 요청이 포함되어 있습니다.

tshark에서 스트림을 추적하려면 다양한 통계 및 분석 작업에 사용되는 -z 옵션을 사용합니다. 스트림을 추적하기 위한 구체적인 구문은 -z follow,tcp,ascii,<stream_index>입니다.

다음 명령어를 실행하여 Stream 0 을 재구성하세요:

tshark -r sample_traffic.pcap -z follow,tcp,ascii,0 -q

새로운 인자들의 의미는 다음과 같습니다:

  • -z follow,tcp,ascii,0: tshark에게 인덱스 0인 TCP 스트림을 추적하고 페이로드를 ascii(읽기 쉬운 텍스트) 형식으로 표시하도록 지시합니다.
  • -q: "quiet"의 약자로, 기본 패킷별 출력을 억제하여 재구성된 스트림 데이터만 볼 수 있게 합니다.

전체 HTTP 대화 내용이 출력되는 것을 볼 수 있습니다:

===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 0
Node 0: 127.0.0.1:58548
Node 1: 127.0.0.1:8080
GET / HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*

HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Thu, 05 Mar 2026 02:00:48 GMT
Content-type: text/html
Content-Length: 40
Last-Modified: Thu, 05 Mar 2026 02:00:44 GMT

Welcome to the LabEx Network Stream Lab

===================================================================

이 출력에서 클라이언트의 요청 (GET / HTTP/1.1...) 과 그 뒤를 잇는 서버의 응답 (HTTP/1.0 200 OK... 및 HTML 콘텐츠) 을 명확하게 확인할 수 있습니다. tshark는 개별 패킷들을 성공적으로 하나로 묶어 일관된 텍스트 블록으로 복원했습니다.

대화 내용 분석하기

네트워크 트래픽을 분석할 때 대화 내용은 매우 길어질 수 있습니다. 방대한 스트림을 터미널에 직접 출력하면 읽고 분석하기 어려울 수 있습니다.

재구성된 스트림을 파일로 저장하는 것은 작은 단계이지만, 이는 더 넓은 포렌식 습관을 반영합니다. 바로 중간 분석 결과물을 보존하는 것입니다. 조사관들은 종종 메모, 추출된 대화 내용, 디코딩된 페이로드, 필터링된 증거를 별도의 파일로 보관하여, 동일한 명령어를 처음부터 다시 입력할 필요 없이 결과를 검토, 비교하거나 다른 사람에게 전달할 수 있도록 합니다.

이 단계에서는 Stream 1 을 재구성하고 출력을 텍스트 파일로 리다이렉션합니다. 이를 통해 표준 텍스트 편집기나 명령줄 도구를 사용하여 원하는 속도로 대화 내용을 검토할 수 있습니다.

Stream 1 에는 로그인 양식 제출과 같이 데이터를 전송할 때 주로 사용되는 HTTP POST 요청이 포함되어 있습니다.

다음 명령어를 실행하여 Stream 1 을 추적하고 출력을 stream1_analysis.txt라는 파일로 저장하세요:

tshark -r sample_traffic.pcap -z follow,tcp,ascii,1 -q > stream1_analysis.txt

> 연산자는 일반적으로 화면에 출력될 내용을 현재 디렉토리 (~/project) 의 stream1_analysis.txt 파일에 기록합니다.

이제 cat 명령어를 사용하여 방금 생성한 파일의 내용을 확인하세요:

cat stream1_analysis.txt

출력 내용은 다음과 유사할 것입니다:

===================================================================
Follow: tcp,ascii
Filter: tcp.stream eq 1
Node 0: 127.0.0.1:45138
Node 1: 127.0.0.1:8080
POST /login HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
Content-Length: 23
Content-Type: application/x-www-form-urlencoded

user=labex&action=loginHTTP/1.0 501 Unsupported method ('POST')
Server: SimpleHTTP/0.6 Python/3.10.12
Date: Wed, 25 Oct 2026 10:00:05 GMT
Connection: close
Content-Type: text/html;charset=utf-8
Content-Length: 480

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"
        "http://www.w3.org/TR/html4/strict.dtd">
...
===================================================================

이 파일을 분석하면 클라이언트가 POST 요청 본문에 보낸 정확한 데이터 (user=labex&action=login) 를 관찰할 수 있습니다. 또한 서버의 응답으로 501 Unsupported method 오류가 발생한 것을 볼 수 있는데, 이는 이 트래픽을 생성하는 데 사용된 간단한 Python 웹 서버가 POST 요청을 지원하지 않음을 나타냅니다.

스트림을 파일로 저장하는 것은 네트워크 캡처에서 파일, 자격 증명 또는 상세 로그를 추출해야 할 때 매우 효과적인 기술입니다.

요약

축하합니다! "네트워크 스트림 추적하기" 실습을 성공적으로 완료했습니다.

이번 실습에서 배운 내용은 다음과 같습니다:

  • tcp.stream 필드를 사용하여 패킷 캡처 파일 내의 고유한 TCP 스트림을 식별하는 방법.
  • tshark의 follow 기능을 사용하여 특정 TCP 스트림의 전체 대화 내용을 재구성하고 확인하는 방법.
  • 재구성된 스트림 데이터를 텍스트 파일로 리다이렉션하여 더 쉽게 읽고 심층 분석하는 방법.

이러한 기술은 네트워크 관리자와 보안 전문가가 네트워크 문제를 조사하거나, 악성 코드 동작을 분석하거나, 애플리케이션 통신을 검증할 때 사용하는 기본적인 역량입니다.