GNU/Linux >> Tutoriales Linux >  >> Linux

Cómo probar la vulnerabilidad del ataque DROWN de SSLv2 mediante el script de Python (y la solución para corregir el ataque DROWN en Apache y NginX)

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:

  1. Vaya al sitio de prueba de ahogamiento e ingrese el nombre de dominio o la dirección IP del sitio que desea probar.
  2. 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

Linux
  1. Cómo descargar archivos del servidor SFTP usando el script de python

  2. ¿Cómo probar y validar DNSSEC usando herramientas web y de excavación?

  3. ¿Cómo solucionar la vulnerabilidad DROWN en el servidor web Apache/NGINX y SMTP?

  4. Uso del script Apache2Buddy para rendimiento y estabilidad

  5. ¿Cómo ejecutar el script de python en la terminal (ubuntu)?

Cómo bloquear el acceso a wp-admin y wp-login en Nginx/Apache

Cómo cambiar el puerto de WordPress en Apache y Nginx

Cómo configurar la ejecución automática de un script de Python usando Systemd

Cómo desactivar la exploración de directorios en Apache y Nginx

Cómo habilitar TLS 1.3 en Apache y Nginx

Cómo agregar compatibilidad con PHP-FPM en el servidor web Apache y Nginx en Ubuntu 18.04