今回は、HTTPSのサイト構築、Wireshark でのSSL通信復号の方法を紹介します。
SSL/TLS 通信とは?
SSL とは Secure Sockets Layer の略称で、通信を暗号化する技術です。
TLS とは Transport Layer Security の略称で、こちらも通信を暗号化する技術で、SSL の後継です。
SSL という名称が広く認知されているため、TLS のこともまとめて SSL と呼ぶこともあります。なお、2020年現在はほとんどの通信が SSL から TLS に切り替わっています。
SSL/TLS 通信が使われている身近な例を挙げると、WEBページの表示に HTTPS が使われています。
HTTP 自体は暗号化されていないため、SSL/TLS で暗号化した HTTPS が使用されているサイトが大半です。
ブラウザのURL部に鍵マークが表示されていれば、HTTPS に対応しています。
例えば、Chrome だと以下のようなマークが表示されます。

HTTPS 通信を Wireshark で取得しても、暗号化されているためデータ部を確認することができません。
この暗号された通信を復号する方法を紹介していきます。
HTTPS のサイトを構築する
まずはじめに、HTTPS 通信を発生させるためのサイトを構築します。
後述しますが、復号するにはそのための鍵が必要となるため、自前のサイトで検証する必要があります。
今回は Kali 上で HTTPS のサイトを構築します。
Kali で ss コマンドを実行し、現在待ち受けているポートを確認します。
root@kali:~# ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 1 0.0.0.0:30003 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 1 0.0.0.0:30001 0.0.0.0:*
LISTEN 0 1 0.0.0.0:30002 0.0.0.0:*
LISTEN 0 1 [::]:30003 [::]:*
LISTEN 0 511 *:9876 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 *:80 *:*
LISTEN 0 1 [::]:30001 [::]:*
LISTEN 0 1 [::]:30002 [::]:*
root@kali:~#
HTTP(80)は LISTEN 状態ですが、HTTPS(443) は LISTEN 状態となっていません。
そのため、以下3つのコマンドで SSL モジュールを有効化します。このコマンドを実行することで HTTPS サイトが有効化されます。
a2enmod ssl
a2ensite default-ssl
systemctl reload apache2
root@kali:~# a2enmod ssl
Considering dependency setenvif for ssl:
Module setenvif already enabled
Considering dependency mime for ssl:
Module mime already enabled
Considering dependency socache_shmcb for ssl:
Enabling module socache_shmcb.
Enabling module ssl.
See /usr/share/doc/apache2/README.Debian.gz on how to configure SSL and create self-signed certificates.
To activate the new configuration, you need to run:
systemctl restart apache2
root@kali:~# a2ensite default-ssl
Enabling site default-ssl.
To activate the new configuration, you need to run:
systemctl reload apache2
root@kali:~# systemctl reload apache2
root@kali:~#
上記のコマンドを実行したら、再度 ss コマンドでポートの待受状況を確認します。
root@kali:~# ss -lnt
State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
LISTEN 0 1 0.0.0.0:30003 0.0.0.0:*
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 1 0.0.0.0:30001 0.0.0.0:*
LISTEN 0 1 0.0.0.0:30002 0.0.0.0:*
LISTEN 0 1 [::]:30003 [::]:*
LISTEN 0 511 *:9876 *:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 *:443 *:*
LISTEN 0 511 *:80 *:*
LISTEN 0 1 [::]:30001 [::]:*
LISTEN 0 1 [::]:30002 [::]:*
root@kali:~#
HTTPS である 443 が LISTEN 状態となっていることが確認できました。念の為、ブラウザでも確認してみます。
ブラウザのURL部に「 https://<Kali の IP アドレス>/share」と入力し、接続します。以下のページが表示されれば、HTTPS 化されており、「詳細設定」からページの表示が行えます。
※信頼された認証局から発行されたサーバ証明書が使われているサイトだと以下のページは表示されませんが、今回は自己証明書が使用されているため警告が出ます。

アクセス後のページを見ると、HTTPS (443)で接続されていることがわかります。

これで HTTPS サイトの用意ができました。
HTTPS 通信をパケットキャプチャすると
HTTPS 通信の復号を行う前に、本当に通信が暗号化されているか、そしてWireshark 上でどう見えるのかを確認してみます。
以下が、HTTPS 通信を発生させた際のパケットキャプチャデータです。

諸々のネゴシエーションを行った後、アプリケーションデータが送られています。
ただ、見て分かる通り暗号化されており、HTTPでやり取りされているといったことすらわかりません。
これだと、どこにアクセスしたのかも、何が返ってきたかも全くわからない状態です。この通信を復号することで、中身が確認できるようになります。
なお、TLSv1.3 で通信が暗号化されていることが、Protocol 列から確認できました。
TLSv1.3 を無効化する
TLSv1.3 ではセキュリティが強化されており、SSL セッションごとに暗号化に使用する一時鍵が異なる鍵交換方式しかサポートされていません。
そのため、秘密鍵を入手しても通信の復号が行えなくなっています。
今回は、秘密鍵で通信の復号を行う方法を紹介するため、TLSv1.3を使用しないよう WEB サーバ側で設定します。
「/etc/apache2/mods-enabled/ssl.conf」ファイルで SSL プロトコルの使用可否を設定するため、このファイルを編集します。
デフォルトだと以下の設定が記述されていました。
SSLProtocol all -SSLv3
こちらに「-TLSv1.3」を追加します。
SSLProtocol all -SSLv3 -TLSv1.3
追加後、apache2サービスを再起動することで設定が反映されます。
root@kali:~# systemctl reload apache2
root@kali:~#
確認のためブラウザでサイトにアクセスしてみます。すると、以下のように TLSv1.2 で通信を行っていることが確認できます。

SSL 秘密鍵を入手する
RSA のように暗号化に静的な鍵を使用している場合は、秘密鍵を入手することでデータの中身を確認することができるようになります。
WEBサーバ(今回は Kali)の「/etc/apache2/sites-enabled/default-ssl.conf」に証明書及び秘密鍵のファイルパスが記載されているため、確認します。
root@kali:/etc/apache2/sites-available# cat default-ssl.conf
--- 中略 ---
# SSLCertificateFile directive is needed.
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
SSLCertificateKeyFile が秘密鍵を指しています。
このファイルを、アクセス元の端末にコピーします。
Wireshark に秘密鍵を登録する
先程入手した SSL 秘密鍵を Wireshark に登録します。そうすることで、Wireshark が通信を復号し、パケットの中身を確認することができるようになります。
Wireshark の「編集」> 「設定」から以下ページを開きます。

「Protocol」から「TLS」を選択すると以下画面が表示されます。
※ Wireshark のバージョンによっては「SSL」という画面を選択します。

「Edit」をクリックして以下のように秘密鍵を登録します。
IP address : WEBサーバのIPアドレス
Port : 443
Protocol : http ※HTTPSではありません
Key File : 秘密鍵を選択

その後OKをクリックすると、以下の通りSSL通信が復号され、中身が確認できるようになりました。

まとめ
今回は SSL 通信を復号する方法を紹介しました。
SSL 通信と言ってもプロトコルが TLSv1.2、鍵交換方式が RSA と、どんどん使われなくなってくる暗号方式ですので、時間を見つけて TLSv1.3 の復号方法も紹介したいと思います。
どうやら、各セッションごとの一時鍵(セッションシークレット)が必要になるようです。
以上となります。
くどり
この記事は「ハッキング・ラボのつくりかた 第7章 」をベースに作成しています。購入リンクは以下です。
※Amazonアソシエイトを使用しています。
コメント