TLS fingerprinting: методы идентификации клиентского и серверного программного обеспечения


Оглавление

1. TLS fingerprinting: методы идентификации клиентского и серверного программного обеспечения

1.1 Что такое TLS fingerprinting и для чего он применяется

1.2 Чем ещё интересен TLS fingerprinting

1.3 Как работает TLS fingerprinting

1.4 Как вычисляются хеши для TLS fingerprinting

1.5 Различают TLS fingerprinting клиентов и серверов

1.6 Слабые места TLS fingerprinting

1.7 Возможно, Encrypted Client Hello / ECH сможет (частично) предотвращать TLS fingerprinting

2. TLS fingerprinting клиентов: типы хешей, утилиты для показа TLS отпечатков клиентов

3. TLS fingerprinting серверов: типы хешей, утилиты для показа TLS отпечатков серверов

4. Как изменить и подделать TLS отпечатки. Как обойти фильтрацию на основе TLS fingerprinting


1.1 Что такое TLS fingerprinting и для чего он применяется

Идентификация по TLS отпечаткам позволяет узнать тип программного обеспечения клиента или сервер с высокой степенью точности, при этом достаточно первого пакета соединения.

TLS fingerprinting — методы выявления индивидуальных различий программного обеспечения, использующего Transport Layer Security (TLS). Благодаря этим индивидуальным отличиям, можно с большой долей вероятности отличить веб-браузер от утилиты cURL, определить производителя и версию веб-браузера, выявить пользователя Tor, вирус или управляющий ботнетом сервер и так далее. И всё это не требует расшифровки трафика или каких-то особых действий или взаимодействие с клиентом или сервером — достаточно данных передающихся в том виде, как они есть.

В настоящее время большинство клиентов и серверов используют HTTPS (TLS), то есть TLS fingerprinting может быть применим ко всем нам.

При этом TLS fingerprinting характеризуется следующими особенностями:

  • отпечатки TLS трудно скрыть или подделать (без специализированного программного обеспечения)
  • всё программное обеспечение использующее криптографические протоколы, обеспечивающие защищённую передачу данных между узлами в сети Интернет (TLS), подвержены TLS fingerprinting
  • TLS fingerprinting применим как для клиентов, так и для серверов
  • TLS fingerprinting можно выполнять при пассивном прослушивании трафика (или анализе файлов с захваченным трафиком), активное сканирование или другое взаимодействие с клиентами и серверами (обычно) не требуется
  • разные группы программного обеспечения обычно имеют различные отпечатки TLS. Причём эти отпечатки могут быть уникальными для определённых версий ПО. То есть с помощью TLS fingerprinting можно не только определить, что запрос сделан веб-браузером Firefox, но и его версию
  • хотя криптографические протоколы TLS обеспечивают передачу в зашифрованном виде, для сбора отпечатков TLS не требуется расшифровка трафика. В TLS fingerprinting используется начальный трафик TLS протоколов, который передаётся в незашифрованном виде

Конечно, TLS fingerprinting имеется свои слабые места, но, безусловно, это весьма интересный вопрос, который мы разберём в этом цикле статей.

Типичное применение TLS fingerprinting:

  • защита сайтов от ботов (например, Cloudflare использует TLS fingerprinting для фильтрации явных ботов)
  • защита от DDoS атак с возможностью быстро отфильтровать клиентов формирующих вредоносный трафик
  • выявление инфраструктуры Command and Control (также известны как C2 или C&C) — однотипные сервера, управляющие вредоносным программным обеспечением скорее всего будут иметь одинаковые хеши TLS отпечатков, которые отличны от другого ПО
  • появление (или всплеск) в корпоративной среде клиентов с нетипичными TLS сигнатурами может свидетельствовать о компрометации

1.2 Чем ещё интересен TLS fingerprinting?

Принципы идентификации сетевых клиентов и серверов использующих шифрование, которые применяются в TLS fingerprinting, могут использоваться для идентификации трафика и ПО в других сферах. Например, похожие методы идентификации клиентов и серверов реализованы для SSH. Видимо, в той или иной степени это также применимо для VPN трафика.

