tlsfuzzer/tlsfuzzer
GitHub: tlsfuzzer/tlsfuzzer
一款用于 SSL/TLS 协议实现的测试套件与模糊测试框架,通过验证错误处理和协议合规性来保障实现的安全性与正确性。
Stars: 626 | Forks: 137
[](https://github.com/tlsfuzzer/tlsfuzzer/actions/workflows/ci.yml)
[](https://tlsfuzzer.readthedocs.io/en/latest/)
[](https://coveralls.io/r/tlsfuzzer/tlsfuzzer?branch=master)
# tlsfuzzer
tlsfuzzer 是一个用于 SSLv2、SSLv3、TLS 1.0、TLS 1.1、TLS 1.2 和
TLS 1.3 实现的测试套件。它目前处于早期开发阶段,因此不提供
API 稳定性保证。虽然它使用模糊测试(fuzzing)技术进行测试
(对传入的输入进行随机化),但脚本的编写方式通常旨在
验证正确的错误处理:与典型的 fuzzer 不同,它不仅
检查被测系统是否崩溃,还会检查其是否
返回了正确的错误消息。
您可以在 `scripts/` 目录中找到用于测试许多漏洞的现成脚本(
[ROBOT](https://robotattack.org/)、
[DROWN](https://drownattack.com/) 等)
以及通用标准符合性(
[RFC 5246](https://tools.ietf.org/html/rfc5246)、
[RFC 7627](https://tools.ietf.org/html/rfc7627)、
[RFC 7905](https://tools.ietf.org/html/rfc7905) 等)。
## 依赖项
您需要:
* Python 2.6 或更高版本,或 Python 3.6 或更高版本
* [tlslite-ng](https://github.com/tlsfuzzer/tlslite-ng)
0.8.1 或更高版本(请注意,`tlslite` 将*无法*使用,并且
它们彼此冲突)
* [ecdsa](https://github.com/warner/python-ecdsa)
python 模块(tlslite-ng 的依赖项,应会
随其自动安装),为获得最佳性能,请至少使用 0.15 版本
或者,为了使加密计算显著加快,您可能
需要安装以下库(详情请参阅 tlslite-ng 和 python-ecdsa
的 README 文件):
* m2crypto
* gmpy
要获取 `pip`(如果您的 python 安装中尚未包含它),请下载
[get-pip.py](https://bootstrap.pypa.io/get-pip.py) 并运行
(或者参阅 [USAGE.md](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/USAGE.md)
了解不需要安装软件包的替代配置):
```
python get-pip.py
```
然后安装 tlslite-ng:
```
pip install --pre tlslite-ng
```
(如果您之前已经安装过,请使用 `--upgrade --pre`)
下载 tlsfuzzer:
```
git clone https://github.com/tlsfuzzer/tlsfuzzer.git
```
## 用法
安装所有依赖项后,请确保:
* 您位于项目的目录中(在 git clone 之后,只需执行 `cd tlsfuzzer`)
* 您想要测试的服务器正在同一台计算机上运行 (localhost)
* 服务器正在侦听 4433 端口
* 并且服务器将使用数据回复 HTTP 查询(回复有效的
HTTP 响应是可选的)
然后,您可以运行
[`scripts`](https://github.com/tlsfuzzer/tlsfuzzer/tree/master/scripts)
目录中的其中一个测试,如下所示:
```
scripts/test-invalid-compression-methods.py
```
如果测试有额外要求,它将把它们输出到控制台。没有打印错误
意味着满足了所有预期(因此,对于具有不良数据的测试,
服务器拒绝了我们的消息)。
所有脚本还接受 `--help` 以打印帮助消息(特定
脚本支持的所有选项的说明),`-h` 用于指定
被测服务器的主机名或 IP 地址,`-p` 用于指定
要测试的服务的端口。
有关更多
信息以及如何解释脚本报告的错误和失败,请参阅 [USAGE.md](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/USAGE.md)。
您可以在
[tlsfuzzer.readthedocs.io](https://tlsfuzzer.readthedocs.io) 找到该项目的更详细文档。
使用 tlsfuzzer 测试时序侧信道攻击(Lucky13、padding
oracle 攻击和基于时序的 Bleichenbacher oracle)的内容在
[TIMING.md](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/TIMING.md)
文档中进行了描述。
## 被测服务器配置
通常,被测服务器只需要一个 RSA 证书,
您可以使用以下 OpenSSL 命令创建它:
```
openssl req -x509 -newkey rsa -keyout localhost.key -out localhost.crt -subj \
/CN=localhost -nodes -batch
```
**注意**:tlsfuzzer 仅验证 TLS 层面的行为,它不会对
证书执行任何检查(例如主机名验证、CA 签名或
密钥用法)。但是,它确实会验证服务器在 TLS 消息上所做的签名
(例如在 Server Key Exchange 或 Certificate Verify 消息中)
是否与服务器发送的证书匹配。
更详细的说明,包括如何从源代码构建不同的框架,
可以在
[服务器设置](https://github.com/tlsfuzzer/tlsfuzzer/wiki/Server-setup) wiki
页面中找到。
服务器配置示例:
### OpenSSL
要测试 OpenSSL,在典型的 `s_server` 命令行中
传递一个额外的 `-www` 选项就足够了:
```
openssl s_server -key localhost.key -cert localhost.crt -www
```
### GnuTLS
要测试 GnuTLS 服务器,您需要告诉它表现为 HTTP 服务器,
另外,不要要求客户端证书:
```
gnutls-serv --http -p 4433 --x509keyfile localhost.key --x509certfile \
localhost.crt --disable-client-cert
```
### NSS
要测试 Mozilla NSS 库服务器,您首先需要创建一个
包含服务器证书的数据库:
```
mkdir nssdb
certutil -N -d sql:nssdb --empty-password
openssl pkcs12 -export -passout pass: -out localhost.p12 -inkey localhost.key \
-in localhost.crt -name localhost
pk12util -i localhost.p12 -d sql:nssdb -W ''
```
最后,启动支持 TLSv1.0 及更高版本协议、DHE
密码以及上述证书的服务器:
```
selfserv -d sql:./nssdb -p 4433 -V tls1.0: -H 1 -n localhost
```
### 高级配置
更高级和复杂的配置以及如何从源代码编译
上述服务器的说明,可在 wiki 页面
[服务器设置](https://github.com/tlsfuzzer/tlsfuzzer/wiki/Server-setup) 上找到。
## 贡献
请参阅
[CONTRIBUTING.md](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/CONTRIBUTING.md)
文档,了解有关如何设置开发环境、对更改进行健全性
检查以及更改需要遵循的要求的说明。
您可能还需要阅读
[VISION.md](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/VISION.md)
以了解有关该项目计划范围的更多信息。
在与社区其他成员互动时,贡献者应遵守项目的
[行为准则](https://github.com/tlsfuzzer/tlsfuzzer/blob/master/CODE_OF_CONDUCT.md)
标签:Maven, Python, TLS, 安全测试, 攻击性安全, 无后门, 漏洞验证, 逆向工具, 防御工具, 防御绕过