Lua スクリプトで Tshark を拡張する

WiresharkWiresharkBeginner
今すぐ練習

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、Lua スクリプトを使用して Wireshark のパケット解析機能を拡張する方法を学びます。コマンドラインオプションを介してカスタムスクリプトを読み込み、引数を渡して機能を強化する方法を探ります。

演習では、Lua スクリプトの作成、Wireshark の tshark コマンドでのテスト、および出力の検証を行います。空のキャプチャでスクリプトを実行する練習をし、詳細なパケット情報を解釈する方法を学びます。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL wireshark(("Wireshark")) -.-> wireshark/WiresharkGroup(["Wireshark"]) wireshark/WiresharkGroup -.-> wireshark/packet_analysis("Packet Analysis") wireshark/WiresharkGroup -.-> wireshark/commandline_usage("Command Line Usage") subgraph Lab Skills wireshark/packet_analysis -.-> lab-548926{{"Lua スクリプトで Tshark を拡張する"}} wireshark/commandline_usage -.-> lab-548926{{"Lua スクリプトで Tshark を拡張する"}} end

-X lua_script:script.lua でスクリプトを読み込む

このステップでは、-X オプションを使用して Wireshark で Lua スクリプトを読み込む方法を学びます。Lua は軽量なスクリプト言語で、Wireshark と良好に統合されており、コアプログラムを変更することなく、カスタムパケット解析のための機能を拡張することができます。

まず、デフォルトの作業ディレクトリに簡単な Lua スクリプトを作成しましょう。このスクリプトは、Wireshark が Lua コードを正常に読み込んで実行できることを検証するための基本的なテストケースとして機能します。

  1. ターミナルを開き、~/project ディレクトリにいることを確認します。ここに Lua スクリプトを作成して保存します。

    cd ~/project
  2. nano を使用して、script.lua という名前の新しい Lua スクリプトファイルを作成します。nano はシンプルで、ほとんどの Linux 環境で利用できるため使用しています。

    nano script.lua
  3. 読み込まれたときにメッセージを出力する次の基本的な Lua コードを追加します。これは、最も基本的な操作であるスクリプトの実行を検証するものです。

    -- Simple Wireshark Lua script
    print("Wireshark Lua script loaded successfully!")
  4. ファイルを保存し (Ctrl+O, Enter)、nano を終了します (Ctrl+X)。これでスクリプトは Wireshark で読み込める状態になりました。

では、Wireshark のコマンドラインインターフェイスを使用してこのスクリプトを読み込みましょう。実際のネットワークトラフィックを処理せずにスクリプトをテストするために、特別なパラメータの組み合わせを使用します。

wireshark -X lua_script:script.lua -r /dev/null -k

このコマンドの各部分が何をするかを分解してみましょう。

  • -X lua_script:script.lua は、Wireshark に Lua スクリプトファイルを読み込むよう指示します。
  • -r /dev/null は、空のキャプチャファイルを指定します (パケットを解析するのではなく、スクリプトの読み込みをテストしているだけです)。
  • -k は、ユーザー入力を待たずにすぐにキャプチャを開始します。

このコマンドを実行すると、ターミナル出力に "Wireshark Lua script loaded successfully!" というメッセージが表示されるはずです。これは、Wireshark が Lua スクリプトを正常に見つけ、読み込み、実行したことを確認するものです。このメッセージが表示されない場合は、スクリプトファイルが正しい場所に存在し、構文エラーがないことを確認してください。

-X lua_script1:arg1 で引数を渡す

このステップでは、-X lua_script1: オプションを使用して Wireshark の Lua スクリプトに引数を渡す方法を学びます。この手法は、スクリプト自体を毎回変更することなく、異なる入力を受け取ることでスクリプトをより柔軟にする場合に便利です。

まず、Wireshark の Lua 環境で引数の渡し方を理解しましょう。-X lua_script1: オプションを使用すると、文字列値をスクリプトに送信でき、その値は get_string() 関数を使用してアクセスできます。これは、他のプログラミング言語でのコマンドライン引数の動作と似ています。

既存の Lua スクリプトを変更して、引数を受け取り処理できるようにしましょう。

  1. 前のステップで作成した script.lua ファイルを開きます。

    nano ~/project/script.lua
  2. 引数を受け取り表示する次のコードで内容を置き換えます。

    -- Lua script with argument handling
    local arg1 = get_string("lua_script1")
    print("Received argument: " .. (arg1 or "no argument provided"))

    get_string("lua_script1") 関数は、-X lua_script1: で渡された引数を取得します。or "no argument provided" の部分は、引数が指定されなかった場合のデフォルトメッセージを提供します。

  3. ファイルを保存し (Ctrl+O, Enter)、nano を終了します (Ctrl+X)。

では、引数を指定してスクリプトを実行しましょう。

wireshark -X lua_script:script.lua -X lua_script1:test123 -r /dev/null -k

このコマンドを分解してみましょう。

  • -X lua_script:script.lua は、Lua スクリプトファイルを読み込みます。
  • -X lua_script1:test123 は、"test123" を引数としてスクリプトに渡します。
  • -r /dev/null は、空のキャプチャファイルを指定します (スクリプトのテストを行っているだけなので)。
  • -k は、ユーザー入力を待たずにすぐにキャプチャを開始します。

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

Received argument: test123

スクリプトが異なる入力でも動作することを確認するために、別の値を指定して実行してみましょう。

wireshark -X lua_script:script.lua -X lua_script1:another_value -r /dev/null -k

