
TLS-Attacker v7.0.0-rtc
Фреймворк на Java для систематического фаззинга и анализа TLS-библиотек. Позволяет произвольное создание и модификацию сообщений протокола, а также тестирование клиентов/серверов TLS на предмет обнаружения уязвимостей.
TLS-Attacker
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, выполните команду maven из каталога TLS-Attacker:
$ 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: прототип для MitM-сценариев
- TLS-Server: пример серверного приложения
- TLS-Proxy: использование TLS-Attacker для SSLSockets
- TraceTool: инспекция и модификация трасс рабочего процесса TLS-Attacker
- Transport: транспортные утилиты для нижних уровней
- Utils: набор вспомогательных классов

Дополнительную информацию об этих модулях можно найти в 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
- Рабочие процессы с участием более двух сторон
- Множество расширений
- Tokenbinding (EC) и Tokenbinding через HTTP
- Сокеты
- 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
Эта команда запускает TLS-сервер на порту 4433.
Если вы хотите подключиться к серверу, используйте эту команду:
$ 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
Если вы более опытный разработчик, вы можете создать собственный поток TLS-сообщений, написав Java-код. Например:
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-структуру и запустить свой настраиваемый TLS-протокол из XML:
<?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>
<!-- Отправить обмен ключами клиента и Finish -->
<Send>
<configuredMessages>
<RSAClientKeyExchange/>
<ChangeCipherSpec/>
<Finished/>
</configuredMessages>
<configuredRecords>
<record/>
<record/>
<record/>
</configuredRecords>
</Send>
<!-- Получить Finish сервера -->
<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
Protocol-Attacker / Система уровней
Изначально разработанный для атак на протокол TLS, TLS-Attacker способен поддерживать произвольные протоколы. Для этого TLS-Attacker назначает стек уровней каждому соединению. Этот стек уровней состоит из различных протокольных уровней, которые пользователь хочет использовать. С помощью стека уровней пользователь может добавлять такие уровни, как DTLS или HTTP (ещё находятся в разработке), в произвольном порядке.