GNU/Linux >> Znalost Linux >  >> Linux

Jak otestovat zranitelnost SSLv2 DROWN Attack pomocí skriptu Python (a řešení, jak opravit útok DROWN na Apache a NginX)

DROWN znamená Decrypting RSA with Obsolete and Weakened eNcryption.

Toto je z Poznámka k chybě VU#583776:Síťový provoz šifrovaný pomocí certifikátů SSL založených na RSA přes SSLv2 může být dešifrován útokem DROWN.

Toto je také označováno jako CVE-2016-0800.

Chcete-li problém vyřešit, měli byste jednoduše zakázat podporu SSLv2 na serverech, které používají certifikáty SSL založené na RSA. SSLv2 je zastaralé od roku 2011. Není důvod, abyste SSLv2 nadále používali.

Dvě metody testování zranitelnosti DROWN

Existují dva způsoby, jak můžete otestovat zranitelnost DROWN:

  1. Přejděte na testovací web drownattack a zadejte název domény nebo IP adresu webu, který chcete otestovat.
  2. Pokud chcete otestovat servery, které běží za vaším firewallem, nebo pokud chcete automatizovat testování všech serverů z příkazového řádku, použijte skript python, který vyvinul Hubert Kario z RedHat, jak je vysvětleno níže.

Nainstalujte testovací skript Python DROWN

Na serveru, který chcete testovat, to nemusíte dělat. Následující skript python můžete nainstalovat na libovolný svůj server (například na server pro vývojáře) a otestovat všechny své ostatní servery z tohoto serveru, kde je tento skript python nainstalován.

K tomu byste měli mít Python 2.6 nebo vyšší.

# python --version
Python 2.6.6

Také byste měli mít na svém systému nainstalovaný git:

# git --version
git version 1.7.1

Vytvořte adresář utopení.

cd ~
mkdir drown
cd drown

Získejte TLSFuzzer pomocí 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.

Podívejte se na větev ssl2

# cd tlsfuzzer

# git checkout ssl2
Branch ssl2 set up to track remote branch ssl2 from origin.
Switched to a new branch 'ssl2'

V této fázi byste měli vidět následující soubory v adresáři ~/drown/tlsfuzzer

# ls
build-requirements.txt  docs  LICENSE  Makefile  README.md  requirements.txt  scripts  setup.py  tests  tlsfuzzer

Dále si pořiďte tlslite-ng, což je open source python knihovna, která implementuje kryptografické protokoly SSL a 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.

Dále vytvořte příslušný odkaz na tlslite, který jsme právě stáhli výše.

# ln -s .tlslite-ng/tlslite tlslite

Podívejte se na větev 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

Získejte kryptografický python skript 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.

Vytvořte vhodný odkaz pro skript python ECSDA.

# ln -s .python-ecdsa/ecdsa ecdsa

Otestujte zranitelnost DROWN pomocí skriptu Python – příklad bez zranitelnosti

Nakonec spusťte skript DROWN python, jak je znázorněno níže. Změňte IP adresu odpovídající serveru, který testujete. Zde také můžete místo ip-adresy použít název domény.

# 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

Poznámka:Měli byste vidět 6 OK výše. Měli byste také vidět „failed:0“.

Test zranitelnosti DROWN pomocí skriptu Python – příklad zranitelnosti

Následující se provádí na serveru, který byl zranitelný vůči útoku DROWN. Toto uvidíte, když je zranitelný.

# 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

Opravit problém DROWN Attack

Ve výše uvedeném scénáři zranitelnosti DROWN selhal jeden z testovacích případů. Chcete-li tento problém vyřešit, přidejte následující řádek do souboru httpd.conf Apache a restartujte Apache.

# vi httpd.conf
SSLProtocol All -SSLv2 -SSLv3

Pokud používáte NginX, ujistěte se, že SSLv2 není uvedeno v konfiguračním souboru, jak je uvedeno níže.

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

V Apache bychom měli výslovně říci „-SSLv2“, abychom zakázali SSLv2. Ale v NginX, když neuvedete SSLv2, je zakázáno.

Po výše uvedené opravě již testovací skript python DROWN problém na tomto konkrétním serveru nehlásil.

Kromě Apache a NginX, pokud používáte Postfix pro svůj e-mailový server, měli byste také zakázat SSLv2 na vašem e-mailovém serveru.

Upgradujte také OpenSSL na nejnovější verzi. V nové verzi tým OpenSSL také deaktivoval SSLv2 ve výchozím nastavení v době sestavování. Tým OpenSSL má tento návrh:Upgradujte verzi 1.0.2 na 1.0.2g; a upgradujte verzi 1.0.1 na 1.0.1s.

Další reference:

  • Poznámka VU#583776
  • CVE-2016-0800
  • Útok DOWN
  • OpenSSL Security Advisory [1. března 2016]
  • Uživatelská příručka OpenSSL pro DROWN

Linux
  1. Jak stahovat soubory ze serveru SFTP pomocí skriptu python

  2. Jak testovat a ověřovat DNSSEC pomocí dig a webových nástrojů?

  3. Jak získat vlastní IP adresu a uložit ji do proměnné ve skriptu Shell?

  1. Jak opravit zranitelnost DROWN na webovém serveru Apache/NGINX a SMTP?

  2. Jak komprimovat a extrahovat soubory pomocí příkazu tar v systému Linux?

  3. Použití skriptu Apache2Buddy pro výkon a stabilitu

  1. Jak spustit python skript na terminálu (ubuntu)?

  2. Jak ukončit terminál Linux pomocí skriptu Python?

  3. Jak mohu pomocí bash zjistit průměr, maximum a minimum ze seznamu čísel?