はじめに
物理的な荷物を追跡する際、配送ラベルを読むだけでどこへ行くのかは分かります。しかし、時には「箱の中に何が入っているのか」を知る必要があります。
ネットワーク分析において、IP アドレスやポートを見ることは、配送ラベル(パケットヘッダー)を読むことに似ています。しかし、Web ページのテキスト、ダウンロードしたファイル、あるいは暗号化されていないパスワードといった真に価値のある情報は、パケットのペイロードの中に隠されています。
このヘッダーとペイロードの区別は、サイバーセキュリティにおいて極めて重要です。ヘッダーは、トラフィックの送信元、送信先、使用されているプロトコルといったルーティングに関する疑問に答えます。一方、ペイロードは、何を要求し、何が返され、機密データが露出していないかといったコンテンツに関する疑問に答えます。熟練したアナリストは、解決しようとしている課題に応じて、これら 2 つの視点を使い分けます。
この実験では、tcpdumpを使用して「箱を開け」、ネットワークパケットの実際の内容を調査する方法を学びます。単なるラベルだけでなく、パケット全体を確実にキャプチャする方法や、人間とコンピュータの両方が読みやすい形式で生データを表示する方法を探ります。最後に、Linux のテキストツールを使用して、流れるネットワークトラフィックからプレーンテキストの機密情報を直接抽出する練習を行います。
スナップショット長(Snaplen)の拡張(パケット全体のキャプチャ)
パケットの中身を調べるには、まず tcpdump がパケット全体を確実にキャプチャできるようにする必要があります。デフォルトでは、古いバージョンの tcpdump や一部のネットワークツールは、ハードドライブの容量を節約するためにパケットの末尾を切り捨て、ヘッダーのみをキャプチャしようとします。
このトレードオフは、パケットキャプチャが常に「完全性」と「コスト」のバランスであることを示しています。短いパケットをキャプチャすればストレージ消費は少なく、処理も高速になりますが、これは混雑したネットワークでは重要です。一方、パケット全体をキャプチャすればより多くの証拠が残るため、トラブルシューティングやフォレンジックにおいて重要となります。常に正しいという万能な設定は存在しません。アナリストは、解決すべき課題、環境、およびパフォーマンスの予算に基づいて選択を行います。
1 つのパケットからキャプチャされるデータ量は「スナップショット長(snapshot length)」、略して snaplen と呼ばれます。ペイロードが必要な場合は、データを切り捨てないようツールに指示しなければなりません。これは -s フラグを使用して制御します。snaplen を 0 (-s 0) に設定するのは特別なテクニックで、tcpdump に対して可能な限り最大の長さを取得するよう指示し、データが欠落しないことを保証します。
バックグラウンド環境では、ポート 8080 でシンプルな Web サーバーが既に起動しています。データをクリーンにキャプチャするために、Linux の timeout コマンドを使用して、tcpdump を正確に 10 秒間だけ実行します。
以下のコマンドを実行してください。これはループバックインターフェース (lo) でキャプチャを開始し、ポート 8080 をフィルタリングし、パケット全体を取得 (-s 0) し、結果をバックグラウンドで ~/project/traffic.pcap に保存します(& 記号を使用):
sudo timeout 10 tcpdump -i lo port 8080 -s 0 -w ~/project/traffic.pcap &
tcpdump がバックグラウンドで静かに監視している間に、キャプチャ対象となる興味深い Web トラフィックを生成する必要があります。curl コマンドを使用して、ローカル Web サーバーから隠しファイルを要求します:
curl http://localhost:8080/secret.txt
SecretPayloadData123 というテキストが表示されます。これは Web サーバーが要求に応答したものです。10 秒間の timeout タイマーが終了し、バックグラウンドの tcpdump プロセスが終了するまで数秒待ちます。Enter キーを数回押すと、バックグラウンドジョブの完了メッセージが表示されるはずです。
すべてが正常に動作したことを確認するために、ディレクトリの内容をリスト表示してキャプチャファイルを確認します:
ls -l ~/project/traffic.pcap
traffic.pcap ファイルがサイズ 0 以上でリストされていれば、切り捨てられていない完全なパケットが安全にキャプチャされ、保存されたことが確認できます。
ASCII ペイロードの表示
パケット全体を正常に保存できたので、次はそれを開いて読み取る番です。基本的な Web サイト、FTP サーバー、古い Telnet システムなどのネットワークアプリケーションが通信する際、ペイロードデータは多くの場合、暗号化されていない単純なテキストとして送信されます。
これが、信頼できないネットワーク上で暗号化されていないプロトコルが危険と見なされる理由です。キャプチャファイル内のペイロードを人間が読めるのであれば、同じトラフィックを傍受した攻撃者も読むことができます。言い換えれば、パケット調査は単なる分析手法ではなく、現代のシステムが HTTPS や SSH のような暗号化プロトコルを優先する理由を思い出させるものでもあります。
このプレーンテキストを明らかにするために、tcpdump には -A フラグが用意されています。この便利なオプションは、パケット内のバイナリデータを人間が読める ASCII 文字に変換します。キャプチャファイルから読み取り可能な単語、エラーメッセージ、または露出した資格情報を素早くスキャンするのに最適な方法です。
-r フラグを使用して作成したキャプチャファイルを読み込み、-A フラグを組み合わせて ASCII コンテンツを表示します:
sudo tcpdump -r ~/project/traffic.pcap -A
テキストが流れる中で、出力を注意深く見てください。最初に技術的なパケットヘッダーが表示されますが、その中に混じって、実際に読める英語が表示されているはずです。
curl コマンドが送信した GET /secret.txt 要求と、それに続く Web サーバーの HTTP/1.0 200 OK 応答が簡単に見つかるはずです。サーバーの応答パケットの最後の方には、隠されていたペイロード SecretPayloadData123 がプレーンテキストで露出しているのがはっきりと確認できます。
...
E..e..@.@.............Q...P.P...P...*......
GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
Accept: */*
...
E.....@.@.............P...Q.P...P...*......
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
...
SecretPayloadData123
...
出力全体にランダムなドット (.) が散らばっていることに気づくでしょう。これは完全に正常な動作です。コンピュータは TCP/IP ヘッダーのような機械語をテキストとして表示しようとしますが、標準的なキーボード文字と一致しないバイナリ値を見つけると、代わりにドットを表示するからです。
16 進数と ASCII の表示(Hexdump)
ASCII 表示 (-A) はプレーンテキストをざっと確認するには素晴らしいものですが、複雑なコンピュータロジックを扱う場合には不十分です。バイナリプロトコル(DNS 要求や暗号化トラフィックなど)は ASCII モードではドットの海のように表示されてしまうため、ネットワークエンジニアにはより正確なツールが必要です。
16 進数(Hexadecimal)は、生のバイトを表現するためのコンパクトな方法であるため、低レベルのセキュリティ作業では頻繁に登場します。コンピュータはデータをバイナリで保存しますが、バイナリは人間が直接読むには扱いにくいものです。16 進数は実用的な中間地点として機能します。各 16 進数は 4 ビットのバイナリと正確に対応しているため、アナリストは 0 と 1 の長い文字列に溺れることなく、バイトレベルの構造を調査できます。
パケットの構造を最も正確に把握するには、-X フラグを使用します。これにより、出力が「Hexdump」として知られる構造化された形式に変換されます。データの正確な 16 進数(基数 16)値と ASCII テキストが並べて表示されるため、両方の利点を活かすことができます。
以下のコマンドを実行してキャプチャファイルを読み込み、詳細な Hexdump ビューを表示します:
sudo tcpdump -r ~/project/traffic.pcap -X
画面に表示された構造化されたデータブロックを調べてください。
...
0x0000: 4500 0065 1419 4000 4006 28b4 7f00 0001 E..e..@.@.(.....
0x0010: 7f00 0001 8152 1f90 50b9 1017 5018 0200 .....R..P...P...
0x0020: fe59 0000 4745 5420 2f73 6563 7265 742e .Y..GET./secret.
0x0030: 7478 7420 4854 5450 2f31 2e31 0d0a 486f txt.HTTP/1.1..Ho
0x0040: 7374 3a20 6c6f 6361 6c68 6f73 743a 3830 st:.localhost:80
...
出力は 3 つの明確な列に整理されています。
一番左の列(0x0000: で始まる)は、パケット内の正確なバイト位置を示す定規のようなものです。
中央の広いセクションには、生のパケットデータが 16 進数形式で表示されており、セキュリティアナリストが読みやすいように 2 バイト単位でグループ化されています。
最後に、一番右のセクションは、その行の 16 進データを馴染みのある ASCII 文字に変換しようとするもので、クイックリファレンスガイドとして機能します。
データを並べて表示することで、異常な文字の正確なバイナリ値を特定できます。これは複雑なネットワーク攻撃をリバースエンジニアリングする際に不可欠なスキルです。
プレーンテキストの HTTP ヘッダーの抽出
生の ASCII や Hexdump 出力を手動で検索することは小規模なテストでは許容されますが、数千のパケットを含む現実世界のキャプチャファイルを分析する場合、それは不可能な作業になります。
このステップでは、もう一つの重要なエンジニアリングの考え方を紹介します。強力なワークフローは、一つの巨大なツールに頼るのではなく、小さなツールを組み合わせることで生まれることが多いということです。tcpdump はパケットの読み取りに優れ、grep はテキストの検索に優れています。これらをパイプで接続することで、高速で適応性の高いワークフローを作成できます。この構成可能性こそが、Linux コマンドライン環境の決定的な強みの一つです。
これを解決するために、Linux ではツールを組み合わせることができます。tcpdump の ASCII 出力を取得し、それをテキスト検索ツールである grep にパイプ (|) で渡すことで、膨大なテキストストリームを即座にフィルタリングし、干し草の中から特定の針を見つけ出すことができます。
例えば、Web トラフィックを調査している場合、どの Web サイトが訪問されているか(Host ヘッダー)や、ユーザーがどのような Web ブラウザを使用しているか(User-Agent ヘッダー)を素早く把握したいかもしれません。
以下のコマンドを実行してください。ファイルを ASCII モードで読み込み、テキストを grep にパイプし、-E フラグを使用して "Host:"、"User-Agent:"、または "HTTP" を含む行を拡張検索します:
sudo tcpdump -r ~/project/traffic.pcap -A | grep -E "Host:|User-Agent:|HTTP"
即座に、雑然とした出力が Web トランザクションのクリーンで整理された要約に置き換わります:
GET /secret.txt HTTP/1.1
Host: localhost:8080
User-Agent: curl/7.81.0
HTTP/1.0 200 OK
Server: SimpleHTTP/0.6 Python/3.10.12
このワークフローは、サイバーセキュリティのインシデント対応において非常に強力です。検索ワードを入れ替えるだけで、この全く同じ手法を使用して、ネットワークキャプチャ全体から漏洩したパスワード(例:grep -i "password")、機密ファイル名、または既知の悪意のあるコマンド文字列を簡単に探し出すことができます。
まとめ
おめでとうございます!「パケット内容の調査」実験を無事に完了しました。
ネットワークパケットの外側を見るだけでなく、送信されている実際のデータに深く潜り込むスキルを習得しました。snaplen オプション (-s 0) を使用してパケットの切り捨てを無効にし、完全なキャプチャを保証する練習をしました。次に、-A フラグを使用して読み取り可能な ASCII ビューを、-X フラグを使用して正確で専門的な Hexdump 分解を行い、内容を明らかにしました。最後に、tcpdump と標準的な Linux テキストツールを組み合わせて、ノイズの中から特定のアプリケーションデータを自動的に探し出し、抽出するワークフローを構築しました。
これらのコアスキルは、ディープパケットインスペクション(DPI)の基礎となります。不明瞭なアプリケーションのバグをトラブルシューティングする場合でも、セキュリティ侵害の詳細なネットワークフォレンジックを行う場合でも、ワイヤー上を流れるものを正確に明らかにするツールを手に入れました。

