Step 83. Wireshark 1 — 캡처와 필터, 네트워크의 현미경

Step 83. Wireshark 1 — 캡처와 필터, 네트워크의 현미경

Level 1 — 프로그래밍과 컴퓨터 내부 | 난이도 ★★★☆☆ | 예상 소요 시간 3시간

전제: Step 80을 마쳤다. 패킷이 Ethernet/IP/TCP로 겹친 구조라는 것을 안다. 내 랩 환경(리눅스 또는 윈도우)이 있다.

  • 준비물: Wireshark 설치와 내 랩 네트워크. 터미널 버전인 tshark가 있으면 GUI 없이도 같은 원리를 연습할 수 있습니다.
  • 주의: ⚠️ 이 챕터의 실습은 내 랩·합법 플랫폼 전용입니다. 허가 없는 시스템에 적용하면 범죄입니다. 캡처의 대상은 언제나 내 장비·내 랩뿐입니다. GUI 화면 설명은 "화면 예시"이고, tshark 명령의 출력은 2026-09-09에 WSL 리눅스(TShark 4.2.2)의 루프백에서 실측한 것입니다.

Step 80에서 우리는 패킷을 만들고 몇 개쯤 낚아채 봤습니다. 그런데 이 일을 전문으로 하는, 25년 된 현미경이 있습니다. Wireshark(와이어샤크)입니다. 네트워크 카드를 지나는 모든 패킷을 실시간으로 잡아, 계층별로 펼쳐 보여 주고, 대화 단위로 재구성해 주는 도구입니다. 오늘의 목표는 두 가지입니다. 첫째, 패킷의 홍수 속에서 길을 잃지 않는 법(필터). 둘째, 두 필터 — 캡처 필터와 디스플레이 필터 — 의 차이를 몸으로 익히는 것.


1. 학습 목표

이 챕터를 끝내면 다음을 할 수 있습니다:

  • 네트워크 인터페이스를 골라 캡처를 시작하고 멈춘다
  • 디스플레이 필터 문법(dns, tcp.port == 80, ip.addr == ...)을 쓴다
  • 캡처 필터(BPF 문법)와 디스플레이 필터의 차이를 설명하고 각각을 쓴다
  • 캡처 결과를 pcap 파일로 저장하고 다시 연다
  • tshark로 같은 원리를 명령줄에서 재현한다

2. 배경 지식 — 오늘의 도구와 개념

오늘의 도구 한눈에 보기

구분 내용
언어·환경 Wireshark(GUI) 또는 tshark(명령줄) — 리눅스/윈도우 공통
오늘의 도구 캡처 인터페이스 선택, 디스플레이 필터 입력줄, 캡처 필터 입력란, File → Save As
필요한 개념 인터페이스(랜카드), 루프백, 패킷의 계층 구조, pcap 파일
오늘의 산출물 first_capture.pcap — 내 첫 패킷 녹화 파일

2-1. 캡처 — 네트워크 카드의 곁눈질

여러분의 네트워크 카드는 원래 "내 것"인 패킷만 운영체제에 넘깁니다. Wireshark는 이 카드를 무차별 모드(promiscuous mode)로 바꿔 "보이는 것은 다 가져와"라고 시킵니다. 이것을 캡처(capture, 포획)라 합니다. 같은 네트워크의 다른 기기 통신 일부까지 보일 수 있어서, 캡처는 반드시 내 랩에서만 합니다 — 남의 통신을 엿보는 것은 그 자체로 법의 문제입니다.

2-2. 화면의 세 구역

Wireshark 창은 세 층입니다.

  1. 맨 위 — 패킷 목록: 잡힌 패킷들이 한 줄씩 시간순으로 나열됩니다.
  2. 가운데 — 패킷 상세(Packet Details): 선택한 패킷을 계층별로 펼쳐 보여 줍니다. Step 80의 pkt.show()와 같은 구조입니다.
  3. 맨 아래 — 패킷 바이트(Packet Bytes): 날것의 16진수 덤프입니다.

