使用 Python 脚本测试 SSLv2 DROWN 攻击漏洞
【摘要】 DROWN 代表 Decrypting RSA with Obsolete and Weakened eNcryption。
这来自漏洞说明VU#583776:在 SSLv2 上使用基于 RSA 的 SSL 证书加密的网络流量可能会被 DROWN 攻击解密。
这也称为CVE-2016-0800。
DROWN 代表 Decrypting RSA with Obsolete and Weakened eNcryption。
这来自漏洞说明VU#583776:在 SSLv2 上使用基于 RSA 的 SSL 证书加密的网络流量可能会被 DROWN 攻击解密。
这也称为CVE-2016-0800。
要解决此问题,您只需在使用基于 RSA 的 SSL 证书的服务器上禁用对 SSLv2 的支持。SSLv2 自 2011 年以来已被弃用。您没有理由再使用 SSLv2。
测试 DROWN 漏洞的两种方法
有两种方法可以测试 DROWN 漏洞:
- 进入drownattack 测试站点,输入您要测试的站点的域名或 IP 地址。
- 如果您想测试在防火墙后面运行的服务器,或者如果您想从命令行自动测试所有服务器,请使用由 RedHat 的 Hubert Kario 开发的python 脚本,如下所述。
安装 Python DROWN 测试脚本
您无需在要测试的服务器上执行此操作。您可以在您的任何服务器上安装以下 python 脚本(例如,在开发服务器上),并从安装此 python 脚本的服务器测试所有其他服务器。
为此,您应该拥有 Python 2.6 或更高版本。
# python --version
Python 2.6.6
您还应该在系统上安装 git:
# git --version
git version 1.7.1
创建一个淹没目录。
cd ~
mkdir drown
cd drown
使用 git clone 获取 TLSFuzzer
# 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.
签出 ssl2 分支
# cd tlsfuzzer
# git checkout ssl2
Branch ssl2 set up to track remote branch ssl2 from origin.
Switched to a new branch 'ssl2'
在这个阶段,你应该在 ~/drown/tlsfuzzer 目录下看到以下文件
# ls
build-requirements.txt docs LICENSE Makefile README.md requirements.txt scripts setup.py tests tlsfuzzer
接下来,获取 tlslite-ng,这是一个实现 SSL 和 TLS 加密协议的开源 python 库。
# 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.
接下来为我们刚刚在上面下载的 tlslite 创建适当的链接。
# ln -s .tlslite-ng/tlslite tlslite
签出 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
获取 ECDSA 加密 python 脚本。
# 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.
为 python ECSDA 脚本创建适当的链接。
# ln -s .python-ecdsa/ecdsa ecdsa
使用 Python 脚本测试 DROWN 漏洞——非漏洞示例
最后,执行如下所示的 DROWN python 脚本。更改适合您正在测试的服务器的 IP 地址。您也可以在此处使用域名而不是 ip-address。
# 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
注意:您应该看到上面的 6 个 OK。您还应该看到“失败:0”。
使用 Python 脚本测试 DROWN 漏洞 – 漏洞示例
以下是在易受 DROWN 攻击的服务器上执行的。这就是当它易受攻击时你会看到的。
# 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
修复 DROWN 攻击问题
在上述 DROWN 易受攻击的场景中,其中一个测试用例失败了。要解决此问题,请将以下行添加到 Apache 的 httpd.conf,然后重新启动 Apache。
# vi httpd.conf
SSLProtocol All -SSLv2 -SSLv3
如果您正在运行 NginX,请确保 SSLv2 未列在配置文件中,如下所示。
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
在 Apache 中,我们应该明确地说“-SSLv2”来禁用 SSLv2。但是在 NginX 中,当您不列出 SSLv2 时,它会被禁用。
在上述修复之后,python DROWN 测试脚本不再报告该特定服务器上的问题。
除了 Apache 和 NginX,如果您正在为您的电子邮件服务器运行 Postfix,您还应该在您的电子邮件服务器上禁用 SSLv2。
此外,将您的 OpenSSL 升级到最新版本。在新版本中,OpenSSL 团队还在构建时默认禁用了 SSLv2。OpenSSL 团队有这样的建议:将 1.0.2 版本升级到 1.0.2g;并将 1.0.1 版本升级到 1.0.1s。
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
作者其他文章
评论(0)