This post is also available in: English (英語)

概要

本シリーズは、疑わしいネットワークアクティビティの調査やネットワークトラフィックのパケットキャプチャ(pcap)の確認を業務で行っておられるセキュリティ専門家を読者として想定しています。このため本稿での手順説明は読者の皆さんがWiresharkの使いかたをご存知であることを前提としています。また、本稿にて利用するWiresharkのバージョンは主に3.xとなります。

昨今、対象となる疑わしいネットワークアクティビティのトラフィックが暗号化されていることは珍しくありません。今はほとんどのWebサイトが Hypertext Transfer Protocol Secure(HTTPS)プロトコルを使用しており、そうした通常の Webサイトと同様にさまざまなマルウェアもまた HTTPS を利用しています。ですから、マルウェアのアクティビティを pcap で確認するさいは、感染後の HTTPS トラフィックに何が含まれているかがわかれば調査の役に立ちます。

そこで本チュートリアルでは、pcap ファイルから HTTPS トラフィックを復号する方法を解説していきます。ただしこの復号は pcap を取得する前段で、暗号化に使われたTLS セッションキーをテキストベースのキーログファイルとして保存しておくことで可能になるものです。ここではこのキーログファイルを使い、pcap の HTTPS 通信内のアクティビティを復号し、内容を確認していくことになります。

今回サンプルとして利用するのは、HTTPSでのアクティビティを含む Dridex によるマルウェア感染です。

注意 1: 本チュートリアルは、以前の『Wireshark によるパケット解析講座 1: Wiresharkの表示列をカスタマイズする』で設定したカスタマイズ済みの列表示を使いますので、まだお済みでないかたはこちらのチュートリアルを済ませてから行ってください。また、本チュートリアルで使うpcapファイル、キーログファイルの入ったZIPアーカイブは、Githubリポジトリからあらかじめ取得しておいてください(解凍用パスワードは「infected」です)。

注意 2: 本稿のチュートリアルに利用する pcap ファイルには、Windowsで動作するマルウェアが含まれています。したがって、Windowsコンピュータを使って解析すると感染リスクがともないます。できるかぎり BSD 系、Linux 系、Mac OS など、Windows 環境以外の環境で pcap を確認することをお勧めします。

トラフィックが暗号化されるようになった経緯

1990年代半ばから後半にかけてWebサイトに最も一般的に使用されていたプロトコルは平文のWebトラフィックを生成するハイパーテキスト転送プロトコル(HTTP)でした。その後、セキュリティ懸念の高まりにともない、Webサイトで利用するプロトコルはHTTPSに切り替わり始めました。今ではWebブラウジングにおいてはほとんどHTTPトラフィックを見なくなりました。

HTTPS はつまるところ暗号化された通信トンネルに HTTP トラフィックを入れたものです。これら通信トンネルは、最初は Secure Sockets Layer(SSL)を暗号化プロトコルとして使用していましたが、今ではほとんどの HTTPS トラフィックが Transport Layer Security (TLS)を利用しています。

HTTPS Webトラフィック

さて、HTTPSトラフィックでドメイン名がわかるケースはよくあります。たとえば https://www.wireshark.orgを Webブラウザで閲覧すれば、pcap にはwww.wireshark.orgがこのトラフィックのサーバー名として表示されます (ここでは、チュートリアル1でカスタマイズしたWiresharkカラム表示を前提としています)。ただ残念ながら、実際のURLやサーバーから返されたデータなどのその他の詳細はわかりません。pcapでTransmission Control Protocol(TCP)のストリームを追跡しても、暗号化されているのでトラフィックの内容がわからないのです。

このスクリーンショットは、Webブラウザでhttps://www.wireshark.orgを表示したときに表示される内容とカスタマイズされたWireshark列表示で表示したときにpcapが表示する内容を示しています。
図 1 www.wireshark.org への HTTPS トラフィック
Wiresharkで [追跡]、[TCPストリーム]の順にクリックし、(tcp.stream eq 0) を表示したところ
図 2 www.wireshark.orgとの間の HTTPS トラフィックの TCP ストリーム

暗号化用のキー ログ ファイル

今回復号に使う暗号化用キー ログ ファイルはテキストファイルです。図3にそのサンプルを示します。

Wireshark用のtutorial-KeysLogFile.txtをテキストエディタで開いたところ
図 3 本チュートリアルで使用するキー ログ ファイルのサンプル

このキー ログ ファイルは、pcapの取得を開始するタイミングで Man in the Middle(MitM)技術を使って作成するものです。このため、pcap 取得開始時時にこれらのファイルを作成していなかった場合は、取得したpcap内のHTTPSトラフィックを復号することはできません。

Pcap のキャプチャ開始時にキー ログ ファイルを取得したサンプル