2-3. 두 개의 필터 — 잡기 전과 잡은 후

Wireshark 초보가 가장 흔히 혼동하는 지점이 여기입니다.

  • 캡처 필터(capture filter): 캡처를 시작하기 전에 "무엇을 애초에 잡을까"를 정합니다. port 53처럼 간결한 BPF(Berkeley Packet Filter) 문법을 씁니다. 걸러진 패킷은 아예 저장되지 않습니다.
  • 디스플레이 필터(display filter): 이미 잡은 패킷 중 "무엇을 화면에 보여 줄까"를 고릅니다. udp.port == 53 같은 풍부한 문법을 쓰고, 필터를 바꿀 때마다 화면만 다시 그려집니다 — 원본은 그대로 남아 있습니다.

규칙 한 줄: 캡처 필터는 잡기 전에, 디스플레이 필터는 잡은 후에.


3. 따라 하기

3-1. 설치와 인터페이스 선택

입력: wireshark.org에서 설치하거나, 리눅스라면 sudo apt install wireshark. 실행하면 첫 화면에 네트워크 인터페이스(랜카드) 목록이 뜹니다.

화면 예시: 목록의 각 카드 옆에 작은 파형이 있습니다. 지금 데이터가 오가는 카드는 파형이 꿈틀거립니다. 보통 "Wi-Fi" 또는 "eth0"입니다. 루프백(loopback, 자기 자신과의 통신 전용)은 바깥 통신이 안 보이므로, 오늘처럼 내 컴퓨터 안 실험(127.0.0.1)을 할 때만 고릅니다. 더블클릭하면 캡처가 시작됩니다.

읽는 법: 캡처를 시작하면 아무것도 안 해도 패킷이 쏟아집니다 — 여러분의 컴퓨터가 조용히 수많은 대화(시계 맞추기, 업데이트 확인 등)를 하고 있기 때문입니다. 이 "조용한 소음"을 보는 것 자체가 첫 배움입니다. 상단의 빨간 네모 단추가 정지입니다.

3-2. 디스플레이 필터 연습 — 홍수를 시냇물로

입력: 필터 입력줄에 차례로 넣어 보세요.

dns
tcp.port == 80
ip.addr == 8.8.8.8

화면 예시: 필터를 바꿀 때마다 목록이 확확 줄어듭니다. 오타가 나면 입력창이 빨갛게 물들고, 문법이 맞으면 초록색입니다.

자주 쓰는 디스플레이 필터:

필터 의미
dns DNS 패킷만
http HTTP 패킷만
tcp.port == 80 80번 포트가 끼인 TCP만
ip.addr == 8.8.8.8 그 주소와 오가는 모든 것
tcp.flags.syn == 1 SYN 플래그가 선 패킷만

: 필터 없는 캡처는 돋보기 없는 현미경입니다. "무엇을 볼 것인가"를 먼저 정하는 습관이 분석 시간을 가릅니다.

3-3. tshark로 재현 — 잡기 전 필터와 잡은 후 필터

GUI가 없어도 되는, 그리고 두 필터의 차이가 가장 선명해지는 실험입니다. 내 컴퓨터 안에 연습 서버를 열고(python3 -m http.server 8000), 캡처 필터를 달고 잡아 봅니다.

입력 (터미널 1, 캡처 필터 사용)

tshark -i lo -f "tcp port 8000" -c 6 -w cap_filter.pcap

입력 (터미널 2, 캡처가 시작되면)

curl -s http://127.0.0.1:8000/ > /dev/null

출력 — 저장된 파일 전체를 열어 보면 (2026-09-09 실측):

