TLS-Scanner 是一个帮助渗透测试人员和安全研究人员评估 TLS 服务器和客户端配置的工具。
请注意: TLS-Scanner 是一个面向 TLS 开发者、渗透测试人员、管理员和研究人员的科研工具。没有图形界面。它处于第一个版本,可能包含一些错误。
要编译并使用 TLS-Scanner,你需要运行:
$ cd TLS-Scanner
$ git submodule update --init --recursive
$ mvn clean package
或者,如果你赶时间,可以通过以下命令跳过测试:
$ mvn clean package -DskipTests=true
如果你希望将 TLS-Scanner 作为库使用,你需要通过以下命令安装它:
$ mvn clean install
要运行 TLS-Scanner,你需要运行 apps/ 文件夹中的 jar 文件之一。这些文件可以通过自己编译应用程序获得,也可以从 GitHub 下载发布的 jar 包。
$ java -jar apps/TLS-Server-Scanner.jar -connect localhost:4433
你必须通过 -connect 参数指定要扫描的主机。
如果你想提高扫描性能,可以使用 -threads 参数增加使用的线程数。
另一个对性能很重要的参数是 -scanDetail,它可以用来配置扫描的详细程度。可能的值从快速到非常详细依次是:QUICK, NORMAL, DETAILED, ALL。
输出的详细程度可以通过 -reportDetail 参数配置。要查看关于准则的更多细节,请使用 -reportDetail ALL。
默认情况下,结果仅输出到控制台。如果你想要机器可读的输出,可以使用 -outputFile output.json 自动将结果写入 JSON 文件。
最常见的修改参数是 -scanDetail 和 -reportDetail。下面我们说明这些参数的一些使用场景。
大多数情况下,我们的默认参数设置就足够了。这会将两个详细程度都设置为 NORMAL 进行扫描。
如果你想进行快速扫描并快速了解系统概况,我们建议将两个详细程度都设置为 QUICK。这会限制某些探测的范围以降低运行时间,并将报告细节限制在不包含非常详细和技术性信息。
如果你想全面评估系统并执行所有可用探测,我们建议将两个详细程度都设置为 ALL。这将完全执行所有现有探测,并打印非常详细的信息以供进一步分析和评估。
要获取所有可能的参数的详细信息,请使用 -help 参数或不设置任何参数直接运行 jar 包。
我们提供预构建的 Docker 镜像,以便轻松使用 TLS-Server-Scanner。
$ docker run -it --network host ghcr.io/tls-attacker/tlsscanner -connect localhost:4433
该镜像专为服务器扫描而构建,但也包含其他 jar 文件。可以通过修改 entrypoint 来访问它们。
$ docker run -it --network host --entrypoint java ghcr.io/tls-attacker/tlsscanner -jar TLS-Client-Scanner.jar
我们还提供了一个 Dockerfile,供您自行构建容器:
$ docker build . -t tlsscanner
$ docker run -t tlsscanner
请注意: 我完全不熟悉 Docker 的最佳实践。如果您知道如何改进 Dockerfile,欢迎提出 pull request。
(TLS)探测有时有前提条件,需要满足才能执行该特定探测。需求系统允许你定义一组这样的需求,这些需求必须被满足才能执行该探测。
每个需求都提供一个 evaluate 函数,返回一个布尔值,指示该需求是否已满足。
需求可以通过多种方式使用常见的逻辑运算进行组合。每个需求都提供 and、or、not 和 xor 实例方法来链式组合多个需求。目前实现了以下探测,可以直接使用:
FulfilledRequirement - 始终评估为 true,用于表示没有需求。UnfulfillableRequirement - 始终评估为 false,阻止探测执行。ProbeRequirement - 如果指定的探测已执行,则评估为 true。PropertyRequirement - 如果指定的分析属性具有预定义的值,则评估为 true。该值可以作为构造函数参数提供,也可以使用 PropertyTrueRequirement 和 PropertyFalseRequirement 作为 TestResults.TRUE 和 TestResults.FALSE 的简写。PropertyComparatorRequirement - 如果某个分析属性的集合结果小于、等于或大于一个常数值,则评估为 true。除了这些预定义的需求之外,你还可以在 getRequirements 方法中匿名扩展 Requirement 类。如果不需要任何需求,你可以返回一个 FulfilledRequirement,它始终评估为 true。
有关如何使用需求的示例可以在 tls-client-scanner 和 tls-server-scanner 的 probe 包中找到。
@Override
public Requirement<ClientReport> getRequirements() {
return new ProbeRequirement<ClientReport>(TlsProbeType.CIPHER_SUITE)
.and(new PropertyTrueRequirement<>(TlsAnalyzedProperty.SUPPORTS_DHE));
}
ProtocolRequirement - 如果支持某些协议版本,则评估为 true。ExtensionRequirement - 如果远程对等方支持某些扩展,则评估为 true。OptionsRequirement - 如果设置了额外的 CLI 标志,则评估为 true。目前用于某些客户端探测(ALPN、SNI、会话恢复)。WorkingConfigRequirement - 如果找到了一个有效的配置,则评估为 true。