GNU/Linux >> Linux の 問題 >  >> Linux

Python スクリプトを使用して SSLv2 DROWN 攻撃の脆弱性をテストする方法 (および Apache と NginX での DROWN 攻撃を修正するソリューション)

DROWN は、時代遅れで脆弱な暗号化を使用して RSA を復号化することの略です。

これは、脆弱性ノート VU#583776 からのものです:SSLv2 で RSA ベースの SSL 証明書を使用して暗号化されたネットワーク トラフィックは、DROWN 攻撃によって復号化される可能性があります。

これは CVE-2016-0800 とも呼ばれます。

この問題を解決するには、RSA ベースの SSL 証明書を使用しているサーバーで SSLv2 のサポートを無効にするだけです。 SSLv2 は 2011 年から廃止されました。もう SSLv2 を使用する理由はありません。

DROWN 脆弱性をテストする 2 つの方法

DROWN の脆弱性をテストするには、次の 2 つの方法があります:

<オール>
  • drownattack テスト サイトに移動し、テストするサイトのドメイン名または IP アドレスを入力します。
  • ファイアウォールの内側で実行されているサーバーをテストする場合、またはコマンド ラインからすべてのサーバーのテストを自動化する場合は、以下で説明するように、RedHat の Hubert Kario によって開発された Python スクリプトを使用します。
  • Python DROWN テスト スクリプトをインストール

    テストするサーバーでこれを行う必要はありません。次の python スクリプトを任意のサーバー (開発サーバーなど) にインストールし、この python スクリプトがインストールされているこのサーバーから他のすべてのサーバーをテストできます。

    このためには、Python 2.6 以降が必要です。

    # python --version
    Python 2.6.6
    

    また、システムに git をインストールする必要があります:

    # git --version
    git version 1.7.1
    

    drown ディレクトリを作成します。

    cd ~
    mkdir drown
    cd drown
    

    git clone を使用して TLSFuzzer を取得します

    # git clone https://github.com/tomato42/tlsfuzzer
    Initialized empty Git repository in /root/drown/tlsfuzzer/.git/
    remote: Counting objects: 480, done.
    remote: Compressing objects: 100% (10/10), done.
    remote: Total 480 (delta 5), reused 0 (delta 0), pack-reused 470
    Receiving objects: 100% (480/480), 1.30 MiB | 327 KiB/s, done.
    Resolving deltas: 100% (302/302), done.
    

    ssl2 ブランチをチェックアウト

    # cd tlsfuzzer
    
    # git checkout ssl2
    Branch ssl2 set up to track remote branch ssl2 from origin.
    Switched to a new branch 'ssl2'
    

    この段階で、~/drown/tlsfuzzer ディレクトリの下に次のファイルが表示されます

    # ls
    build-requirements.txt  docs  LICENSE  Makefile  README.md  requirements.txt  scripts  setup.py  tests  tlsfuzzer
    

    次に、SSL および TLS 暗号化プロトコルを実装するオープン ソースの Python ライブラリである tlslite-ng を入手します。

    # git clone https://github.com/tomato42/tlslite-ng .tlslite-ng
    Initialized empty Git repository in /root/drown/tlsfuzzer/.tlslite-ng/.git/
    remote: Counting objects: 4821, done.
    remote: Total 4821 (delta 0), reused 0 (delta 0), pack-reused 4821
    Receiving objects: 100% (4821/4821), 1.55 MiB | 137 KiB/s, done.
    Resolving deltas: 100% (3570/3570), done.
    

    次に、先ほどダウンロードした tlslite への適切なリンクを作成します。

    # ln -s .tlslite-ng/tlslite tlslite
    

    sslv2 ブランチをチェックアウトしてください。

    # cd .tlslite-ng/
    
    # git checkout sslv2
    Branch sslv2 set up to track remote branch sslv2 from origin.
    Switched to a new branch 'sslv2'
    
    # cd ~/drown/tlsfuzzer
    

    ECDSA 暗号化 Python スクリプトを取得します。

    # git clone https://github.com/warner/python-ecdsa .python-ecdsa
    Initialized empty Git repository in /root/drown/tlsfuzzer/.python-ecdsa/.git/
    remote: Counting objects: 485, done.
    remote: Total 485 (delta 0), reused 0 (delta 0), pack-reused 485
    Receiving objects: 100% (485/485), 180.60 KiB, done.
    Resolving deltas: 100% (289/289), done.
    

    Python ECSDA スクリプトへの適切なリンクを作成します。

    # ln -s .python-ecdsa/ecdsa ecdsa
    

    Python スクリプトを使用して DROWN の脆弱性をテスト – 脆弱ではない例

    最後に、以下に示すように DROWN python スクリプトを実行します。テストするサーバーに適した IP アドレスを変更します。ここで ip-address の代わりにドメイン名を使用することもできます。

    # PYTHONPATH=. python scripts/test-sslv2-force-export-cipher.py -h 192.168.101.2 -p 443
    
    Connect with TLSv1.0 EXP-RC4-MD5 ...OK
    Connect with SSLv2 EXP-RC4-MD5 ...OK
    Connect with SSLv3 EXP-RC4-MD5 ...OK
    Connect with TLSv1.0 EXP-RC2-CBC-MD5 ...OK
    Connect with SSLv3 EXP-RC2-CBC-MD5 ...OK
    Connect with SSLv2 EXP-RC2-CBC-MD5 ...OK
    
    Test end
    successful: 6
    failed: 0
    

    注:上記の 6 つの OK が表示されます。 「失敗:0」も表示されます。

    Python スクリプトを使用して DROWN の脆弱性をテストする – 脆弱性の例

    以下は、DROWN 攻撃に対して脆弱なサーバーで実行されます。これは、脆弱な場合に表示されるものです。

    # PYTHONPATH=. python scripts/test-sslv2-force-export-cipher.py -h 192.168.101.3 -p 443
    Connect with TLSv1.0 EXP-RC4-MD5 ...OK
    
    Connect with SSLv2 EXP-RC4-MD5 ...
    Error encountered while processing node <tlsfuzzer.expect.ExpectSSL2Alert object at 0x2259810> (child: <tlsfuzzer.expect.ExpectClose object at 0x2259890>) with last message being: <tlslite.messages.Message object at 0x2259c50>
    Error while processing
    Traceback (most recent call last):
      File "scripts/test-sslv2-force-export-cipher.py", line 109, in main
        runner.run()
      File "/root/drown/tlsfuzzer/tlsfuzzer/runner.py", line 151, in run
        RecordHeader2)))
    AssertionError: Unexpected message from peer: Handshake(58)
    
    Connect with SSLv3 EXP-RC4-MD5 ...OK
    Connect with TLSv1.0 EXP-RC2-CBC-MD5 ...OK
    Connect with SSLv3 EXP-RC2-CBC-MD5 ...OK
    Connect with SSLv2 EXP-RC2-CBC-MD5 ...OK
    
    Test end
    successful: 5
    failed: 1
    

    DROWN 攻撃の問題を修正

    上記の DROWN の脆弱なシナリオでは、テスト ケースの 1 つが失敗しました。この問題を修正するには、次の行を Apache の httpd.conf に追加し、Apache を再起動します。

    # vi httpd.conf
    SSLProtocol All -SSLv2 -SSLv3
    

    NginX を実行している場合は、以下に示すように、構成ファイルに SSLv2 がリストされていないことを確認してください。

    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    

    Apache では、SSLv2 を無効にするには、「-SSLv2」と明示的に指定する必要があります。ただし、NginX では、SSLv2 をリストしないと無効になります。

    上記の修正後、python DROWN テスト スクリプトはその特定のサーバーの問題を報告しなくなりました。

    Apache と NginX とは別に、メール サーバーに Postfix を実行している場合は、メール サーバーでも SSLv2 を無効にする必要があります。

    また、OpenSSL を最新バージョンにアップグレードします。新しいバージョンでは、OpenSSL チームはビルド時にデフォルトで SSLv2 を無効にしました。 OpenSSL チームには次の提案があります。1.0.2 バージョンを 1.0.2g にアップグレードします。 1.0.1 バージョンを 1.0.1s にアップグレードします。

    追加の参照:

    • 脆弱性メモ VU#583776
    • CVE-2016-0800
    • 溺死攻撃
    • OpenSSL セキュリティ アドバイザリ [2016 年 3 月 1 日]
    • DROWN の OpenSSL ユーザー ガイド

    Linux
    1. digとWebツールを使用してDNSSECをテストおよび検証する方法は?

    2. Apache / NGINX WebサーバーとSMTPのDROWN脆弱性を修正するにはどうすればよいですか?

    3. パフォーマンスと安定性のためのApache2Buddyスクリプトの使用

    1. Linuxでtarコマンドを使用してファイルを圧縮および抽出する方法は?

    2. ターミナル(ubuntu)でPythonスクリプトを実行するには?

    3. Debian および Ubuntu に最新の nginx をインストールする方法

    1. Pythonスクリプトを使用してSFTPサーバーからファイルをダウンロードする方法

    2. 独自のIPアドレスを取得し、シェルスクリプトの変数に保存する方法は?

    3. Pythonスクリプトを使用してLinuxターミナルを終了するには?