使用 Python 脚本测试 SSLv2 DROWN 攻击漏洞

举报
Tiamo_T 发表于 2022/10/13 09:47:14 2022/10/13
【摘要】 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 漏洞:

  1. 进入drownattack 测试站点,输入您要测试的站点的域名或 IP 地址。
  2. 如果您想测试在防火墙后面运行的服务器,或者如果您想从命令行自动测试所有服务器,请使用由 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

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。