$ tshark -r cap_filter.pcap
    1 0.000000000    127.0.0.1 → 127.0.0.1    TCP 74 52398 → 8000 [SYN] Seq=0 Win=65495 Len=0 ...
    2 0.000022753    127.0.0.1 → 127.0.0.1    TCP 74 8000 → 52398 [SYN, ACK] Seq=0 Ack=1 ...
    3 0.000031640    127.0.0.1 → 127.0.0.1    TCP 66 52398 → 8000 [ACK] Seq=1 Ack=1 ...
    4 0.000140725    127.0.0.1 → 127.0.0.1    HTTP 143 GET / HTTP/1.1
    5 0.000144004    127.0.0.1 → 127.0.0.1    TCP 66 8000 → 52398 [ACK] Seq=1 Ack=78 ...
    6 0.001643067    127.0.0.1 → 127.0.0.1    TCP 251 HTTP/1.0 200 OK  [TCP segment of a reassembled PDU]

읽는 법: 캡처 필터 -f "tcp port 8000"을 걸었으므로 파일 안에는 8000번 포트 대화만 들어 있습니다. 다른 패킷은 애초에 잡히지 않았습니다. 그리고 이 여섯 줄을 자세히 보세요 — [SYN], [SYN, ACK], [ACK] 세 악수로 시작해 GET, 200 OK로 이어지는, 한 번의 웹 접속 전체가 그대로 녹아 있습니다.

3-4. 디스플레이 필터로 다시 걸러 보기

이번에는 필터 없이 잡은 파일에서, 잡은 후에 골라 봅니다.

입력

tshark -i lo -a duration:6 -w raw.pcap     # 이 사이에 curl을 두어 번 실행
tshark -r raw.pcap -Y http

출력 (2026-09-09 실측 — 같은 파일, 필터 전/후):

# 필터 없이: 12줄 — TCP 악수와 확인응답 사이에 HTTP가 묻혀 있음
    1 ... TCP 74 39840 → 8000 [SYN] ...
    4 ... HTTP 143 GET / HTTP/1.1
    8 ... HTTP 93 HTTP/1.0 200 OK  (text/html)
   16 ... HTTP 250 POST /login HTTP/1.1  (application/x-www-form-urlencoded)
   20 ... HTTP 423 HTTP/1.0 501 Unsupported method ('POST')  (text/html)

# -Y http 적용 후: HTTP 네 줄만 남음
    4 ... GET / HTTP/1.1
    8 ... HTTP/1.0 200 OK  (text/html)
   16 ... POST /login HTTP/1.1  (application/x-www-form-urlencoded)
   20 ... HTTP/1.0 501 Unsupported method ('POST')  (text/html)

읽는 법: 원본 파일(raw.pcap)은 그대로이고, -Y http가 화면에 보여 주는 것만 골랐습니다. 필터를 바꿔도 원본은 다시 볼 수 있습니다 — 이것이 "잡은 후 필터"의 힘입니다. 반면 3-3의 캡처 필터는 파일 자체가 이미 걸러진 결과였습니다.

3-5. 원하는 값만 표로 뽑기 — 필드 추출

디스플레이 필터는 "행"을 고르고, 필드 추출은 "열"을 고릅니다.

입력

tshark -r raw.pcap -Y http -T fields -e frame.number -e http.request.method -e http.host -e http.request.uri -e http.response.code

출력 (2026-09-09 실측):

4	GET	127.0.0.1:8000	/	
8				200
16	POST	127.0.0.1:8000	/login	
20				501

읽는 법: 번호, 요청 방식, 호스트, 주소, 응답 코드만 뽑은 표입니다. 4번은 GET / 요청, 8번은 그 응답(200), 16번은 POST /login, 20번은 그 응답(501)입니다. 요청과 응답이 번호로 짝지어지는 것도 보입니다.

: 수만 줄의 캡처를 엑셀 같은 표로 바꾸는 기술입니다. 로그 분석과 자동화의 첫걸음이며, Step 82의 파싱 실력이 그대로 이어집니다.

