7.6 KiB
Netrunner TLS Engine (tlseng)
Модуль tlseng — это высокопроизводительное ядро для генерации, парсинга и манипуляции TLS-трафиком (TLS 1.2 / TLS 1.3). Основная задача движка — обход систем глубокого анализа трафика (DPI) и активных проб (Active Probing) путем идеальной мимикрии под легитимный трафик современных браузеров.
Движок не является полноценной реализацией криптографического стека TLS. Это "умный фасад", который формирует криптографически достоверные пакеты ClientHello и ServerHello, позволяя скрыто передавать авторизационные данные и устанавливать защищенные туннели, неотличимые от обычного HTTPS-трафика.
🌟 Ключевые возможности
- Perfect Fingerprint Mimicry (JA3 / JA4): Полная имитация параметров расширений, порядка их следования, поддерживаемых групп и наборов шифров. Движок генерирует отпечатки, на 100% совпадающие с реальными браузерами (Chrome, Edge, Firefox, Safari).
- Stealth Authentication (Stateless): Уникальный механизм скрытой авторизации. Токен доступа (Auth Tag) маскируется внутри поля
Session ID(TLS 1.3 эхо), что позволяет серверу аутентифицировать клиента еще до начала обмена Application Data, не привлекая внимания DPI. - Advanced GREASE Support: Автоматическая и контекстно-зависимая генерация случайных идентификаторов (GREASE) согласно RFC 8701 для обхода сигнатурных фильтров, специфичных для Chromium-браузеров.
- Smart Padding: Интеллектуальный расчет расширения
Paddingс учетом размера всех заголовков (overhead) для выравнивания пакетаClientHelloдо заданного размера (например, ровно 512 байт для Chrome), исключая эвристическое детектирование по длине пакета. - Zero-Copy Parsing: Использование крейта
bytes(Bytes,BytesMut) для парсинга и сериализации пакетов без лишних аллокаций в памяти.
🏗 Архитектура модулей
Структура модуля разделена на логические компоненты для максимальной гибкости и расширяемости:
profile/: База данных профилей браузеров и серверов (BrowserProfile,ServerProfile). Содержит константы для версий, шифров, наличия GREASE, ALPS и целевого размера паддинга.extension/: Мощный и потокобезопасныйExtensionBuilderдля сборки TLS-расширений (SNI, ALPN, KeyShare, ALPS, Supported Versions и т.д.) в строгом соответствии с профилем.handshake/: Реализация структурClientHelloиServerHello. Управляет генерацией рандома, встраиванием скрытых тегов и выбором шифров.tls_record/: Низкоуровневая инкапсуляция данных вTlsRecordс правильным указанием версий (маскировка Record Layer Version под0x0301).types/иconsts/: Строго типизированные перечисления (Enums) и константы протокола TLS.
🛠 Глубокое погружение: Как это работает
1. Профилирование трафика
Движок не хардкодит расширения. Вместо этого ExtensionBuilder принимает BrowserProfile. Профиль указывает, нужны ли GREASE-значения, какой должен быть ExtensionOrder (порядок следования) и до какого размера "надувать" пакет паддингом. Это позволяет в одну строчку переключать маскировку с Chrome 131 на Firefox 130.
2. Скрытая авторизация (Session ID Auth)
В TLS 1.3 поле Session ID сохранено для обратной совместимости (Middlebox Compatibility Mode).
tlseng использует это 32-байтовое поле как контейнер:
- Клиент: Заполняет первые 16 байт случайными данными, а в последние 16 байт записывает HMAC (Auth Tag), сгенерированный на основе локального времени и мастер-ключа.
- DPI: Видит стандартный 32-байтовый массив, неотличимый от обычного рандома.
- Сервер: Извлекает последние 16 байт из
ClientHelloи верифицирует их. Если проверка не пройдена, соединение разрывается (защита от активного сканирования). Если пройдена — сервер возвращает этот жеSession IDэхом вServerHello.
🚀 Примеры использования
Генерация ClientHello (на стороне клиента)
Создание маскировочного пакета под Chrome 131 со встроенной авторизацией:
use crate::tlseng::profile::BrowserProfile;
use crate::tlseng::extension::ExtensionBuilder;
use crate::tlseng::handshake::ClientHello;
use crate::tlseng::tls_record::TlsRecord;
use bytes::Bytes;
pub fn make_client_hello(profile: &BrowserProfile, host: &str, keys: &SessionKeys) -> Bytes {
let tls_random = keys.salt.get_local();
// Расчет размера заголовков для точного Padding
let overhead = 5 + 4 + 2 + 32 + 1 + 32 + 2 + (profile.cipher_suites.len() * 2) + 2 + 2;
// Сборка расширений по профилю
let mut ext_builder = ExtensionBuilder::new();
ext_builder.apply_profile(profile, host, &keys.ecdh.public_key.to_bytes(), overhead);
let extensions_bytes = ext_builder.build();
// Генерация Session ID с Auth Tag
let mut session_id_bytes = [0u8; 32];
rand::fill(&mut session_id_bytes[..16]);
session_id_bytes[16..].copy_from_slice(&keys.generate_auth_tag());
let client_hello = ClientHello {
version: profile.versions.get_legacy(), // Всегда 0x0303 для TLS 1.3
random: tls_random,
session_id: Bytes::copy_from_slice(&session_id_bytes),
cipher_suites: profile.cipher_suites.to_vec(),
extensions: extensions_bytes,
};
let record = TlsRecord::new(
ContentType::Handshake,
profile.record_layer_version, // 0x0301 для маскировки
client_hello.serialize(),
);
record.serialize()
}