DROWN significa Descifrado de RSA con cifrado obsoleto y debilitado.
Esto es de la nota de vulnerabilidad VU#583776:El tráfico de red cifrado con certificados SSL basados en RSA sobre SSLv2 puede ser descifrado por el ataque DROWN.
Esto también se conoce como CVE-2016-0800.
Para solucionar el problema, simplemente debe deshabilitar la compatibilidad con SSLv2 en los servidores que utilizan certificados SSL basados en RSA. SSLv2 ha quedado obsoleto desde 2011. Ya no hay razón para que use SSLv2.
Dos métodos para probar la vulnerabilidad DROWN
Hay dos formas de probar la vulnerabilidad DROWN:
- Vaya al sitio de prueba de ahogamiento e ingrese el nombre de dominio o la dirección IP del sitio que desea probar.
- Si desea probar los servidores que se ejecutan detrás de su firewall, o si desea automatizar la prueba de todos sus servidores desde la línea de comandos, use la secuencia de comandos de python desarrollada por Hubert Kario de RedHat como se explica a continuación.
Instalar secuencia de comandos de prueba Python DROWN
No necesita hacer esto en el servidor que desea probar. Puede instalar la siguiente secuencia de comandos de Python en cualquiera de sus servidores (por ejemplo, en un servidor de desarrollo) y probar todos sus otros servidores desde este servidor donde está instalada esta secuencia de comandos de Python.
Para esto, debe tener Python 2.6 o superior.
# python --version Python 2.6.6
También deberías tener git instalado en tu sistema:
# git --version git version 1.7.1
Crea un directorio ahogado.
cd ~ mkdir drown cd drown
Obtén el 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.
Consulte la rama ssl2
# cd tlsfuzzer # git checkout ssl2 Branch ssl2 set up to track remote branch ssl2 from origin. Switched to a new branch 'ssl2'
En esta etapa, debería ver los siguientes archivos en el directorio ~/drown/tlsfuzzer
# ls build-requirements.txt docs LICENSE Makefile README.md requirements.txt scripts setup.py tests tlsfuzzer
A continuación, obtenga tlslite-ng, que es una biblioteca de Python de código abierto que implementa los protocolos criptográficos SSL y 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.
A continuación, cree el enlace apropiado para el tlslite que acabamos de descargar arriba.
# ln -s .tlslite-ng/tlslite tlslite
Echa un vistazo a la rama 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
Obtenga el script Python de criptografía 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.
Cree un enlace apropiado para la secuencia de comandos ECSDA de python.
# ln -s .python-ecdsa/ecdsa ecdsa
Prueba de la vulnerabilidad DROWN usando Python Script – Ejemplo no vulnerable
Finalmente, ejecute el script de Python DROWN como se muestra a continuación. Cambie la dirección IP correspondiente al servidor que está probando. También puede usar el nombre de dominio en lugar de la dirección IP aquí.
# 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:Debería ver 6 OK arriba. También debería ver "Error:0".
Prueba de la vulnerabilidad DROWN mediante secuencias de comandos de Python:ejemplo de vulnerabilidad
Lo siguiente se ejecuta en un servidor que era vulnerable al ataque DROWN. Esto es lo que verás cuando sea vulnerable.
# 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
Solucionar el problema del ataque DROWN
En el escenario vulnerable DROWN anterior, uno de los casos de prueba falló. Para solucionar este problema, agregue la siguiente línea al httpd.conf de Apache y reinicie Apache.
# vi httpd.conf SSLProtocol All -SSLv2 -SSLv3
Si está ejecutando NginX, asegúrese de que SSLv2 no aparezca en el archivo de configuración, como se muestra a continuación.
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
En Apache, deberíamos decir explícitamente "-SSLv2" para deshabilitar SSLv2. Pero en NginX, cuando no incluye SSLv2, está deshabilitado.
Después de la solución anterior, el script de prueba DROWN de python ya no informó el problema en ese servidor en particular.
Aparte de Apache y NginX, si está ejecutando Postfix para su servidor de correo electrónico, también debe deshabilitar SSLv2 en su servidor de correo electrónico.
Además, actualice su OpenSSL a la última versión. En la nueva versión, el equipo de OpenSSL también ha deshabilitado SSLv2 de forma predeterminada en el momento de la compilación. El equipo de OpenSSL tiene esta sugerencia:actualice la versión 1.0.2 a 1.0.2g; y actualice la versión 1.0.1 a 1.0.1s.
Referencia adicional:
- Nota de vulnerabilidad VU#583776
- CVE-2016-0800
- Ataque DROWN
- Aviso de seguridad de OpenSSL [1 de marzo de 2016]
- Guía del usuario de OpenSSL para DROWN