GNU/Linux >> LINUX-Kenntnisse >  >> Linux

So testen Sie die Schwachstelle von SSLv2-DROWN-Angriffen mit Python-Skript (und eine Lösung zur Behebung des DROWN-Angriffs auf Apache und NginX)

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:

  1. Gehen Sie zur Drownattack-Testseite und geben Sie den Domänennamen oder die IP-Adresse der Seite ein, die Sie testen möchten.
  2. 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

Linux
  1. So laden Sie Dateien vom SFTP-Server mit Python-Skript herunter

  2. Wie testet und validiert man DNSSEC mit dig und Web Tools?

  3. Wie erhalte ich die eigene IP-Adresse und speichere sie in einer Variablen in einem Shell-Skript?

  4. Wie führe ich ein Python-Skript auf dem Terminal (Ubuntu) aus?

  5. Wie beendet man das Linux-Terminal mit einem Python-Skript?

So blockieren Sie den Zugriff auf wp-admin und wp-login in Nginx/Apache

So ändern Sie den WordPress-Port in Apache und Nginx

So richten Sie die automatische Ausführung eines Python-Skripts mit Systemd ein

So deaktivieren Sie das Durchsuchen von Verzeichnissen auf Apache und Nginx

So aktivieren Sie TLS 1.3 auf Apache und Nginx

So fügen Sie PHP-FPM-Unterstützung auf Apache und Nginx-Webserver auf Ubuntu 18.04 hinzu