無能が苦悩したメモ

無能な著者が学んだことを忘れないための覚え書きです...

Wireshark・tsharkでHTTPS通信を復号

*本記事はUbuntu 18.04LTSでの設定を想定しています
HTTPS通信ではWebサイトとWebブラウザでやり取りする情報が暗号化されています。ただパケットキャプチャしただけでは暗号化された情報を見れず、別途設定が必要です。

クライアント側でのHTTPS通信の復号

クライアント側PCでのパケットキャプチャでHTTPS通信を復号するには以下の方法があります。

  1. サーバ側の秘密鍵を使う
  2. クライアント側のセッション鍵を使う


おおざっぱな説明になりますが、HTTPSでは公開鍵暗号方式を用いてサーバ側とクライアント側で情報を交換して共通鍵を作成し、その共通鍵で通信データを暗号化・復号します。1の「サーバ側の秘密鍵」とは公開鍵暗号方式で用いる秘密鍵のこと、2の「セッション鍵」は共通鍵を作るための情報のことです。


1の方法は、秘密鍵をあらかじめWiresharkに登録する必要があり、自分が管理している(秘密鍵を知っている)サーバとの通信でしか使えません。2の方法の場合、セッション鍵をWiresharkに登録し通信データを復号します。セッション鍵はブラウザから出力させることができるので、他人が管理するサーバとのHTTPS通信でも復号できます。以下では2の方法についてのみ記述します。

セッション鍵の取得方法

ブラウザは環境変数SSLKEYLOGFILEで指定した出力先にセッション鍵を出力します。環境変数を設定後、ブラウザでHTTPS対応のWebサイトにアクセスすれば自動的にセッション鍵が書き出されます。その状態でパケットキャプチャを行えば、キャプチャした通信がHTTPS通信であってもセッション鍵を使って復号できます。

環境変数はexportコマンドを使うことで設定できます。以下では「/var/log/tls_key.log」にセッション鍵が出力されます。

$ export SSLKEYLOGFILE=/home/muknow/tls_key.log



ターミナルでexportコマンドを実行した場合、設定した環境変数はそのターミナルでのみ有効となります。そのため、ブラウザ(下記コマンドではFirefox)を同一のターミナルから起動しなければセッション鍵は出力されません。

$ export SSLKEYLOGFILE=/home/muknow/tls_key.log
$ firefox &



システム全体で環境変数を有効にしたい場合は「~/.profile」に先ほどのexportコマンドを記述します。設定の反映はsourceコマンドでします。(sourceコマンドを使わなくても再起動すれば設定は反映されます)

$ echo 'export SSLKEYLOGFILE=/home/muknow/tls_key.log' >> ~/.profile
$ source ~/.profile


セッション鍵を使った復号(tsharkの場合)

tsharkはWireshakのコマンドラインツールです。pcapファイルの解析を自動化したい場合などに役立ちます。

セッション鍵を読み込む場合は-oオプションでssl.keylog_fileにセッション鍵が記録されたファイルを指定します。 

$ tshark -r test.pcap -o "ssl.keylog_file: /home/muknow/tls_key.log"



実際に復号が成功したか確認する際は、-YオプションでHTTPもしくはHTTP2の通信だけを表示するようにし、セッション鍵を読み込まない場合との差分を見るとよいです。

$ tshark -r test.pcap -Y "http or http2" > no_dec.txt
$ tshark -r test.pcap -Y "http or http2" -o "ssl.keylog_file: /home/muknow/tls_key.log" > dec.txt
$ diff no_dec.txt dec.txt


セッション鍵を使った復号(Wiresharkの場合)

復号するためにはWiresharkにセッション鍵を読み込ませる必要があります。

メニューバーの「Edit」から「Preferences」、「Protocols」、「SSL」と選択していけば画像の設定画面にたどりつけます。「(Pre)-Master-Secret log filename」に環境変数SSLKEYLOGFILEで指定したファイルを設定することで、Wiresharkにセッション鍵を認識させます。

f:id:muknow_kuknow:20190824160723p:plain:w400
Wiresharkのセッション鍵設定画面


その後、キャプチャしたパケットを見ると復号されているのを確認できます。