冒頭でもふれましたが、pcapと対応するキー ログ ファイルを含むZIPアーカイブ(パスワードは「infected」)はこちらのGithubリポジトリにありますので、チュートリアルを始める前に取得しておいてください。Githubページに移動してZIPアーカイブのエントリをクリックし、図4と図5に示す手順でダウンロードします。一点注意していただきたいのですが、この ZIP アーカイブに含まれている pcap をキー ログで復号すると、そのなかには Windows ベースのマルウェア サンプルが含まれています。繰り返しになりますが、本チュートリアルの手順はWindows 以外の環境で慎重に行うようにしてください。

pan-unit42/wireshark-tutorial-decrypting-HTTPS-trafficのスクリーンショット。HTTPSトラフィックの復号化に関するチュートリアルに利用するZIPアーカイブへのリンクを含むGithubリポジトリを示している
図 4 本チュートリアルで利用するZIPアーカイブファイルのリンクを含むGithubリポジトリ
pan-unit42/wireshark-tutorial-decrypting-HTTPS-traffic のスクリーンショット。チュートリアルに使うZIPファイルをGitHubからダウンロードする手順を示している
図 5 ZIP アーカイブファイルをチュートリアル用にダウンロードする手順

なお、本ZIPアーカイブファイルを解凍してpcapファイルとキー ログ ファイルを取り出すためのパスワードは「infected」となります。解凍すると図6に示した2つのファイルが出てきます。

  • Wireshark-tutorial-KeysLogFile.txt
  • Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap
Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.zip ファイルのスクリーンショット。ZIP アーカイブを解凍してそれをチュートリアル用 HTTPS トラフィックの復号化に利用する方法を説明しているところ
図 6 本チュートリアルで使うキー ログ ファイルと pcap ファイル

キー ログ ファイルを使わない状態で見た HTTPS トラフィック

さて、Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcapファイルを Wireshark で開いたら、『Wireshark によるパケット解析講座 2: 脅威インテリジェンス調査に役立つフィルタリング設定』のチュートリアルで解説した web 用フィルタを適用してください。Wireshark 3.xの基本フィルタは次の内容です。

(http.request or tls.handshake.type eq 1) and !(ssdp)

この pcap は Windows 10ホスト上で Dridex マルウェア感染のトラフィックをキャプチャしたものです。このサンプルでは感染活動を含めたすべての Web トラフィックが HTTPS で行われています。したがって、キー ログ ファイルがないかぎり、IPアドレス、TCPポート、ドメイン名以外は判明せずトラフィックの詳細を確認することはできません(図7参照)。

Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.zip のスクリーンショット。チュートリアル用の pcap の HTTPS トラフィックをキー ログ ファイルによる復号化処理なしで閲覧した場合の見えかたを示したところ。
図 7 復号化せずに基本webフィルタを適用しただけのWireshark上での見えかた

キー ログ ファイルを読み込む

では、Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcapファイルを Wireshark で開いた状態で、Linux / Windows 系環境では続けて[編集]、[Preferences] を、Mac OS 系の環境では [Wireshark]、[Preferences] の順にクリックします(図 8 参照)。

Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap を Wireshark で開いて[編集] メニュー(Mac OS の場合は [Wireshark] メニュー)以下の [Preferences] を開いたところを表示。
図8 Wireshark の [Preferences] メニューを開いたところ

[Preferences] メニューの左ペインにある [Protocols] の左にある三角形をクリックして開きます(図 9 参照)。

[Preferences] メニューの左ペインにある [Protocols] の左にある三角形をクリックする
図 9 Wireshark の [Preferences] メニューを開き、[Protocols] の左の三角形をクリックする
なお Wireshark のバージョン 2.x を使用している場合は、「SSL」という項目が出てくるまでずっと下にスクロールして選択してください。Wireshark のバージョン 3.x を使用している場合は、同様に「TLS」を選択します。SSLないしTLSを選択すると(Pre)-Master-Secret log filenameという項目が表示されますので、その右下にある [Browse] ボタンをクリックし、解凍済みキー ログ ファイル(Wireshark-tutorial-KeysLogFile.txt)を図 10 から 12 に示した手順で選択してください。

Wireshark 3.x で TLS を選択すると、(Pre)-Master-Secret log filename の行が表示される
図 10 TLS の下の [(Pre)-Master-Secret log filename] テキストフィールド(Wireshark 3.x 環境)
HTTPS トラフィックの復号化に関するチュートリアルを続行するには、[Browse]ボタンをクリックした後、Wireshark-tutorial-KeysLogFile.txtという名前のキー ログ ファイルを選択する
図 11 チュートリアル用キー ログ ファイルを選択したところ
このスクリーンショットはHTTPSトラフィックの復号化チュートリアルのキーログファイルが適切に選択された後、Wiresharkにどのように画面表示されるかを示している
図 12 (Pre)-Master-Secret log filename を選択してから [OK] をクリックしたところ

