Wireshark で SSL/TLS トラフィックを復号化する

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

はじめに

この実験では、有名なネットワークプロトコルアナライザである Wireshark を使用して、SSL/TLS トラフィックを復号化する方法を学びます。SSL/TLS 暗号化は、インターネット通信を保護するために一般的に使用されています。ただし、トラブルシューティングやセキュリティ分析などの場合、暗号化されたトラフィックを復号化することが不可欠になります。

この実験では、Wireshark を設定して SSL/TLS トラフィックを復号化するプロセスを案内します。制御された環境で実践的な経験を提供します。

Wireshark での SSL/TLS 復号化の設定

このステップでは、Wireshark を設定して SSL/TLS トラフィックを復号化します。まずは、やろうとしていることについて少し理解しましょう。SSL/TLS は、インターネット通信を安全にするために使用されるプロトコルです。SSL/TLS を使用してインターネット上でデータを送信する場合、その機密性を保護するために暗号化されます。このトラフィックを復号化して実際のデータを見るには、Wireshark が暗号化キーにアクセスする必要があります。これらのキーは、プレマスターシークレットログファイルと呼ばれる特別なファイルに保存されています。ここでこのファイルを作成しましょう。

Wireshark は、TLS トラフィックを復号化するために暗号化キーにアクセスする必要があります。これらのキーは、プレマスターシークレットログファイルと呼ばれるものに保存されており、ここで作成します。

  1. ターミナルを開きます。ターミナルは、コンピュータのオペレーティングシステムと対話するためのコマンドを入力できるテキストベースのインターフェイスです。ターミナルを開いたら、/home/labex/project/ ディレクトリに pre_master_secret.log という名前の新しいファイルを作成します。このファイルは、復号化に必要な TLS セッションキーを保存するために使用されます。ファイルを作成するには、ターミナルに以下のコマンドを入力します。

    touch /home/labex/project/pre_master_secret.log

    このコマンドは、後で復号化に必要な TLS セッションキーを保存する空のファイルを作成します。

  2. ログファイルが準備できたので、Wireshark がそれを使用するように設定する必要があります。まず、ターミナルに以下のコマンドを入力して Wireshark を開きます。

    wireshark

    Wireshark が開いた後、上部にメニューバーが表示されます。Edit > Preferences をクリックします。これにより、Wireshark のさまざまな設定をカスタマイズできるウィンドウが開きます。Preferences ウィンドウで、左側のパネルを見てください。Protocols というセクションがあります。それをクリックしてから、TLS が見つかるまで下にスクロールします。

    TLS 設定では、(Pre)-Master-Secret log filename というラベルの付いたフィールドがあります。ここに、先ほど作成したプレマスターキーログファイルの場所を Wireshark に教えます。ファイルの完全なパスを入力します。

    /home/labex/project/pre_master_secret.log

    ウィンドウはこれと似たような外観になるはずです。

    ![Wireshark TLS Preferences](https://file.labex.io/namespace/33fa8aba-d546-42e9-9692-64968aeaf0cc/cybersecurity/ws_decrypt_ssl_tls/lab-cipher-quest-tls-decrypting-guide/ja/../assets/lab - CipherQuestTLSDecryptingGuide - step1 - image1.png)

    パスを入力したら、OK をクリックして変更を保存します。これで、Wireshark は TLS トラフィックを復号化するためにこのファイルを使用するように設定されました。つまり、SSL/TLS トラフィックをキャプチャすると、Wireshark はログファイル内のキーを使用してデータを復号化し、実際の内容を表示することができます。

SSL/TLS トラフィックのキャプチャ

このステップでは、Wireshark を使用して SSL/TLS トラフィックをキャプチャし、Python スクリプトで安全なトラフィックを生成します。SSL/TLS は、ネットワークを介した安全な通信を提供するプロトコルです。このトラフィックをキャプチャすることで、後で分析することができ、ネットワークの問題のデバッグやセキュリティ脅威の検出などのタスクに重要です。

  1. まず、ネットワークトラフィックをキャプチャしましょう。Wireshark では、ネットワークインターフェイスは、コンピュータがデータを送受信するための接続です。キャプチャしたいトラフィックに適したインターフェイスを選択する必要があります。利用可能なネットワークインターフェイスのリストを探します。eth1 インターフェイスをクリックして選択します。このインターフェイスを通って、キャプチャしたいトラフィックが流れます。その後、ツールバーの Start ボタン(青いサメのヒレのアイコン)をクリックして、パケットのキャプチャを開始します。

    Wireshark は、選択したインターフェイス上のすべてのネットワークトラフィックをキャプチャします。キャプチャ中に、メインウィンドウにパケットが表示され始めます。各パケットは、ネットワークを介して送信される小さなデータ単位を表します。

  2. 次に、分析できる SSL/TLS トラフィックを生成する必要があります。新しいターミナルウィンドウを開きます。ターミナルは、コンピュータと対話するためのコマンドを実行できるコマンドラインインターフェイスです。以下のコマンドを使用して、プロジェクトディレクトリに移動します。

    cd /home/labex/project/

    このコマンドは、現在の作業ディレクトリをプロジェクトディレクトリに変更します。ウェブサイトへの安全な接続を確立する Python スクリプトを作成します。Python は、さまざまなタスクを実行するためのスクリプトを書くことができるプログラミング言語です。nano テキストエディタを使用して、tls_client.py という名前の新しいファイルを作成します。

    nano tls_client.py

    nano テキストエディタは、ターミナルで使用する簡単なテキストエディタです。以下の Python コードをエディタにコピーして貼り付けます。

    #!/usr/bin/env python3
    
    import ssl
    import socket
    import os
    
    HOST = "example.com"
    PORT = 443
    
    ## Set the path for the pre-master secret log file
    os.environ['SSLKEYLOGFILE'] = '/home/labex/project/pre_master_secret.log'
    
    ## Create an SSL/TLS context
    context = ssl.create_default_context(ssl.Purpose.SERVER_AUTH)
    
    ## Create a socket and wrap it with SSL/TLS
    with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as sock:
        with context.wrap_socket(sock, server_hostname=HOST) as ssock:
            ssock.connect((HOST, PORT))
    
            ## Send a simple HTTP GET request
            request = "GET / HTTP/1.1\r\nHost: example.com\r\n\r\n"
            ssock.sendall(request.encode())
    
            ## Receive the response and print all the received data
            data = ssock.recv(4096)
            print(data.decode())

    このスクリプトは以下のことを行います。

    • TLS セッションキーを保存する場所を指定する環境変数を設定します。これらのキーは、後で SSL/TLS トラフィックを復号化するために重要です。
    • example.com への安全な接続を確立します。sslsocket ライブラリを使用してこの接続を確立します。
    • 基本的な HTTP リクエストを送信します。このリクエストは、サーバーに example.com のメインページを要求します。
    • サーバーのレスポンスを受信して表示します。

    Ctrl+O を押してから Enter を押してファイルを保存し、Ctrl+X を押して nano を終了します。

    ここで、スクリプトを実行して TLS トラフィックを生成します。

    python3 tls_client.py

    example.com からの HTTP レスポンスが表示されるはずです。これは、スクリプトが安全な接続を正常に確立したことを確認します。スクリプトはまた、TLS セッションキーをプレマスターシークレットログファイルに書き込みます。このファイルは、Wireshark が復号化に使用します。

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

    HTTP/1.1 200 OK
    Age: 558804
    Cache-Control: max-age=604800
    Content-Type: text/html; charset=UTF-8
    Date: ...
    ...
  3. TLS トラフィックを生成したら、Wireshark に戻り、ツールバーの赤い Stop ボタンをクリックしてキャプチャを停止します。キャプチャしたトラフィックを保存するために、キャプチャを停止する必要があります。

    キャプチャしたトラフィックを分析用に保存するには、メニューバーの File をクリックし、Save As... を選択します。保存ダイアログで、/home/labex/project/ に移動し、ファイル名を tls_traffic.pcapng に指定して、Save をクリックします。.pcapng ファイル形式は、ネットワークトラフィックキャプチャを保存するための標準形式です。

    Save Captured Traffic

    キャプチャしたトラフィックは、次のステップで分析するために保存され、準備ができています。

復号化された SSL/TLS トラフィックの分析

このステップでは、Wireshark のフィルタリングと分析ツールを使用して、復号化された SSL/TLS トラフィックを分析します。これらのツールは、大量のネットワークトラフィックデータから意味のある情報を抽出するために不可欠です。

  1. まず、TLS ハンドシェイクの特定の部分に焦点を当てるためにフィルタを適用しましょう。TLS ハンドシェイクは、クライアントとサーバー間の安全な接続を確立する際の重要な初期プロセスです。このプロセス中に、クライアントとサーバーは暗号化アルゴリズム、キー、その他のセキュリティパラメータについて合意するための情報を交換します。

    フィルタツールバー(Wireshark ウィンドウの上部にあるテキスト入力フィールド)に以下の式を入力します。

    tls.handshake.type == 1

    このフィルタ式は、TLS ハンドシェイクのタイプに基づいてパケットを選択するために使用されます。値 1Client Hello パケットに対応します。Enter キーを押してフィルタを適用します。フィルタを適用すると、Wireshark は Client Hello パケットのみを表示します。これらは、TLS ハンドシェイクを開始するためにクライアントが送信する最初のパケットです。

    このフィルタに一致するパケットのみが表示されるはずです。表示されるパケットを絞り込むことで、TLS 接続の開始部分に焦点を当てやすくなり、安全な通信がどのように開始されるかを理解しやすくなります。

    復号化された内容を表示するには、TLS ストリームを追跡しましょう。フィルタリングされたリスト内の任意のパケットを右クリックし、コンテキストメニューから Follow > TLS Stream を選択します。この操作により、Wireshark は選択したパケットに基づいて全体の TLS セッションを再構築し、復号化されたデータを表示します。

    新しいウィンドウが開き、復号化されたデータが表示されます。このデータは、安全な接続を介して送信された実際の HTTP 通信を表しています。プレマスターシークレットログファイルに保存された TLS セッションキーのおかげで、Wireshark は通常は暗号化されているこのデータを復号化して表示することができます。

    復号化されたデータには、Python スクリプトから送信された HTTP リクエストとサーバーからの HTTP レスポンスの両方が表示されます。ヘッダー、コンテンツタイプ、およびレスポンスの実際の HTML コンテンツを確認できます。この情報は、クライアントとサーバー間の通信を理解するために重要です。たとえば、どのようなデータが要求され、何が返されているかを知ることができます。

  2. この復号化されたデータをさらなる分析のために保存しましょう。「Follow TLS Stream」ウィンドウで、Save as... ボタンをクリックします。データを保存することで、後で見直したり、他の人と共有したり、追加の分析を行ったりすることができます。

    保存ダイアログで、/home/labex/project/ に移動し、ファイル名を decrypted_data.txt に指定して、Save をクリックします。

    Save Decrypted Data

    これで、TLS トラフィックをキャプチャ、復号化、保存して分析することに成功しました。復号化されたデータファイルには、元々 TLS で暗号化されていた完全な HTTP 通信が含まれています。

    作業が終了したら、「Follow TLS Stream」ウィンドウを閉じることができます。さらに調査したい場合は、異なる Wireshark フィルタを試して、キャプチャされたトラフィックの他の側面を調べてみてください。たとえば、フィルタ http を使用すると、復号化後の HTTP トラフィックのみが表示されます。これにより、ネットワークを介して送信される特定のタイプのデータをより深く調査することができます。

まとめ

この実験では、Wireshark を使用して SSL/TLS トラフィックを復号化する方法を学びました。TLS セッションキーを保存するためのプレマスターシークレットログファイルを作成し、Wireshark がこのファイルを復号化に使用するように設定し、Python スクリプトで SSL/TLS トラフィックを生成しました。その後、Wireshark のフィルタリングとストリーム追跡機能を使用して、復号化されたトラフィックを分析しました。

これらのスキルは、ネットワークのトラブルシューティング、セキュリティ分析、および安全な通信の理解に不可欠です。制御された環境で TLS トラフィックを復号化して分析することで、ネットワークプロトコルをより深く理解し、暗号化された通信の問題を見つけることができます。実際のシチュエーションでは、TLS トラフィックの復号化には適切な許可が必要であり、プライバシー法に違反しないように、許可されたネットワークでのみ行うべきであることを忘れないでください。