ラック・セキュリティごった煮ブログ

セキュリティエンジニアがエンジニアの方に向けて、 セキュリティやIT技術に関する情報を発信していくアカウントです。

【お知らせ】2021年5月10日~リニューアルオープン!今後はこちらで新しい記事を公開します。

株式会社ラックのセキュリティエンジニアが、 エンジニアの方向けにセキュリティやIT技術に関する情報を発信するブログです。(編集:株式会社ラック・デジタルペンテスト部)
当ウェブサイトをご利用の際には、こちらの「サイトのご利用条件」をご確認ください。

デジタルペンテスト部提供サービス:ペネトレーションテスト

診断後の修正確認:脆弱な暗号スイートが無効化されたことを確認する3つの方法比較


デジタルペンテスト部のMです。プラットフォーム診断やコンサル事業を担当しています。
プラットフォーム診断をしていると、SSL/TLSプロトコルにおいて脆弱な暗号スイートが有効になっており報告するケースがございます。またそれに合わせて、「この脆弱性が対処できたかどうか確認する方法がないか」といったお問い合わせが来ることもございます。
今回は、上記ケースの確認方法を3種類示し、比較していきたいと思います。

前提条件

・検出した脆弱な暗号スイート:DES-CBC3-SHA
※誕生日攻撃によってcookie情報などの通信内容を解読されてしまう可能性があるもの
・接続元クライアント端末:
OS:Kali Linux-2023.4

※本記事は上記OSを使用しておりますが、Debian形式のディストリビューションを使用したOS(Ubuntu等)を使用すれば、同様のコマンドが使用可能です。

確認方法1(OpenSSLを使用)

ここでは、「OpenSSL」を用いて対象サーバに接続し、サポートされている暗号スイートを確認する方法を解説します。

1,接続元のクライアント端末で、インストールされているOpenSSLのバージョンと該当する暗号スイート対応しているかを以下のコマンドで確認します。

#openssl -v
#openssl ciphers -v

 以下は、「3.3.2」で確認した結果です。

・バージョンの確認

・暗号スイートの確認

2,3系などの新しいバージョンのOpenSSLでは、脆弱性のある暗号スイートが対応していないため、旧バージョンのOpenSSLをインストールする必要があります。

3,今回は、「1.0.1h」をインストールします。
  以下のコマンド、または以下のページから該当バージョンのファイルを取得します。

#sudo curl -O https://www.openssl.org/source/old/1.0.1/openssl-1.0.1h.tar.gz          

curlが実行できない場合はsudo apt install curlを実行してください。
Old 1.0.1 Releases | OpenSSL Library

4,以下のコマンドで取得したファイルを解凍します。

#sudo tar zxvf openssl-1.0.1h.tar.gz

5,以下のコマンドで解凍したディレクトリに移動します。

#cd openssl-1.0.1h        

6,以下のコマンドで構成スクリプトを実行します。

#sudo ./config '-Wl,-rpath,$(LIBRPATH)'       

※configを実行する際に、共有ライブラリのパスを渡さないとエラーが出るので注意してください。

7,以下のコマンドでビルドします。

#sudo make      

※makeが実行できない場合はsudo apt install makeを実行してください。

8,以下のコマンドでインストールします。

#sudo make install      

9,以下のコマンドでインストール先のディレクトリに移動します。

#cd apps      

10,以下のコマンドでopensslを起動し、バージョンを確認します。

#sudo ./openssl
openssl> version   

11,バージョン「1.0.1h」が確認できたら、以下のコマンドで対応暗号スイートを確認します。

openssl> ciphers -v    


※一部省略

12,該当暗号スイートが確認できたら、対象サーバへ該当暗号スイートが有効になっていないか接続して確認します。
以下のコマンドで確認対象のサーバへ接続を試みます。

openssl> s_client -connect <ip>:<port> -cipher DES-CBC3-SHA -state     

以下は出力例となります。

・鍵交換が成功した際のログ

【省略】

※一部省略

