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 :
- Accédez au site de test de drownattack et saisissez le nom de domaine ou l'adresse IP du site que vous souhaitez tester.
- 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. >
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