GNU/Linux >> Tutoriels Linux >  >> Linux

Comment tester la vulnérabilité d'attaque SSLv2 DROWN à l'aide d'un script Python (et une solution pour corriger l'attaque DROWN sur Apache et NginX)

DROWN signifie décryptage RSA avec un eNcryption obsolète et affaibli.

Ceci provient de la note de vulnérabilité VU#583776 :le trafic réseau chiffré à l'aide de certificats SSL basés sur RSA sur SSLv2 peut être déchiffré par l'attaque DROWN.

Ceci est également appelé CVE-2016-0800.

Pour résoudre le problème, vous devez simplement désactiver la prise en charge de SSLv2 sur les serveurs qui utilisent des certificats SSL basés sur RSA. SSLv2 est obsolète depuis 2011. Vous n'avez plus aucune raison d'utiliser SSLv2.

Deux méthodes pour tester la vulnérabilité DROWN

Il existe deux façons de tester la vulnérabilité DROWN :

  1. Accédez au site de test de drownattack et saisissez le nom de domaine ou l'adresse IP du site que vous souhaitez tester.
  2. Si vous souhaitez tester les serveurs qui s'exécutent derrière votre pare-feu, ou si vous souhaitez automatiser les tests de tous vos serveurs à partir de la ligne de commande, utilisez le script python développé par Hubert Kario de RedHat, comme expliqué ci-dessous.
  3. >

Installer le script de test Python DROWN

Vous n'avez pas besoin de le faire sur le serveur que vous souhaitez tester. Vous pouvez installer le script python suivant sur n'importe lequel de vos serveurs (par exemple, sur un serveur de développement) et tester tous vos autres serveurs à partir de ce serveur sur lequel ce script python est installé.

Pour cela, vous devez avoir Python 2.6 ou supérieur.

# python --version
Python 2.6.6

Git doit également être installé sur votre système :

# git --version
git version 1.7.1

Créez un répertoire noyé.

cd ~
mkdir drown
cd drown

Obtenez le TLSFuzzer en utilisant 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.

Découvrez la branche ssl2

# cd tlsfuzzer

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

À ce stade, vous devriez voir les fichiers suivants sous le répertoire ~/drown/tlsfuzzer

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

Ensuite, obtenez tlslite-ng, qui est une bibliothèque python open source qui implémente les protocoles cryptographiques SSL et TLS.

# 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.

Créez ensuite le lien approprié pour le tlslite que nous venons de télécharger ci-dessus.

# ln -s .tlslite-ng/tlslite tlslite

Découvrez la branche 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

Obtenez le script python de cryptographie ECDSA.

# 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.

Créez le lien approprié pour le script python ECSDA.

# ln -s .python-ecdsa/ecdsa ecdsa

Tester la vulnérabilité DROWN à l'aide d'un script Python – Exemple non vulnérable

Enfin, exécutez le script python DROWN comme indiqué ci-dessous. Modifiez l'adresse IP appropriée au serveur que vous testez. Vous pouvez également utiliser le nom de domaine au lieu de l'adresse IP ici.

# 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

Remarque :Vous devriez voir 6 OK ci-dessus. Vous devriez également voir "échec : 0".

Tester la vulnérabilité DROWN à l'aide d'un script Python – Exemple vulnérable

Ce qui suit est exécuté sur un serveur qui était vulnérable à l'attaque DROWN. C'est ce que vous verrez lorsqu'il sera vulnérable.

# 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

Résoudre le problème d'attaque DROWN

Dans le scénario vulnérable DROWN ci-dessus, l'un des cas de test a échoué. Pour résoudre ce problème, ajoutez la ligne suivante au fichier httpd.conf d'Apache et redémarrez Apache.

# vi httpd.conf
SSLProtocol All -SSLv2 -SSLv3

Si vous utilisez NginX, assurez-vous que SSLv2 n'est pas répertorié dans le fichier de configuration, comme indiqué ci-dessous.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

Dans Apache, nous devrions explicitement dire "-SSLv2" pour désactiver SSLv2. Mais dans NginX, lorsque vous ne listez pas SSLv2, il est désactivé.

Après le correctif ci-dessus, le script de test python DROWN n'a plus signalé le problème sur ce serveur particulier.

Outre Apache et NginX, si vous utilisez Postfix pour votre serveur de messagerie, vous devez également désactiver SSLv2 sur votre serveur de messagerie.

Mettez également à niveau votre OpenSSL vers la dernière version. Dans la nouvelle version, l'équipe OpenSSL a également désactivé le SSLv2 par défaut au moment de la construction. L'équipe OpenSSL a cette suggestion :Mettez à niveau la version 1.0.2 vers la 1.0.2g; et mettre à niveau la version 1.0.1 vers 1.0.1s.

Référence supplémentaire :

  • Note de vulnérabilité VU#583776
  • CVE-2016-0800
  • NOYER Attaque
  • Avis de sécurité OpenSSL [1er mars 2016]
  • Un guide de l'utilisateur OpenSSL pour DROWN

Linux
  1. Comment télécharger des fichiers à partir du serveur SFTP à l'aide d'un script python

  2. Comment tester et valider DNSSEC à l'aide de dig et des outils Web ?

  3. Comment réparer la vulnérabilité DROWN dans le serveur Web Apache/NGINX et SMTP ?

  4. Comment compresser et extraire des fichiers à l'aide de la commande tar sous Linux ?

  5. Comment exécuter un script python sur un terminal (ubuntu) ?

Comment bloquer l'accès à wp-admin et wp-login dans Nginx/Apache

Comment changer le port WordPress dans Apache et Nginx

Comment configurer l'exécution automatique d'un script Python à l'aide de Systemd

Comment désactiver la navigation dans les répertoires sur Apache et Nginx

Comment activer TLS 1.3 sur Apache et Nginx

Comment ajouter la prise en charge de PHP-FPM sur Apache et Nginx Web Server sur Ubuntu 18.04