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:
- Přejděte na testovací web drownattack a zadejte název domény nebo IP adresu webu, který chcete otestovat.
- 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