これにより、同じスクリプトを異なる引数で再利用できることがわかり、分析をより動的にし、さまざまなシナリオに適応させることができます。

-r capture.pcap でファイルを処理する

このステップでは、Wireshark のコマンドラインツールである Tshark の -r オプションを使用して、事前に記録されたネットワークキャプチャファイルを処理する方法を学びます。これは、ライブパケットをキャプチャするのではなく、保存されたネットワークトラフィックを分析したい場合に便利です。

まず、作業対象となるサンプルのパケットキャプチャファイルが必要です。PCAP ファイルには、分析できる実際のネットワークトラフィックデータが含まれています。標準的な HTTP トラフィックのサンプルをダウンロードしましょう。

  1. サンプルの pcap ファイルをプロジェクトディレクトリにダウンロードします。

    wget https://wiki.wireshark.org/SampleCaptures/http.cap -O ~/project/capture.pcap
  2. ファイルのサイズと場所を確認して、正しくダウンロードされたことを検証します。

    ls -lh ~/project/capture.pcap

では、このキャプチャファイルを分析するように Lua スクリプトを変更しましょう。このスクリプトは、ファイル内のすべてのパケットをカウントし、合計を報告します。以下は更新方法です。

  1. スクリプトを編集用に開きます。

    nano ~/project/script.lua
  2. このパケットカウントロジックで内容を更新します。

    -- Packet counter script
    local arg1 = get_string("lua_script1") or "default"
    local packet_count = 0
    
    -- Called for each packet
    function tap.packet(pinfo,tvb)
        packet_count = packet_count + 1
    end
    
    -- Called after processing all packets
    function tap.draw()
        print("Argument received: " .. arg1)
        print("Total packets processed: " .. packet_count)
    end
    
    -- Register the tap
    tap = Listener.new()
  3. ファイルを保存し (Ctrl+O, Enter)、nano を終了します (Ctrl+X)。

では、キャプチャファイルに対してスクリプトを実行しましょう。このコマンドは Tshark に以下のことを指示します。

  • Lua スクリプトを使用する (-X lua_script)
  • スクリプトに引数を渡す (-X lua_script1)
  • ダウンロードしたファイルを処理する (-r)
  • GUI なしで静かに実行する (-q)
wireshark -X lua_script:script.lua -X lua_script1:analysis -r ~/project/capture.pcap -q

処理後、以下の内容が表示されるはずです。

  • スクリプトに渡した引数
  • カウントされたパケットの総数

出力例:

Argument received: analysis
Total packets processed: 83

-V でカスタム出力を確認する

このステップでは、Wireshark の -V(詳細表示)オプションを使用して、Lua スクリプトの出力を検証する方法を探ります。これは、標準的なパケット情報とともに、カスタムスクリプトからの詳細な分析結果を確認する必要がある場合に特に有用です。

まず、より意味のある統計情報を提供するように Lua スクリプトを改良しましょう。異なるプロトコルタイプを追跡するように変更します。

  1. nano でスクリプトを編集用に開きます。

    nano ~/project/script.lua
  2. HTTP と TCP パケットをカウントするこの拡張版でスクリプトを更新します。

    -- Enhanced packet analyzer
    local arg1 = get_string("lua_script1") or "default"
    local stats = {
        total = 0,
        http = 0,
        tcp = 0
    }
    
    function tap.packet(pinfo,tvb)
        stats.total = stats.total + 1
        if pinfo.visited then return end
    
        if pinfo.protocols:find("http") then
            stats.http = stats.http + 1
        end
        if pinfo.protocols:find("tcp") then
            stats.tcp = stats.tcp + 1
        end
    end
    
    function tap.draw()
        print("=== Analysis Report ===")
        print("Argument received: " .. arg1)
        print("Total packets: " .. stats.total)
        print("HTTP packets: " .. stats.http)
        print("TCP packets: " .. stats.tcp)
        print("======================")
    end
    
    tap = Listener.new()
  3. ファイルを保存し (Ctrl+O, Enter)、nano を終了します (Ctrl+X)。

では、詳細出力を有効にしてスクリプトを実行しましょう。-V フラグは、Wireshark に利用可能なすべての情報、包括的にはカスタムスクリプトの出力も表示するよう指示します。

wireshark -X lua_script:script.lua -X lua_script1:final_run -r ~/project/capture.pcap -q -V

パケットの詳細とスクリプトの分析結果の両方を示す、次のような出力が表示されるはずです。

=== Analysis Report ===
Argument received: final_run
Total packets: 83
HTTP packets: 10
TCP packets: 83
======================

この出力を将来的な参照用に保存するには、それをファイルにリダイレクトします。

wireshark -X lua_script:script.lua -X lua_script1:final_run -r ~/project/capture.pcap -q -V > ~/project/analysis_output.txt

最後に、ファイルの内容を表示することで、保存された出力を検証します。

cat ~/project/analysis_output.txt

まとめ

この実験では、コマンドライン操作を通じて Lua スクリプトを使用して Wireshark の機能を拡張する方法を学びました。主要な手順には、-X lua_script:script.lua オプションで Lua スクリプトを読み込み、Wireshark のコマンドラインインターフェース (CLI) でテストすることが含まれていました。

さらに、-X lua_script1:arg1 を使用して Lua スクリプトに引数を渡す方法を調べ、外部パラメータを受け取る柔軟なスクリプトの作成方法を実証しました。この手法により、カスタマイズ可能な Lua 拡張機能を通じて Wireshark のパケット分析機能が強化されます。