鍵交換が成功すると、証明書の情報、SSL/TLSのバージョン、暗号スイートなどが出力されます。
赤枠内に注目すると、該当暗号スイート「DES-CBC3-SHA」が確認できます。
この場合、「TLSv1.2」で「DES-CBC3-SHA」で鍵交換が行われたことがわかります。

・鍵交換が失敗した際のログ

※一部省略

鍵交換が失敗している(行われていない)と上記のログ出力となり、SSL/TLSのバージョン、暗号スイートが確認できません。よって、該当暗号スイートは無効になっている(対応していない)ことがわかります。

確認方法2(Nmapを使用)

ここでは、「Nmap」を用いて対象サーバに接続し、サポートされている暗号スイートを確認する方法を解説します。

1, 接続元のクライアント端末で、Nmapをインストールします。

#sudo apt install nmap     

2, バージョンの確認をします。

#nmap -version    


3, 以下のコマンドで対象のサーバへ接続を確認します。

#nmap -sV --script ssl-enum-ciphers -p <port> <ip>   

以下は出力例となります。

※一部省略

上記の場合、SSLv3で接続ができた暗号スイートが出力されています。今回対象の該当暗号スイートも確認できます。
また、一番右側にFと出力されていますが、これは暗号スイートの強度を示すものであり「強 A ~ F 弱」の形で出力されます。
続いて、下から2行目を見ていただくと「warnings」と記載があり、前提条件である3DESの暗号スイートが誕生日攻撃に脆弱であると警告が出ていることが読み取れます。

確認方法3(Qualys SSL Labs SSL Server Testを使用)

ここでは、米国のQualys社が提供する「Qualys SSL Labs SSL Server Test」を用いて、サポートされている暗号スイートを確認する方法を解説します。
SSL/TLSの評価をするサービスは様々なものがありますが、今回は上記のサービスを例にご紹介させていただきます。
※Qualysの米国サーバから通信が飛ぶため注意が必要です。
※対象サーバを外部公開していないと利用不可となります。

1,以下のQualysのページに遷移します。
SSL Server Test (Powered by Qualys SSL Labs)

2, 中段の「Hostname」にFQDNまたはIPアドレスを入力し、「Do not show the results on the boards」にチェックをいれ、「Submit」をクリックします。
※チェックをいれないと、他者が結果を参照可能になるため

3, 結果の「Configuration> Cipher Suites」を確認します。

上記は結果の例ですが、TLSのバージョン、接続が確認できた暗号スイートが出力されています。
一般に脆弱な暗号スイートには、「WEAK」という判定がされます。

3種の比較

結論、特定の暗号スイートに対して確認したい場合は「OpenSSL」、網羅的に対象の暗号スイートを確認したい場合は「Nmap」をお勧めいたします。
OpenSSLは、SSL/TLSの指定や暗号スイートの指定ができるため、ある特定の条件をピンポイントで確かめたい場合に適しています。
Nmapは、特定の条件は指定できないものの、網羅的に対象のサーバが対応しているSSL/TLSのバージョン、暗号スイートを確認することができ、脆弱な暗号スイートが含まれている場合、警告が出力されます。そのため、一旦どういったものが有効になっているか洗い出したい場合などに有効です。
Qualys SSL Labs SSL Server Testは、米国からの通信が飛ぶ点、対象サーバを外部公開しなければならない点から、一概にすべての組織様にお勧めできるものではありません。
ただし、対象サーバが外部公開されており、米国からの通信が許容できる場合は、証明書の内容、暗号スイート、どういった対象からアクセスするとどの暗号スイートが採用されて通信されるかといった情報も見ることができるため、一度試してみるのもよいかもしれません。

まとめ

本記事では、3種の方法を用いて該当暗号スイートが有効になっていないかの確認方法を解説し、比較しました。旧バージョンのOpenSSLを使用する頻度が多い場合、実行ファイルの名称変更し、パスを通せば旧バージョンもどのディレクトリにいてもコマンドが認識されるようになります。
また、推奨される暗号スイートはIPAより公開されております。ただし、推奨される暗号スイートは変更されることがあるため、その時々で本記事が参考になれば幸いです。