И, как будто бы недостаточно TLS fingerprinting, даже для веб-трафика имеется ещё один способ идентификации клиентов — HTTP/2 fingerprinting.

И всё это даёт повод задуматься — какие ещё (не известные нам) методы идентификации существуют?


Примечание: HTTP/2 fingerprinting тоже будет рассмотрен в одном из следующих циклов статей на HackWare.ru — оставайтесь на связи!

В настоящее время TLS fingerprinting уже внедрён многими компаниями, чья деятельность связана с сетевыми услугами. Если вам интересно, когда появился TLS fingerprinting, то уже в 2009 в публичном доступе имелся Apache модуль mod_sslhaf, выполняющий пассивное снятие SSL отпечатков клиентов: https://github.com/ssllabs/sslhaf. То есть в 2009 ещё мало кто использовал HTTPS, а TLS fingerprinting уже был придумал и реализован в виде даже публичного кода.

JA3 стал открытым исходным кодом в 2017 (с использованием идей публично обсуждаемых с 2015).

Если вас интересует история TLS fingerprinting, то чуть больше вы найдёте здесь: https://blog.hqcodeshop.fi/archives/473-JA3-TLS-fingerprinting-with-Wireshark.html

1.3 Как работает TLS fingerprinting

Источник этого раздела: https://lwthiker.com/networks/2022/06/17/tls-fingerprinting.html

TLS — это эволюция SSL, протокола, который ранее отвечал за обработку зашифрованных соединений между веб-клиентами и серверами. SSL больше не используется повсеместно, но его название по-прежнему ошибочно используется для обозначения TLS.

Всякий раз, когда веб-клиент — браузер, скрипт или инструмент командной строки — получает доступ к сайту, зашифрованному с помощью TLS (https://…), он сначала выполняет рукопожатие TLS с сервером. Вот схематическая диаграмма из Википедии:

Первое сообщение — это TLS Client Hello, отправляемое клиентом серверу. В этом сообщении клиент объявляет серверу, какие части протокола TLS он поддерживает. Ниже приведены примеры параметров, отправляемых клиентом:

  • Версии протокола TLS, поддерживаемые клиентом (от TLS 1.0 до TLS 1.3).
  • Криптографические алгоритмы, которые клиент поддерживает для шифрования данных, известные как наборы шифров.
  • Криптографические алгоритмы, которые клиент поддерживает для цифровых подписей.

Как это часто бывает, каждый клиент использует свою библиотеку TLS: Firefox использует NSS, Chrome использует BoringSSL, Safari использует Secure Transport, а Python использует OpenSSL. В результате вышеуказанные параметры значительно различаются между клиентами. Вот пример списка наборов шифров, объявленного Chrome в приветствии клиента TLS, полученный Wireshark:

Этот список – его содержимое и порядок шифров – отличается в зависимости от используемого клиента TLS. Кроме того, TLS – это настолько сложный протокол, что у него есть много расширений, каждое из которых имеет свой собственный набор дополнительных параметров. Приведём несколько примеров:

  • Некоторые клиенты поддерживают сжатие обмениваемых сертификатов с помощью выделенного расширения TLS.
  • Некоторые клиенты поддерживают согласование параметров для базового протокола (например, HTTP/2) с помощью выделенного расширения TLS под названием ALPS.
  • Некоторые клиенты добавляют поддельное расширение TLS под названием GREASE.

Вот как выглядит список расширений TLS Chrome в Wireshark (обратите внимание, что если вы будете анализировать захваченный трафик в Wireshark и рассматривать TLS расширения в Chrome, то порядок расширений будет другим!):

Для каждого браузера указанный выше список расширений отличается, и порядок расширений также может отличаться.


Ниже приведена сравнительная таблица, демонстрирующая заметные различия в подписях TLS обычных клиентов:


  Chrome Safari Firefox Python
Количество наборов шифров 16 27 17 43
Количество алгоритмов подписи 8 11 11 20
Расширение ALPS Да Нет Нет Нет
Метод сжатия сертификата Brotli Zlib Нет None
Расширение GREASE Да Да Нет Нет

Примечание: Chrome 101, Firefox 100, Safari 15.4, Python 3.8.10 с OpenSSL 1.1.1f и библиотекой requests. Источник: https://lwthiker.com/networks/2022/06/17/tls-fingerprinting.html

С учётом этого очевидно, что веб-клиентов можно легко отличить по их характерным особенностям (отпечаткам) TLS. Примечательно то, что вся эта информация доступна в самом первом пакете сеанса на сервере. Таким образом, сервер может определить, какой клиент подключается, даже до того, как ответить какими-либо данными. Более того, эти данные передаются в незашифрованном виде, поэтому любой сторонний прослушиватель в сети также может сделать это.

1.4 Как вычисляются хеши для TLS fingerprinting

Хешей для TLS fingerprinting придумано уже несколько.

Принципы получения данных для TLS fingerprinting и вычисления различных хешей имеют общие черты:

1) Берётся некоторая часть данных из TLS рукопожатия — выбираются данные по следующим принципам:

  • для различных групп приложений данные чем-то различаются
  • стабильные (одинаковые) для разных подключений, то есть данные не зависят от конкретной сессии
  • используются незашифрованные данные

