DROWN steht für Decrypting RSA with Obsolete and Weakened eNcryption.
Dies stammt aus Vulnerability Note VU#583776:Netzwerkverkehr, der mit RSA-basierten SSL-Zertifikaten über SSLv2 verschlüsselt wurde, kann durch den DROWN-Angriff entschlüsselt werden.
Dies wird auch als CVE-2016-0800 bezeichnet.
Um das Problem zu beheben, sollten Sie einfach die Unterstützung für SSLv2 auf Servern deaktivieren, die RSA-basierte SSL-Zertifikate verwenden. SSLv2 ist seit 2011 veraltet. Es gibt keinen Grund mehr, SSLv2 zu verwenden.
Zwei Methoden zum Testen der DROWN-Schwachstelle
Es gibt zwei Möglichkeiten, wie Sie die DROWN-Schwachstelle testen können:
- Gehen Sie zur Drownattack-Testseite und geben Sie den Domänennamen oder die IP-Adresse der Seite ein, die Sie testen möchten.
- Wenn Sie die Server testen möchten, die hinter Ihrer Firewall ausgeführt werden, oder wenn Sie das Testen aller Ihrer Server über die Befehlszeile automatisieren möchten, verwenden Sie das Python-Skript, das von Hubert Kario von RedHat entwickelt wurde, wie unten erläutert.
Installieren Sie das Python-DROWN-Testskript
Sie müssen dies nicht auf dem Server tun, den Sie testen möchten. Sie können das folgende Python-Skript auf jedem Ihrer Server installieren (z. B. auf einem Entwicklungsserver) und alle Ihre anderen Server von diesem Server aus testen, auf dem dieses Python-Skript installiert ist.
Dafür sollten Sie Python 2.6 oder höher haben.
# python --version Python 2.6.6
Sie sollten auch git auf Ihrem System installiert haben:
# git --version git version 1.7.1
Erstellen Sie ein Unterdrückungsverzeichnis.
cd ~ mkdir drown cd drown
Holen Sie sich den TLSFuzzer mit Git Clone
# 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.
Überprüfen Sie den ssl2-Zweig
# cd tlsfuzzer # git checkout ssl2 Branch ssl2 set up to track remote branch ssl2 from origin. Switched to a new branch 'ssl2'
Zu diesem Zeitpunkt sollten Sie die folgenden Dateien im Verzeichnis ~/drown/tlsfuzzer
sehen# ls build-requirements.txt docs LICENSE Makefile README.md requirements.txt scripts setup.py tests tlsfuzzer
Holen Sie sich als Nächstes tlslite-ng, eine Open-Source-Python-Bibliothek, die kryptografische SSL- und TLS-Protokolle implementiert.
# 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.
Als nächstes erstellen Sie den entsprechenden Link für die tslite, die wir gerade oben heruntergeladen haben.
# ln -s .tlslite-ng/tlslite tlslite
Überprüfen Sie den sslv2-Zweig.
# 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
Holen Sie sich das ECDSA-Kryptographie-Python-Skript.
# 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.
Erstellen Sie einen geeigneten Link für das Python-ECSDA-Skript.
# ln -s .python-ecdsa/ecdsa ecdsa
Testen Sie die DROWN-Schwachstelle mit Python-Skript – Beispiel für keine Schwachstelle
Führen Sie schließlich das DROWN-Python-Skript wie unten gezeigt aus. Ändern Sie die IP-Adresse entsprechend dem Server, den Sie testen. Sie können hier auch den Domänennamen anstelle der IP-Adresse verwenden.
# 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
Hinweis:Sie sollten oben 6 OKs sehen. Sie sollten auch „failed:0“ sehen.
Testen Sie die DROWN-Schwachstelle mit Python-Skript – Beispiel für eine Schwachstelle
Das Folgende wird auf einem Server ausgeführt, der für einen DROWN-Angriff anfällig war. Das sehen Sie, wenn es anfällig ist.
# 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
Beheben Sie das DROWN-Angriffsproblem
Im obigen DROWN-Anfälligkeitsszenario ist einer der Testfälle fehlgeschlagen. Um dieses Problem zu beheben, fügen Sie die folgende Zeile zur httpd.conf von Apache hinzu und starten Sie Apache neu.
# vi httpd.conf SSLProtocol All -SSLv2 -SSLv3
Wenn Sie NginX ausführen, stellen Sie sicher, dass SSLv2 nicht in der Konfigurationsdatei aufgeführt ist, wie unten gezeigt.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
In Apache sollten wir ausdrücklich „-SSLv2“ sagen, um SSLv2 zu deaktivieren. Aber in NginX ist SSLv2 deaktiviert, wenn Sie es nicht auflisten.
Nach dem obigen Fix hat das Python-DROWN-Testskript das Problem auf diesem bestimmten Server nicht mehr gemeldet.
Abgesehen von Apache und NginX sollten Sie, wenn Sie Postfix für Ihren E-Mail-Server ausführen, auch SSLv2 auf Ihrem E-Mail-Server deaktivieren.
Aktualisieren Sie außerdem Ihr OpenSSL auf die neueste Version. In der neuen Version hat das OpenSSL-Team auch SSLv2 standardmäßig zur Build-Zeit deaktiviert. Das OpenSSL-Team hat diesen Vorschlag:Aktualisieren Sie die Version 1.0.2 auf 1.0.2g; und aktualisieren Sie Version 1.0.1 auf 1.0.1s.
Zusätzliche Referenz:
- Schwachstellenhinweis VU#583776
- CVE-2016-0800
- DROWN-Angriff
- OpenSSL-Sicherheitsempfehlung [1. März 2016]
- Ein OpenSSL-Benutzerhandbuch für DROWN