フィールドの抽出とフォーマット

WiresharkBeginner
オンラインで実践に進む

はじめに

ネットワークトラフィックの分析では、数千ものパケットから特定の情報を抽出する必要が頻繁にあります。パケットの要約を読むことは人間にとっては役立ちますが、自動化ツールやスクリプトには構造化されたデータが必要です。

ここで、パケット解析はデータエンジニアリングと交差します。人間はパケットの行を視覚的にスキャンできますが、コンピュータは情報が安定したフィールドや列に配置されているときに最も効率的に動作します。ネットワークトラフィックが構造化された出力に変換されると、検索、集計、グラフ化が可能になり、スプレッドシートへのインポートや、Python や SIEM パイプラインによる処理が可能になります。

この実験では、Wireshark のコマンドライン版である tshark を使用して、生のネットワークトラフィックを解析しやすい構造化フォーマットに変換する方法を学びます。デフォルトの人間向け出力を無効にし、特定のプロトコルフィールド(IP アドレス、DNS クエリ、HTTP User-Agent など)を選択し、結果を分析用にカンマ区切り値(CSV)形式でフォーマットする練習を行います。

デフォルト出力の無効化

このステップでは、tshark のデフォルトの出力動作を変更する方法を学びます。

デフォルトでは、tshark を使用してパケットキャプチャファイルを読み込むと、すべてのパケットに対して要約行が表示されます。この要約は人間が読むために設計されていますが、スクリプトで解析したりデータベースにインポートしたりするのは非常に困難です。特定のデータを抽出するには、まず tshark にこのデフォルトの要約の出力を停止させ、特定のフィールドを出力する準備をさせる必要があります。

重要な考え方は、要約は「提示」を目的としているのに対し、フィールドは「分析」を目的としているという点です。要約行は人間には便利に見えるかもしれませんが、わずかなフォーマットの変更が後続の自動化処理を壊す可能性があります。名前付きフィールドを抽出することで、他のツールが確実に処理できる予測可能な出力が得られます。

これを実現するには -T fields オプションを使用します。-T フラグは「Text output format(テキスト出力形式)」の略であり、これを fields に設定することで、指定した正確なデータフィールドのみを表示するように tshark に指示します。

ただし、どのフィールドが必要かを指定せずに -T fields だけを使用しても、tshark は何も出力しません。抽出する正確なフィールドを指定する -e フラグと組み合わせる必要があります。

まずは、サンプルキャプチャファイルからフレーム番号のみを抽出してみましょう。デフォルトの作業ディレクトリ /home/labex/project にいることを確認してください。

次のコマンドを実行して sample.pcap ファイルを読み込み、フレーム番号のみを抽出します。

tshark -r sample.pcap -T fields -e frame.number | head -n 5

-r フラグは、ライブトラフィックをキャプチャするのではなく、ファイルから読み込むよう tshark に指示します。コマンドの | head -n 5 の部分は、ターミナルが数字で溢れないように出力を最初の 5 行に制限しています。

以下のような出力が表示されるはずです。

1
2
3
4
5

標準の tshark 要約と比較して、出力がいかに整理されているかに注目してください。これが、ネットワークトラフィックから構造化データセットを構築するための基礎となります。

カスタム列フォーマットの使用

このステップでは、複数のフィールドを同時に抽出し、それらをカンマ区切り値(CSV)としてフォーマットする方法を学びます。

複数の -e フラグを使用すると、tshark は複数のフィールドを抽出し、それらを列に配置します。デフォルトでは、tshark はこれらの列を「タブ」文字で区切ります。タブ区切り値も便利ですが、CSV はスプレッドシート、データベース、Python の Pandas のような分析ツールにデータをインポートするための普遍的な標準です。

これは単なるフォーマットの詳細に思えるかもしれませんが、フォーマットの選択は次に何ができるかを決定します。セキュリティ業務では、パケットアナライザー、シェルパイプライン、スプレッドシート、ノートブック、ダッシュボードの間でデータを移動させることがよくあります。出力が他の場所へインポートしやすければ、単発のコマンドを再現可能なワークフローへとスケールアップさせるのが容易になります。

列を区切る文字を変更するには、-E separator= オプションを使用します。

フレーム番号、送信元 IP アドレス、宛先 IP アドレスを抽出し、CSV としてフォーマットしてみましょう。送信元および宛先 IP のフィールド名は ip.src および ip.dst です。

実際に IP アドレスを持つパケット(IP を持たない低レベルの ARP パケットなどをスキップするため)を確認するために、フィールド抽出と併せて -Y "ip" フィルタを使用します。

ターミナルで次のコマンドを実行してください。

tshark -r sample.pcap -Y "ip" -T fields -e frame.number -e ip.src -e ip.dst -E separator=, | head -n 5