3-6. 저장과 다시 열기 — pcap 보관함

입력: Wireshark에서 File → Save As → first_capture.pcap으로 저장합니다. Wireshark를 닫았다가 그 파일을 더블클릭해 다시 엽니다.

화면 예시: 닫히기 전의 목록이 그대로 다시 나타납니다. 필터도, 스트림 재구성도 다시 적용할 수 있습니다.

읽는 법: pcap은 "그 시각 네트워크의 녹화 파일"입니다. 시간은 흘렀지만 그 안의 패킷들은 그날 그대로입니다. 확장자 pcapng는 차세대 형식으로 주석과 인터페이스 정보까지 담습니다 — 초보 단계에서는 "Wireshark의 기본 저장 형식"으로 알아 두면 충분합니다.

: 분석은 현장에서 끝나지 않습니다. 현장(pcap)을 보존해 두고 나중에, 다른 도구로, 다른 사람과 함께 다시 보는 것이 실무입니다. CTF 포렌식 문제의 "이 pcap에서 범인의 통신을 찾아라"가 바로 이 파일입니다.


4. 미션과 연습문제

미션 — 캡처 탐험 일지

  1. 캡처를 5분간 돌리며, 등장한 규약(Protocol 열)의 종류를 전부 적습니다.
  2. dns 필터로 질문-대답 한 쌍을 찾아, 어떤 이름을 물었고 어떤 주소를 받았는지 기록합니다.
  3. 캡처 필터 tcp port 80으로 새 캡처를 시작하고 평문 사이트(예: http://neverssl.com)에 접속해, DNS/잡음 없이 웹 대화만 깔끔하게 잡힌 것을 확인합니다.
  4. 같은 접속을 디스플레이 필터 http로도 걸러 보고, 3번과 결과가 어떻게 다른지(파일 내용 vs 화면) 비교 문장을 씁니다.
  5. 캡처를 탐험일지.pcap으로 저장하고, 일지 마지막에 "캡처 필터와 디스플레이 필터의 차이"를 자기 말로 세 문장 씁니다.

연습문제

문제 1. 캡처 필터와 디스플레이 필터의 차이를 "잡기 전/잡은 후"와 문법(BPF vs Wireshark 문법) 두 축으로 설명해 보세요.

문제 2. 몇 시간짜리 캡처를 계획할 때 캡처 필터를 쓰는 것이 좋은 이유를 파일 크기 관점에서 설명해 보세요.

문제 3. 디스플레이 필터 ip.addr == 8.8.8.8은 무엇을 보여 주나요? ip.src == 8.8.8.8과 무엇이 다른가요?

문제 4. 루프백(lo) 인터페이스와 일반 랜카드(eth0) 중 어느 쪽을 골라야 127.0.0.1:8000 실험 트래픽이 잡히나요? 그 이유는 무엇인가요?


5. 모범 답안과 완료 기준

미션 모범 답안

3번~4번의 비교 실험은 tshark로도 그대로 재현됩니다 (2026-09-09 실측):

# 캡처 필터: 파일 자체가 걸러진 결과
tshark -i lo -f "tcp port 8000" -c 6 -w cap_filter.pcap
tshark -r cap_filter.pcap            # → 8000번 대화 6줄뿐

# 디스플레이 필터: 파일은 전체, 화면만 필터링
tshark -i lo -a duration:6 -w raw.pcap
tshark -r raw.pcap -Y http           # → HTTP 4줄만 표시, 원본은 12줄 전부 보존

비교 문장의 예: "캡처 필터로 잡은 파일은 처음부터 8000번 포트 패킷만 담겨 나중에 다른 규약을 복구할 수 없었다. 디스플레이 필터를 쓴 파일은 화면에는 HTTP만 보였지만 원본에 TCP·기타 패킷이 모두 남아 있어 필터를 바꿔 다른 관점으로 다시 볼 수 있었다."

검증하는 법: ① 규약 목록이 다섯 종류 이상 적혔는가. ② DNS 짝의 이름과 주소가 기록됐는가. ③ 캡처 필터 캡처와 디스플레이 필터 캡처의 차이가 "파일 내용이냐 화면이냐"로 정확히 서술됐는가. ④ pcap 파일이 저장돼 다시 열리는가.

연습문제 해답

문제 1 해답. 캡처 필터는 캡처 시작 전에 "무엇을 애초에 잡을까"를 정하는 필터로 BPF 문법(port 53)을 쓰고, 걸러진 패킷은 저장되지 않습니다. 디스플레이 필터는 잡은 후에 "무엇을 보여 줄까"를 고르는 필터로 Wireshark 문법(udp.port == 53)을 쓰고, 원본은 그대로 보존됩니다.

문제 2 해답. 필터 없이 몇 시간을 잡으면 쓸데없는 패킷까지 전부 저장되어 파일이 기가바이트 단위로 불어나고, 나중에 열기도 분석하기도 무거워집니다. 캡처 필터로 필요한 것만 잡으면 파일이 작고 빠릅니다. 대신 나중에 "아, 그것도 볼 걸"이 불가능해지는 절충입니다.

문제 3 해답. 8.8.8.8과 오가는(출발지 또는 목적지가 그 주소인) 모든 패킷을 보여 줍니다. ip.src는 그 주소에서 것만, 즉 방향이 한쪽으로 제한됩니다. 질문만 보고 싶으면 ip.dst, 대답만 보고 싶으면 ip.src입니다.

문제 4 해답. 루프백(lo)입니다. 127.0.0.1 트래픽은 네트워크 카드를 거치지 않고 운영체제 안에서만 돌기 때문에 일반 랜카드에서는 잡히지 않습니다 (2026-09-09 실측으로 확인 — 실험은 전부 lo에서 캡처했습니다). 윈도우에서는 Npcap Loopback Adapter를 고릅니다.

완료 기준 체크리스트

  • [ ] 인터페이스를 골라 캡처를 시작하고 멈출 수 있다
  • [ ] 디스플레이 필터 세 개 이상을 쓸 수 있다
  • [ ] 캡처 필터와 디스플레이 필터의 차이를 설명할 수 있다
  • [ ] tshark의 -f, -Y, -T fields를 각각 써 봤다
  • [ ] pcap 파일을 저장하고 다시 열 수 있다
  • [ ] 미션: 캡처 탐험 일지를 완성했다

6. 흔한 실수와 해결

벽 1. 캡처해도 아무것도 안 잡혀요

증상: 캡처를 시작했는데 목록이 텅 비어 있습니다.

원인: 루프백이나 쓰이지 않는 인터페이스를 골랐거나, 권한 부족입니다. 127.0.0.1 실험을 일반 랜카드에서 캡처한 경우도 여기 해당합니다.
해결: 첫 화면에서 파형이 움직이는 카드를 골랐는지 확인하세요. 내 컴퓨터 안 실험은 루프백에서만 잡힙니다. 리눅스에서는 캡처 권한(sudo 또는 wireshark 그룹)이 필요합니다.

벽 2. 캡처 필터 자리에 디스플레이 필터를 넣어요

증상 (2026-09-09 실측, tshark):

tshark: Invalid capture filter "tcp.port == 8000" for interface 'Loopback'.

That string looks like a valid display filter; however, it isn't a valid
capture filter (can't parse filter expression: syntax error).

원인: tcp.port == 8000은 디스플레이 필터 문법인데 캡처 필터(-f) 자리에 넣은 것입니다.
해결: 캡처 필터는 BPF 문법 tcp port 8000으로 고치세요. 친절하게도 오류 메시지가 "그건 디스플레이 필터처럼 보인다"고 알려 줍니다.

벽 3. 반대로 디스플레이 필터 자리에 캡처 필터를 넣어요

증상 (2026-09-09 실측, tshark):

tshark: "8000" was unexpected in this context.
    port 8000
         ^~~~
  Note: That read filter code looks like a valid capture filter;
        maybe you mixed them up?

원인: 벽 2의 거울상입니다. port 8000(BPF 문법)을 디스플레이 필터(-Y) 자리에 넣었습니다.
해결: 디스플레이 필터는 tcp.port == 8000으로 고치세요. GUI에서도 같은 혼동이 입력창 빨간색으로 나타납니다 — "지금 내가 어느 필터 자리에 있나"를 먼저 확인하는 습관이 답입니다.

벽 4. 패킷이 너무 많아서 못 찾겠어요

증상: 수만 줄 속에서 원하는 패킷이 묻힙니다.

원인: 필터 없이 보고 있습니다.
해결: 캡처 후라도 디스플레이 필터를 넣으면 목록이 걸러집니다. 그리고 다음부터는 "보기 전에 무엇을 볼지 정한다"를 습관화하세요. 급하면 Statistics → Conversations로 대화 쌍부터 봅니다.

벽 5. root로 실행하니 경고가 떠요

증상 (2026-09-09 실측, tshark):

Running as user "root" and group "root". This could be dangerous.

원인: 캡처는 날 패킷을 다루는 작업이라 관리자 권한이 필요한데, 관리자로 도는 프로그램은 실수의 대가도 큽니다.
해결: WSL 같은 랩 환경에서는 그대로 진행해도 됩니다. 본격 리눅스에서는 사용자를 wireshark 그룹에 넣어 일반 권한으로 캡처하는 설정이 표준입니다.


7. 정리

오늘의 개념

개념 한 줄 설명
캡처(capture) 네트워크 카드에 스치는 패킷을 통째로 녹화하는 것
무차별 모드 "내 것 아닌 패킷도 다 가져와" — 그래서 내 랩 전용
캡처 필터 잡기 전에 거르는 필터 (BPF 문법, port 53) — 파일이 작아짐
디스플레이 필터 잡은 후에 고르는 필터 (udp.port == 53) — 원본 보존
pcap 패킷 녹화 파일 — 재현 불가능한 현장을 가두는 형식
루프백 127.0.0.1 전용 통로 — 내 컴퓨터 안 실험은 여기서만 잡힘

오늘의 명령어·조작

명령·조작 하는 일
인터페이스 더블클릭 / 빨간 네모 캡처 시작 / 정지
필터 입력줄에 dns, http 디스플레이 필터 적용
tshark -i lo -f "tcp port 8000" 캡처 필터로 잡기 (잡기 전 필터)
tshark -r 파일 -Y http 디스플레이 필터로 보기 (잡은 후 필터)
tshark -r 파일 -T fields -e 필드명 원하는 열만 표로 추출
File → Save As pcap으로 현장 보존

명령어보다 중요한 감각

초보는 Wireshark를 "사건이 났을 때 여는 도구"로 생각하고, 고수는 평소에 엽니다. 내 컴퓨터가 조용할 때 어떤 대화를 하는지 많이 본 사람만이 이상을 즉시 알아봅니다. 위조지폐 감별사가 진짜 지폐만 수만 장 만진다는 이야기처럼, 정상의 데이터가 눈에 푹 배어야 이상이 튀어 보입니다.

그리고 두 필터의 구분은 Wireshark를 넘어 모든 관찰 도구에 통하는 사고법입니다 — "수집 단계에서 거를 것인가, 분석 단계에서 거를 것인가." 수집에서 거르면 가볍지만 복구가 불가능하고, 분석에서 거르면 무겁지만 유연합니다. 마지막으로, 캡처 파일은 날짜를 붙여 보관하세요. 보관함이 쌓이면 "우리 집 네트워크의 계절 변화"까지 보이기 시작합니다.


전부 체크되면 Step 83 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.