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 창은 세 층입니다.
- 맨 위 — 패킷 목록: 잡힌 패킷들이 한 줄씩 시간순으로 나열됩니다.
- 가운데 — 패킷 상세(Packet Details): 선택한 패킷을 계층별로 펼쳐 보여 줍니다. Step 80의
pkt.show()와 같은 구조입니다. - 맨 아래 — 패킷 바이트(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. 미션과 연습문제
미션 — 캡처 탐험 일지
- 캡처를 5분간 돌리며, 등장한 규약(Protocol 열)의 종류를 전부 적습니다.
dns필터로 질문-대답 한 쌍을 찾아, 어떤 이름을 물었고 어떤 주소를 받았는지 기록합니다.- 캡처 필터
tcp port 80으로 새 캡처를 시작하고 평문 사이트(예:http://neverssl.com)에 접속해, DNS/잡음 없이 웹 대화만 깔끔하게 잡힌 것을 확인합니다. - 같은 접속을 디스플레이 필터
http로도 걸러 보고, 3번과 결과가 어떻게 다른지(파일 내용 vs 화면) 비교 문장을 씁니다. - 캡처를
탐험일지.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 완료입니다. 사이드바의 체크박스를 눌러 진도를 저장하세요.