GNU/Linux >> Linux Esercitazione >  >> Linux

Come testare la vulnerabilità dell'attacco DROWN SSLv2 utilizzando lo script Python (e la soluzione per correggere l'attacco DROWN su Apache e NginX)

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:

  1. Vai al sito di test di attacco di annegamento e inserisci il nome di dominio o l'indirizzo IP del sito che desideri testare.
  2. 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

Linux
  1. Come scaricare file dal server SFTP utilizzando lo script python

  2. Come comprimere ed estrarre file usando il comando tar su Linux?

  3. Come eseguire lo script Python sul terminale (ubuntu)?

  4. Come uscire dal terminale Linux usando lo script Python?

  5. Come installare l'ultimo nginx su Debian e Ubuntu

Come bloccare l'accesso a wp-admin e wp-login in Nginx/Apache

Come modificare la porta di WordPress in Apache e Nginx

Come configurare l'esecuzione automatica di uno script Python utilizzando Systemd

Come disattivare la navigazione delle directory su Apache e Nginx

Come abilitare TLS 1.3 su Apache e Nginx

Come aggiungere il supporto PHP-FPM su Apache e Nginx Web Server su Ubuntu 18.04