WiresharkでSSLセッションの中身を見れるようにする

SSLセッションをWiresharkでパケットキャプチャすると、鍵交換などSSLプロトコル自体のやりとりは確認出来るが、肝心の中身が暗号化されていて見れない。

が、Wiresharkに秘密鍵をセットしてあげると中身が見えるようになって、HTTPなどSSLで暗号化されたパケットを復号出来る。

スポンサーリンク

ネタ元

今回はこの本がネタ元です。Wiresharkの使い方だけでなく、各種プロトコルが分かりやすく説明されていて勉強になる本。キャプチャデータが出版社のサイトにupされていて、特にSSLの章はキャプチャデータだけでなく秘密鍵もダウンロード出来るので本の内容を気軽に試せます。

Wiresharkに秘密鍵をセット

注)この方法で復号出来るのは、RSA固定鍵を使っているセッションのみ。

  1. メニューから編集→設定を選択して、設定ダイアログを開く
  2. 左側のリストからprotocolsの中のTLSを選択すると、TLSの設定画面になる
  3. RSA key listの”Edit”ボタンを押して、”TLS Decrypt”ダイアログを開く
  4. 下の方の+ボタンを押してフィールドを追加し、IPアドレスと秘密鍵のファイル名を設定する

試しに、当ブログの表示をキャプチャして復号を試みたが、出来なかったorz

Wireshark2.x以前は”TLS”ではなく”SSL”表記になっているので注意

復号できない原因を探る

Wiresharkで復号出来ない原因を探るためには、TLSの設定画面でTLS debug fileに適当なファイルを指定し、ログファイルを出力させるとよい。

例えば、当ブログの復号を試みた時のログは以下。

ssl_restore_master_key can't find pre-master secret by Unencrypted pre-master secret
ssl_decrypt_pre_master_secret: session uses Diffie-Hellman key exchange (cipher suite 0xC02F TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) and cannot be decrypted using a RSA private key file.
ssl_generate_pre_master_secret: can't decrypt pre-master secret

エラーメッセージにECDHEの文字が見えるので、RSA固定鍵ではなくDH鍵共有が使われていることが判る。DH鍵共有とはセッションごとに動的に鍵生成を行う暗号化手法で、RSA固定鍵では復号できない。

ブラウザからセッション鍵を取得してWiresharkで復号する

SSL通信のパケットキャプチャをすると同時に、ブラウザでセッション鍵をファイルに保存すれば、DH鍵共有で暗号化された通信も復号が出来るようになる。chromeなら環境変数 SSLKEYLOGFILEにファイル名を指定すると、指定したファイルにセッション鍵が書き出される(以前はコマンドラインオプション–ssl-key-log-fileで指定出来たが、chromeの仕様変更で出来なくなった模様)。Linuxの場合は以下のような感じ。

$ export SSLKEYLOGFILE=~/sslkey.log
$ chrome

Windows10でも同じ環境変数名 SSLKEYLOGFILEで行ける。chromeでHTTPS接続のサイトを表示させた後、TLSの設定画面で(Pre)-Master-Secret log filnameに保存したブラウザでログファイル(sslkey.log)を指定すればOK。

まとめ

HTTPのDH鍵共有によるSSL通信は以下の手順を踏めばWiresharkでデコード出来る。

  1. ブラウザにセッション鍵を出力させつつパケットキャプチャ
  2. 出力させたセッション鍵をWiresharkにセットしてキャプチャデータをデコード

RSA固定鍵によるSSL通信は使われない方向に行っているようなので、上記の方法だけ覚えておけば十分かもしれない。

コメント

  1. yuji より:

    >※ Wireshark2.x以前は”TLS”ではなく”SSL”表記になっているので注意

    “SSL”を探していたんですが、”TLS”だったんですね。助かりました!