キー ログ ファイルを使った状態で見た HTTPS トラフィック

ここで [OK] をクリックすると、基本フィルターを使っている環境であれば、各 HTTPS 行の下に、復号された HTTP リクエストが Wireshark カラムに一覧表示されます(図 13 参照)。

このスクリーンショットは各HTTPS行の下に復号化されたHTTPリクエストを表示しているWireshark カラムを表示している
図 13 キー ログ ファイルを利用して Wireshark で HTTPS の復号をしたところ

この pcap の場合、キー ログ ファイルを適用する前は HTTPS トラフィックに隠されていた microsoft.com skype.com への HTTP リクエストが確認できるようになります。このほかに Dridex 感染によって引き起こされた次のトラフィックも確認できます。

  • foodsgoodforliver[.]com – GET /invest_20.dll
  • 105711[.]com – POST /docs.php

foodsgoodforliver[.]com への GET リクエストが Dridex の DLL ファイルを返しています。そして 105711[.]com への POST リクエストは、Dridex に感染した Windows ホストからのコマンド & コントロール(C2)トラフィックです。

このトラフィックは HTTP ストリームを追跡することで確認できます。この行を右クリックして選択し、さらに左クリックしてメニューを表示し、HTTP ストリームを追跡してください。図14と図15は foodsgoodforliver[.]com への HTTP GET リクエストの HTTP ストリームを追跡した様子を示しています。

Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap。このスクリーンショットでは、foodsgoodforliver[.]com への GETS リクエストの HTTP ストリームを追跡するための一連の手順を示している
図 14 foodsgoodforliver[.]com への GET リクエストの HTTP ストリームを追跡
Wireshark で Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap に含まれる HTTP ストリーム(tcp.stream eq 2)を追跡しているスクリーンショット。HTTPストリームはサーバーからEXEないしDLLを返す様子を示している
図 15 HTTP ストリームからは、EXE ないし DLL がサーバーから返されることがわかる

このトラフィックにはキー ログ ファイルがあるので、pcap からマルウェア自体をエクスポートすることができます。Wireshark のメニューで [ファイル]、[オブジェクトをエクスポート]、[HTTP] の順にクリックし、図 16 に示すようにこのファイルを pcap からエクスポートしましょう。

Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap のスクリーンショット。HTTPSトラフィックを復号化する今回のチュートリアル用マルウェア バイナリを一連の手順でエクスポートしているところ
図 16 foodsgoodforliver[.]com から返ってきたマルウェアのバイナリ
BSD 系、Linux 系、Mac OS 系の環境で実行している場合はターミナル ウィンドウを開いて file コマンドを実行し、このファイルが DLL であることを確認してください。そののち、shasum -a 256 を実行し、ファイルの SHA256 ハッシュ値を取得します(図 17 参照)。

HTTPSトラフィック復号化チュートリアル用のスクリーンショット。BSD、Linux、または Mac OS 環境でターミナルウィンドウを開き、fileコマンドを使用してこれが DLL ファイルであることを確認した後、ファイルの SHA256 ハッシュを取得する方法を示している
図 17 Linux 環境でこのマルウェアの SHA256 ハッシュを取得しているところ

このマルウェアのSHA256ハッシュ:

31cf42b2a7c5c558f44cfc67684cc344c17d4946d3a1e0b2cecb8eb58173cb2f

このハッシュをオンラインで検索すれば、一般利用可能なオンライン サンドボックス環境での結果が少なくとも2つ見つかるでしょう。

これで、この特定Dridex感染のC2トラフィックを確認することができるようになりました。基本Webフィルタを使用し、POSTリクエストの1つを選んで、105711[.]comへの HTTP ストリームを追跡しましょう。HTTP ストリームの 1 つを選んで追跡した例を図 18 に示します。

Wireshark で Wireshark-tutorial-on-decrypting-HTTPS-SSL-TLS-traffic.pcap の tcp.stream eq 5 の HTTP ストリームを追跡したスクリーンショット。このスクリーンショットは、Dridex の C2 による POST リクエストの HTTP ストリームの 1 つを示している
図 18 Dridex C2 POSTリクエストによる HTTP ストリームの 1 つ

結論

本チュートリアルでは、キー ログ ファイルを使って Wireshark の pcap ファイルから HTTPS トラフィックを復号する方法について見ていきました。なお、pcap 取得開始時時にこれらのファイルを作成していなかった場合は、取得したpcap内のHTTPSトラフィックを復号することはできません。

『Wiresharkによるパケット解析講座』シリーズの以前の講座は以下から確認してください。

Enlarged Image