2) Эти данные представляются в виде чисел, которые объединяются в строки

3) Эти строки (полностью или частично) хэшируются, например, в MD5 хеш

Рассмотрим как рассчитывается отпечаток JA3.

JA3 – популярный метод, используемый для формализации понятия отпечатка TLS. Он берёт пакет Client Hello и создаёт хэш, идентифицирующий клиента. В настоящее время JA3 можно считать устаревшим, поскольку некоторые приложения (например, Google Chrome) активно противостоят снятию отпечатков и для каждое подключение Google Chrome даст различные значения JA3. Тем не менее, для понимания как вычисляются TLS отпечатки, JA3 подойдёт.

JA3 формируется путём объединения нескольких полей Client Hello и последующего их хэширования. Поля, которые добавляются в хеш JA3:

SSLVersion,Cipher,SSLExtension,EllipticCurve,EllipticCurvePointFormat

Если быть более точным, то это исходная формула. С того времени Elliptic Curve уже был переименован в Supported Groups Registry (источники: 1, 2). То есть теперь правильная формула следующая:

SSLVersion,Cipher,SSLExtension,SupportedGroupsRegistry,EllipticCurvePointFormat

В JA3 используются десятичные значения байтов следующих полей в пакете Client Hello: Версия, Принятые шифры, Список расширений, Регистр поддерживаемых групп и Форматы эллиптических кривых. Если значений в одной группе несколько, то они разделяются дефисом (чёрточкой). Группы разделяются между собой запятыми. В JA3 значения перечисляются в том же порядке, как они идут в рукопожатии — с одной стороны, это дополнительный идентифицирующий признак; но с другой стороны — это даёт возможность клиентам перетасовывать порядок некоторых значений без изменения функциональности. Как можно понять, если строка в дальнейшем хешируется, то изменения порядка любых цифр (даже самое незначительное) приводит к тому, что хеш получается совершенно иным. Этим пользуется, например, веб-браузер Google Chrome, для которого значение JA3 различается для каждого запроса (забегая вперёд отметим, что это не спасает его от TLS fingerprinting).

На этом скриншоте отмечены части TLS Client Hello, используемые для JA3:


Например, для веб-браузера Firefox строкой, отражающей указанные значения является:

771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-34-51-43-13-45-28-27-65037,4588-29-23-24-25-256-257,0

Затем это хэшируется с помощью MD5 для получения JA3 подпись:

