Wireshark とは
Wireshark はネットワークインターフェースを流れるパケットをリアルタイムにキャプチャ・解析できる、世界で最も広く使われるパケットアナライザーだ。ネットワーク診断ツールとして開発されたが、セキュリティの現場では「通信の真実」を直接確認する手段として欠かせない存在になっている。
活用場面:
- ネットワークのトラブルシューティング(「なぜつながらないか」をパケットで確認)
- プロトコルの動作を視覚的に理解する(TCPハンドシェイクの実際の流れなど)
- セキュリティインシデントのフォレンジクス調査
- 平文通信(HTTP・FTP・Telnet)における認証情報の可視化
- CTFのネットワーク問題を解く
KaliにはWiresharkがプリインストールされている。キャプチャにはroot権限またはwiresharkグループへの追加が必要だ。以下のコマンドでグループ追加後、再ログインすること。
sudo usermod -aG wireshark $USER
newgrp wireshark Wireshark の基本操作
インターフェースの選択
Wiresharkを起動すると、利用可能なネットワークインターフェースの一覧が表示される。
eth0 - 有線LAN(演習環境のメイン通信インターフェース)
lo - ループバック(ローカル通信のテスト用)
wlan0 - 無線LAN
any - すべてのインターフェース(同時キャプチャ)
演習環境では eth0(Metasploitable 2 との通信が流れるインターフェース)を選択する。
パケットリストの3ペイン表示
Wireshark の画面は3つのペインで構成されており、パケットを階層的に掘り下げて確認できる。
┌─────────────────────────────────────────────────────────┐
│ No. │ Time │ Source │ Destination │ Protocol│ ← パケットリスト
├─────────────────────────────────────────────────────────┤
│ Frame 1: ... bytes │
│ ▼ Ethernet II, Src: ... │ ← プロトコル詳細
│ ▼ Internet Protocol, Src: 192.168.56.102 │
│ ▼ Transmission Control Protocol │
│ ▼ Hypertext Transfer Protocol │
├─────────────────────────────────────────────────────────┤
│ 00 1a 2b 3c 4d 5e 6f 70 81 92 a3 b4 .... GET / │ ← バイト表示(16進)
└─────────────────────────────────────────────────────────┘
キャプチャフィルター(Capture Filters)
キャプチャ開始前に設定するフィルターだ(BPF構文)。条件に合うパケットのみを記録するため、大量のトラフィックから必要な通信だけを絞り込める。
# 特定のホストとの通信のみ
host 192.168.56.101
# 特定のポートのみ
port 80
# HTTP/HTTPS通信のみ
tcp port 80 or tcp port 443
# FTP通信のみ(制御チャネル)
tcp port 21
# 特定のIPレンジから
src net 192.168.56.0/24
# ICMPのみ(pingのキャプチャ)
icmp
# Metasploitable 2 との全通信(ARPは除外して見やすくする)
host 192.168.56.101 and not arp
表示フィルター(Display Filters)
キャプチャ後にリアルタイムで絞り込むフィルターだ。Wireshark独自の強力な構文を使えるため、複雑な条件での絞り込みが可能だ。
# HTTPトラフィックのみ
http
# 特定のIPアドレスとの通信(送受信両方)
ip.addr == 192.168.56.101
# 送信元IPで絞り込み
ip.src == 192.168.56.101
# 特定ポートのTCP
tcp.port == 80
# DNSクエリのみ
dns
# HTTPのGETリクエスト
http.request.method == “GET”
# HTTPのPOSTリクエスト(ログインフォームなど)
http.request.method == “POST”
# HTTP 200以外のレスポンス(エラーの調査)
http.response.code != 200
# TLSハンドシェイクのみ(HTTPS接続の確立を見る)
tls.handshake
# ARPパケット(ARPスプーフィング検出)
arp
# TCPの再送パケット(ネットワーク問題の診断)
tcp.analysis.retransmission
演習1: HTTP Basic 認証の平文キャプチャ
HTTP Basic 認証がいかに危険かを実際のパケットで確認する。Metasploitable 2 には HTTP Basic 認証が設定されたページ(WebDAV)がある。
キャプチャの準備
# tshark でバックグラウンドキャプチャ開始
sudo tshark -i eth0 -f “host 192.168.56.101 and tcp port 80”
-w /tmp/http_basic_auth.pcap &
# Kali のブラウザまたは curl で Metasploitable の認証ページにアクセス
# Metasploitable 2 の WebDAV ページは Basic 認証が設定されている
curl -v http://192.168.56.101/dav/
# 認証情報を含めたリクエスト
curl -v -u msfadmin:msfadmin http://192.168.56.101/dav/
# キャプチャ停止
sudo pkill tshark
キャプチャ結果の解析
# HTTP Authorizationヘッダーを含むパケットを抽出
tshark -r /tmp/http_basic_auth.pcap -Y “http.authorization”
-T fields -e http.authorization
# 出力例:
# Basic bXNmYWRtaW46bXNmYWRtaW4=
# Base64デコードで平文を確認(Base64はエンコードであり暗号化ではない)
echo “bXNmYWRtaW46bXNmYWRtaW4=” | base64 -d
# 出力例:
# msfadmin:msfadmin
# HTTP通信全体を確認
tshark -r /tmp/http_basic_auth.pcap -Y “http” -T fields
-e http.request.method
-e http.request.uri
-e http.authorization
-e http.response.code
Wireshark GUI での確認手順
/tmp/http_basic_auth.pcapをWiresharkで開く- 表示フィルターに
http.authorizationを入力 - 対象パケットをクリック → 「Hypertext Transfer Protocol」を展開
Authorization: Basic bXNmYWRtaW46bXNmYWRtaW4=が平文で確認できる
「フォローTCPストリーム」でリクエスト全体を見る:
- 対象パケットを右クリック → フォローTCPストリーム
- 以下のようなHTTP通信が平文で表示される:
GET /dav/ HTTP/1.1
Host: 192.168.56.101
Authorization: Basic bXNmYWRtaW46bXNmYWRtaW4=
User-Agent: curl/7.88.1
HTTP/1.1 200 OK
Server: Apache/2.2.8 (Ubuntu) DAV/2
Content-Type: text/html; charset=UTF-8
<!DOCTYPE HTML ...>
演習2: Telnet 通信の全盗聴
Telnetは認証情報を含むすべての通信が完全な平文だ。1文字タイプするたびにそのキャラクターがネットワークを流れる。
# Telnet 通信をキャプチャしながら接続
sudo tshark -i eth0 -f “tcp port 23” -w /tmp/telnet_session.pcap &
# 別のターミナルで Telnet 接続(Metasploitable 2 へ)
telnet 192.168.56.101
# ユーザー名: msfadmin
# パスワード: msfadmin
# (セッション内でコマンドを実行)
# whoami
# id
# exit
sudo pkill tshark
# TCPストリームでセッション全体を確認(操作内容がすべて見える)
tshark -r /tmp/telnet_session.pcap -z “follow,tcp,ascii,0”
# ログイン〜コマンド実行〜ログアウトまでの全操作が平文で再現される
演習3: DNS クエリの解析
DNS クエリは通常 UDP ポート53を使う平文プロトコルだ。どのドメインを誰が調べているかが筒抜けになる。DNS over HTTPS(DoH)が普及しつつある背景がこれだ。
# DNSクエリをキャプチャ(UDPポート53)
sudo tshark -i eth0 -f “udp port 53” -w /tmp/dns_capture.pcap &
# Kali Linux から名前解決を実行
nslookup metasploitable 192.168.56.101 dig @192.168.56.101 localhost host -t any localhost 192.168.56.101
sudo pkill tshark
# DNS クエリ・応答の一覧表示
tshark -r /tmp/dns_capture.pcap -Y “dns” -T fields
-e dns.qry.name
-e dns.a
-e dns.flags.response
# 出力例:
# localhost (クエリ)
# localhost 127.0.0.1 1 (応答 - Aレコード)
# 特定ドメインへの全クエリを抽出
tshark -r /tmp/dns_capture.pcap -Y “dns.qry.name contains “local""
Wireshark での DNS 表示フィルター活用
# DNSクエリと応答を表示
dns
# 特定ドメインへのDNSクエリ
dns.qry.name contains “metasploitable”
# DNSレスポンスのみ(フラグ: response=1)
dns.flags.response == 1
# 短時間に大量の DNS クエリが集中している(DNSトンネリングの疑い)
dns and frame.time_delta < 0.01
演習4: FTP 通信の解析
FTPも平文プロトコルだ。ログイン認証情報がそのまま見える。現在も FTP を使っているシステムがあれば、すぐに SFTP または FTPS への移行を検討すべきだ。
# FTP 通信をキャプチャ
sudo tshark -i eth0 -f “tcp port 21” -w /tmp/ftp_capture.pcap &
# FTP 接続(Metasploitable 2 の vsftpd 2.3.4)
ftp 192.168.56.101
# Name: msfadmin
# Password: msfadmin
# ftp> ls
# ftp> quit
sudo pkill tshark
# FTP コマンドと応答を確認
tshark -r /tmp/ftp_capture.pcap -Y “ftp” -T fields
-e ftp.request.command
-e ftp.request.arg
-e ftp.response.code
-e ftp.response.arg
# 出力例:
# 220 vsFTPd 2.3.4
# USER msfadmin 331 Please specify the password.
# PASS msfadmin 230 Login successful. ← パスワードが平文で見える
# LIST 150 Here comes the directory listing.
# 226 Directory send OK.
# QUIT 221 Goodbye.
FTP の PASS コマンドに続くパスワードが完全な平文でネットワークを流れる。同一ネットワーク上であれば ARP スプーフィングなどの中間者攻撃を行うことで、別セグメントの通信も傍受できてしまう。FTP の代わりに SFTP(SSH経由のファイル転送)または FTPS(TLS上のFTP)を使うこと。
tshark コマンドライン活用集
Wireshark のコマンドライン版 tshark はスクリプト化・自動化に非常に便利だ。インシデント対応でサーバーに SSH して調査する場面でも活躍する。
# リアルタイムで HTTP リクエストを監視(誰が何にアクセスしているか)
sudo tshark -i eth0 -Y “http.request” -T fields
-e ip.src
-e http.request.method
-e http.request.full_uri
# pcap から HTTP POST のボディを抽出(フォーム送信内容の確認)
tshark -r capture.pcap -Y “http.request.method == POST”
-T fields -e http.file_data
# IP 別の通信量ランキング(大量通信しているホストの特定)
tshark -r capture.pcap -qz “conv,ip” | sort -k5 -rn | head -10
# TCP 接続の統計(接続数・バイト数)
tshark -r capture.pcap -qz “conv,tcp”
# プロトコル別の統計(通信の全体像を把握)
tshark -r capture.pcap -qz “io,phs”
# 特定の TCPストリームのみ抽出(stream番号を指定)
tshark -r capture.pcap -Y “tcp.stream == 0” -w stream_0.pcap
# HTTP ホスト名の一覧抽出(どのサイトに通信したか)
tshark -r capture.pcap -Y “http.host” -T fields -e http.host | sort -u
# TLS SNI(HTTPS接続先のドメイン名)を抽出
tshark -r capture.pcap -Y “tls.handshake.type == 1” -T fields
-e tls.handshake.extensions_server_name
演習チャレンジ: 通信から情報を読み取れ
ミッション1: Basic認証の解読
curl -u msfadmin:msfadmin http://192.168.56.101/dav/ を実行しながら tshark でキャプチャし、Base64 エンコードされた認証文字列をデコードせよ。
ミッション2: Telnet 全操作の記録
Telnet で Metasploitable 2 に接続し、whoami・id・uname -a を実行。その全操作を tshark でキャプチャし、-z "follow,tcp,ascii,0" で完全な操作ログを再現せよ。
ミッション3: DNS 逆引きの確認
dig -x 127.0.0.1 @192.168.56.101 を実行してDNS逆引きクエリをキャプチャし、クエリタイプ(PTR)と応答内容を Wireshark で確認せよ。
ミッション4: FTP パッシブモード解析
ftp 192.168.56.101 で接続し ls コマンドを実行してキャプチャ。FTP のアクティブモードとパッシブモードで制御チャネル(21番)とデータチャネル(20番または動的ポート)がどのように分かれているかを観察せよ。
ミッション5: HTTP ストリーム全体の追跡
Wireshark で http フィルターを適用し、POSTリクエストを右クリック → フォローHTTPストリーム でリクエスト・レスポンスの全体を確認せよ。
実際のマルウェア感染時のパケットキャプチャサンプルを提供している malware-traffic-analysis.net では、実際の悪意ある通信パターンを安全に学習できる。tshark で統計を取り、どのような通信が「異常」に見えるかを体験してほしい。SOC アナリストが日常的に行う作業だ。
トラブルシューティング
Wireshark でインターフェースが表示されない・権限エラー
# wireshark グループに追加
sudo usermod -aG wireshark $USER
# 再ログインまたは以下でグループ切替
newgrp wireshark
# dumpcap の実行権限確認
ls -la /usr/bin/dumpcap
# -rwxr-x--- 1 root wireshark … となっているか確認
# それでも失敗する場合は root で実行
sudo wireshark
tshark でキャプチャが取れない
# 利用可能なインターフェースを確認
sudo tshark -D
# 出力例:
# 1. eth0
# 2. lo (Loopback)
# 3. any
# インターフェース番号またはデバイス名で指定
sudo tshark -i 1 sudo tshark -i eth0
パケットが表示されない(通信が流れているはずなのに)
- フィルターが厳しすぎないか確認(一時的にフィルターを外す)
- Metasploitable 2 のIPアドレスが正しいか
arp -nで確認 - ホストオンリーネットワークのインターフェース名を確認(
eth1やvboxnet0の場合もある)
pcap ファイルが大きくなりすぎる
# ファイルを100MBごとにローテーション
sudo tshark -i eth0 -b filesize:102400 -w /tmp/capture_%Y%m%d_%H%M%S.pcap
# 最大5000パケットのみ取得
sudo tshark -i eth0 -c 5000 -w /tmp/capture_limited.pcap
Wiresharkの「表示フィルター(Display Filter)」と「キャプチャフィルター(Capture Filter)」の違いはどれですか?