以下のような出力が表示されるはずです。

12,127.0.0.1,127.0.0.11
13,127.0.0.11,127.0.0.1
14,127.0.0.1,127.0.0.11
15,127.0.0.11,127.0.0.1
16,172.60.1.88,104.18.26.120

最初の ARP パケットを除外したため、フレーム番号が 1 から始まっていないことに気づくでしょう。パケットに特定のフィールドが含まれていない場合、tshark はその列を空のままにするため、CSV 構造は維持されます。

DNS クエリの抽出

このステップでは、フィールド抽出と表示フィルタを組み合わせて、DNS トラフィックから特定の情報を分離・抽出する方法を学びます。

ネットワークトラフィックを分析する際、すべてのパケットからフィールドを抽出したいことは稀です。通常は特定のプロトコルに関心があります。-Y フラグを使用して、フィールドを抽出する前に表示フィルタを適用できます。

これは、結果を解釈する前に範囲を絞り込むもう一つの例です。関連のないプロトコルを一つのエクスポートに混ぜてしまうと、要求したフィールドが含まれていないパケットが多くなり、出力がまばらで混乱を招く結果となります。最初にフィルタリングを行うことで、結果として得られるデータセットの意味的な一貫性が保たれます。

例えば、ユーザーがどのウェブサイトにアクセスしようとしているかを確認したい場合、DNS クエリを見ることができます。DNS トラフィックの表示フィルタは単に dns です。クエリされているドメイン名を含む特定のフィールドは dns.qry.name です。

送信元 IP アドレスと DNS クエリ名を抽出しますが、DNS リクエストまたはレスポンスであるパケットのみを対象にします。

次のコマンドを実行してください。

tshark -r sample.pcap -Y "dns" -T fields -e ip.src -e dns.qry.name -E separator=, | head -n 5

出力は以下のようになります。

10.0.2.15,labex.io
168.63.129.16,labex.io
10.0.2.15,google.com
168.63.129.16,google.com

-Y "dns" と -T fields を組み合わせることで、他のネットワークプロトコルのバックグラウンドノイズをすべてフィルタリングし、CSV 出力に関連データのみが含まれるようにします。

HTTP User-Agent の抽出

この最後のステップでは、HTTP トラフィックから詳細な情報を抽出します。特に User-Agent 文字列に焦点を当てます。

User-Agent は、ウェブブラウザやクライアントがサーバーに送信する文字列で、使用されているソフトウェア(Chrome、Firefox、カスタムスクリプトなど)を識別します。セキュリティアナリストは、ネットワーク上の悪意のある自動化スクリプトや古いブラウザを特定するために、User-Agent を抽出することがよくあります。

User-Agent のようなメタデータは、コンテンツのすべてのバイトを検査しなくても動作に関する手がかりを与えるため有用です。ネットワーク防御において、多くの有益な判断は、ユーザーエージェント、ホストヘッダー、TLS サーバー名、DNS クエリ名などのコンテキストフィールドから得られます。これらは、アナリストが通常のアプリケーショントラフィックと疑わしい自動化を区別するのに役立ちます。

HTTP リクエストを分離するために、表示フィルタ http.request を使用できます。抽出したいフィールドは、送信元 IP (ip.src)、リクエストされたホストドメイン (http.host)、特定の URI パス (http.request.uri)、および User-Agent 文字列 (http.user_agent) です。

次のコマンドを実行して、この HTTP メタデータを CSV 形式で抽出します。

tshark -r sample.pcap -Y "http.request" -T fields -e ip.src -e http.host -e http.request.uri -e http.user_agent -E separator=,

以下のような出力が表示されるはずです。

10.0.2.15,example.com,/,curl/7.81.0
10.0.2.15,neverssl.com,/,LabEx-Custom-Agent/1.0

実験のセットアップ中に生成されたカスタム User-Agent LabEx-Custom-Agent/1.0 が正常に抽出されたことに注目してください。この手法は、自動レポートを作成したり、ネットワークデータをセキュリティ監視ダッシュボードに供給したりするために非常に強力です。

まとめ

この実験では、tshark を使用して生のネットワークパケットキャプチャを構造化された分析可能なデータに変換する方法を学びました。まず、-T fields を使用してデフォルトの人間向け出力を無効にしました。次に、-e フラグを使用して特定のデータポイントを選択し、-E separator=, を使用して CSV 形式にフォーマットする方法を学びました。最後に、これらのフォーマット技術と表示フィルタ (-Y) を組み合わせて、DNS クエリ名や HTTP User-Agent 文字列などの非常に具体的な情報を抽出しました。これらのスキルは、ネットワーク分析を自動化し、パケットデータを他のセキュリティツールと統合するために不可欠です。