echo -n '771,4865-4867-4866-49195-49199-52393-52392-49196-49200-49162-49161-49171-49172-156-157-47-53,0-23-65281-10-11-35-16-5-34-51-43-13-45-28-27-65037,4588-29-23-24-25-256-257,0' | md5sum

Результат:

2d692a4485ca2f5f2b10ecb2d2909ad3

JA3 является фактическим стандартом в этом отношении и был интегрирован, например, в Wireshark.

Важно отметить, что JA3 не учитывает все различные параметры в Client Hello. Это означает, что возможно наличие двух разных Client Hello с одинаковой подписью JA3.

К тому же, как уже было упомянуто, Google Chrome научился сопротивляться JA3, поэтому были придуманы дальнейшие вариации: JA3N и JA4. О них мы поговорим в следующей части, посвящённой снятию TLS отпечатков с клиентов.

1.5 Различают TLS fingerprinting клиентов и серверов

TLS отпечатки можно разделить на две группы:

  • TLS отпечатки клиентов
  • TLS отпечатки серверов

В ответ на TLS Client Hello от клиента, сервер отправляет TLS Server Hello. Это также незашифрованные данные, которые используют для вычисления серверных TLS отпечатков.

Клиентом считается приложение, инициирующее подключение.

Сервером считается устройство, прослушивающее порт и ответившее на запрос от клиента.

Одно и то же приложение может быть и клиентом и сервером — обычно это характерно для вредоносных программ, управляющих ботнетами.

1.6 Слабые места TLS fingerprinting

1. При изменении версии программного обеспечения, TLS отпечатки могут меняться. С другой стороны, это также является и преимуществом, позволяющим с помощью TLS fingerprinting определить точную мажорную версию программного обеспечения.

2. Разные программы могут иметь одинаковые TLS отпечатки, хотя обычно это не так.

3. При использовании TLS session resumption, для одного клиента становятся характерными 2 TLS отпечатка: 1) TLS отпечаток первоначального подключения; 2) TLS отпечаток переподключения

4. TLS отпечатки можно подделать.

5. Серверные TLS отпечатки стабильны для одинаковых клиентов, но могут различаться для разных клиентов. По этой причине серверные TLS отпечатки иногда называют «отпечатками TLS сессии». Эта особенность учтена и даже эксплуатируется утилитой JARM (и одноимённым хешем JARM), которые используется для более надёжной идентификации серверов по TLS отпечаткам.

В следующих частях мы более подробно рассмотрим хеши TLS отпечатков и утилиты для их получения, а также способы скрыть или подделать TLS отпечатки.

1.7 Возможно, Encrypted Client Hello / ECH сможет (частично) предотвращать TLS fingerprinting

О сути Encrypted Client Hello можно догадаться из названия — зашифрованное клиентское сообщение Hello.

Подробнее об этой технологии вы можете почитать по следующим ссылкам:

Озабоченность в этих статьях вызывает не TLS fingerprinting, а то, что в TLS рукопожатиях информация о домене также передаётся в открытом виде. То есть DNS-over-HTTPS может присутствовать, но данные о посещённых доменах всё равно утекают.

Смотрите также: Как включить DNS через HTTPS и для чего это нужно

Возможно, повсеместное внедрение Encrypted Client Hello будет препятствовать снятию TLS отпечатков сторонним наблюдателем. Но, в любом случае, веб-сервер расшифровывает трафик и может делать TLS fingerprinting не смотря ни на что.

В настоящее время, насколько я понимаю ситуацию, поддержка Encrypted Client Hello / ECH Protocol отсутствует в большинстве популярных веб-серверов (а необходима одновременно поддержка и клиентом и сервером данной технологии). Короче говоря, пока, видимо, это реализовано только в серверах Cloudflare.

В современных веб-браузерах Firefox и Google Chrome (в других, возможно, тоже — я просто не проверял) ECH реализован и уже включён по умолчанию.

Следующая часть: TLS fingerprinting клиентов: типы хешей, утилиты для показа TLS отпечатков клиентов


Рекомендуется Вам:

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *