DROWN sta per Decrypting RSA with Obsolete and Weakened eNcryption.
Questo proviene dalla nota sulla vulnerabilità VU#583776:il traffico di rete crittografato utilizzando certificati SSL basati su RSA su SSLv2 potrebbe essere decrittografato dall'attacco DROWN.
Questo è anche indicato come CVE-2016-0800.
Per risolvere il problema, devi semplicemente disabilitare il supporto per SSLv2 sui server che utilizzano certificati SSL basati su RSA. SSLv2 è stato ritirato dal 2011. Non c'è più motivo per utilizzare SSLv2.
Due metodi per testare la vulnerabilità DROWN
Esistono due modi per testare la vulnerabilità DROWN:
- Vai al sito di test di attacco di annegamento e inserisci il nome di dominio o l'indirizzo IP del sito che desideri testare.
- Se vuoi testare i server in esecuzione dietro il tuo firewall o se vuoi automatizzare il test di tutti i tuoi server dalla riga di comando, utilizza lo script python sviluppato da Hubert Kario di RedHat come spiegato di seguito.
Installa lo script di prova Python DROWN
Non è necessario eseguire questa operazione sul server che si desidera testare. Puoi installare il seguente script python su qualsiasi server (ad esempio, su un server di sviluppo) e testare tutti gli altri server da questo server in cui è installato questo script python.
Per questo, dovresti avere Python 2.6 o versioni successive.
# python --version Python 2.6.6
Dovresti anche avere git installato sul tuo sistema:
# git --version git version 1.7.1
Crea una directory di annegamento.
cd ~ mkdir drown cd drown
Ottieni TLSFuzzer usando 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.
Dai un'occhiata al ramo SSL2
# cd tlsfuzzer # git checkout ssl2 Branch ssl2 set up to track remote branch ssl2 from origin. Switched to a new branch 'ssl2'
A questo punto, dovresti vedere i seguenti file nella directory ~/drown/tlsfuzzer
# ls build-requirements.txt docs LICENSE Makefile README.md requirements.txt scripts setup.py tests tlsfuzzer
Quindi, ottieni tlslite-ng, che è una libreria python open source che implementa i protocolli crittografici SSL e 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.
Quindi crea il collegamento appropriato per il tlslite che abbiamo appena scaricato sopra.
# ln -s .tlslite-ng/tlslite tlslite
Dai un'occhiata al ramo SSL2.
# 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
Ottieni lo script Python per la crittografia 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.
Crea un collegamento appropriato per lo script Python ECSDA.
# ln -s .python-ecdsa/ecdsa ecdsa
Verifica la vulnerabilità di DROWN utilizzando lo script Python – Esempio non vulnerabile
Infine, esegui lo script DROWN python come mostrato di seguito. Modifica l'indirizzo IP appropriato per il server che stai testando. Puoi anche utilizzare il nome di dominio invece dell'indirizzo IP qui.
# 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
Nota:dovresti vedere 6 OK sopra. Dovresti anche vedere "non riuscito:0".
Verifica la vulnerabilità di DROWN utilizzando lo script Python – Esempio di vulnerabilità
Quanto segue viene eseguito su un server vulnerabile all'attacco DROWN. Questo è ciò che vedrai quando sarà vulnerabile.
# 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
Risolto il problema dell'attacco DROWN
Nello scenario vulnerabile DROWN sopra, uno dei test case ha fallito. Per risolvere questo problema, aggiungi la seguente riga a httpd.conf di Apache e riavvia Apache.
# vi httpd.conf SSLProtocol All -SSLv2 -SSLv3
Se stai utilizzando NginX, assicurati che SSLv2 non sia elencato nel file di configurazione come mostrato di seguito.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
In Apache, dovremmo dire esplicitamente "-SSLv2" per disabilitare SSLv2. Ma in NginX, quando non elenchi SSLv2, è disabilitato.
Dopo la correzione di cui sopra, lo script di test DROWN di Python non ha più segnalato il problema su quel particolare server.
A parte Apache e NginX, se utilizzi Postfix per il tuo server di posta elettronica, dovresti disabilitare SSLv2 anche sul tuo server di posta elettronica.
Inoltre, aggiorna il tuo OpenSSL all'ultima versione. Nella nuova versione, il team di OpenSSL ha anche disabilitato SSLv2 per impostazione predefinita in fase di compilazione. Il team di OpenSSL ha questo suggerimento:aggiorna la versione 1.0.2 a 1.0.2g; e aggiorna la versione 1.0.1 alla 1.0.1s.
Riferimento aggiuntivo:
- Nota sulla vulnerabilità VU#583776
- CVE-2016-0800
- Attacco DROWN
- Avviso di sicurezza OpenSSL [1 marzo 2016]
- Una guida per l'utente OpenSSL per DROWN