Для начала рассмотрим теорию и после перейдём к варианту обхода с использованием библиотеки curl_cffi на Python. Данная библиотека позволяет работать с HTTP2 и технологиями связанными с TLS
Сейчас поподробнее остановимся на этой части т.к я считаю здесь требуется теоретическое пояснение насчёт технологий связанных с TLS
Можно сказать что это уникальный идентификатор вашего устройства позволяющий отличить вас от условного бота.
Используется во многих проектах и в какой то степени действительно позволяет защититься от ботов, вот информация хранящаяся в цифровом отпечатке:
Юзер-Агент, Часовой пояс, Разрешение экрана и глубину цвета, Supercookies, Настройки куки, Системные шрифты, Плагины к браузеру и их версии, Журнал посещений
существует специальные сайты позволяющие посмотреть информацию которую знает о вас браузер (и фингерпринт в том числе): https://abrahamjuliot.github.io/creepjs/
TLS — это комплексный протокол безопасности, который объединяет различные процессы шифрования, проверки целостности и аутентификации, обеспечивая защиту и безопасность в интернете.
Один из таких процессов это TLS Handshake (aka TLS рукопожатие), оно необходимо для установки безопасного соединения, состоит он из этих частей:
наглядно про этот процесс
Именно эти параметры, передаваемые на моменте Client Hello и Server Hello используются для создания фингерпринтов.
разбираемся в одной из технологий формирования фингерпринта
JA3 это специальная технология используемая для создания хеш-отпечатка TLS соединения клиента, разработана в 2017 году компанией "Salesforce".
Алгоритм JA3 создаёт хеш MD5 на основе следующих параметров из сообщения Client Hello:
* Версия TLS
* Поддерживаемые шифронаборы (cipher suites)
* Расширения TLS
* Эллиптические кривые
* Форматы точек эллиптических кривых
Вот как выглядит строка и её порядок: TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats
Пример: 771,49196-49162-49195-52393-49161-49200-49172-49199-52392-49171-159-57-56-107-158-52394-51-50-103-22-19-157-53-61-156-47-60-10,0-23-65281-10-11-13-28,29-23-24-25,0
Результат: 32 символьная строка, например: e7d705a3286e19ea42f587b344ee6865
улучшение JA3 и следующее поколение идентификации
JA3S [JA3 Server] - это дополнение к JA3, которое создаёт хеш-отпечаток на основе ответа сервера (Server Hello) в процессе TLS Handshake.
JA4[+, семейство] - это новое поколение JA3/JA3S, которое представили в 2023 году. JA4 представляет из себя более комплексный подход к идентификации соединений.
Основные улучшения JA4 включают в себя:
* Учет ALPN (Application-Layer Protocol Negotiation)
* Анализ QUIC-параметров для HTTP/3 соединений
JA4 имеет несколько форматов / вариантов в семействе:
* JA4: Отпечаток клиента (улучшенная версия JA3)
* JA4S: Отпечаток сервера (улучшенная версия JA3S)
* JA4H: Опечаток по HTTP-Заголовкам
(полный список: https://github.com/FoxIO-LLC/ja4?tab=readme-ov-file#current-methods-and-implementation-details)
Все выше перечисленные технологии используются для вычисления реальных пользователей (ну и для шпионажа конечно же) и при правильной эксплуатации недостатков можно спокойно обойти плохо написанную защиту
Теории написано конечно много, но кода совсем мало, надеюсь это не скажется на качестве статьи
Этот небольшой кусок кода позволяет легко обойти челлендж-капчу от Яндекса (и CF'а тоже).
Для запуска необходимо установить библиотеку curl_cffi (pip install curl_cffi, uv install curl_cffi)
работает это всё на биндингах (ffi, погуглите, кому неизвестна эта прекрасная технология) форка curl'a который называется curl-impersonate, данный софт имеет в себе поддержку ECH [Encrypted Client Hello] и подделку отпечатков Akamai.
Ссылочка на это чудо: https://github.com/lexiforest/curl-impersonate
если вы не хотите делать биндинги самостоятельно (если вы вдруг собрались использовать способ обхода капчи в других языках) то можете попробовать различные прокси-сервера для генерации JA3 и тлс фингерпринта, например эти проекты:
https://github.com/LyleMi/ja3proxy [Go]
https://github.com/Danny-Dasilva/CycleTLS [JS/Go]
запускаем сервер и отправляем запросы через прокси находящиеся на локалке на определённом порту
Сильно вас благодарю, если вы дочитали до этого места.
Это моя первая статья на данном форуме, надеюсь на хороший фидбек, если что-то не устроило или показалось не полным - дополните в комментариях к треду!
Источники и интересный материал для прочтения:
https://habr.com/ru/articles/596411/ [Как мы TLS Fingerprint обходили…]
https://habr.com/ru/companies/acribia/articles/560168/ [Использование TLS fingerprinting для выявления угроз]
https://browserleaks.com/ [Какую информацию хранит твой фингерпринт]
https://habr.com/ru/companies/selectel/articles/521550/ [Отпечаток браузера: что это, как работает, нарушает ли закон и как защититься. Часть 1]
https://lwthiker.com/networks/2022/06/17/tls-fingerprinting.html [TLS fingerprinting: How it works, where it is used and how to control your signature]
https://trickster.dev/post/understanding-tls-fingerprinting/ [Understanding TLS fingerprinting]
Сейчас поподробнее остановимся на этой части т.к я считаю здесь требуется теоретическое пояснение насчёт технологий связанных с TLS
# 1. TLS Fingerprint [https://fingerprint.com]
Можно сказать что это уникальный идентификатор вашего устройства позволяющий отличить вас от условного бота.
Используется во многих проектах и в какой то степени действительно позволяет защититься от ботов, вот информация хранящаяся в цифровом отпечатке:
Юзер-Агент, Часовой пояс, Разрешение экрана и глубину цвета, Supercookies, Настройки куки, Системные шрифты, Плагины к браузеру и их версии, Журнал посещений
существует специальные сайты позволяющие посмотреть информацию которую знает о вас браузер (и фингерпринт в том числе): https://abrahamjuliot.github.io/creepjs/
# 2. TLS Handshake [ClientHello]
Не считаю эту часть обязательной но для особо любопытных и тех кто не ознакомлен — наверно всё же следует прочитать.TLS — это комплексный протокол безопасности, который объединяет различные процессы шифрования, проверки целостности и аутентификации, обеспечивая защиту и безопасность в интернете.
Один из таких процессов это TLS Handshake (aka TLS рукопожатие), оно необходимо для установки безопасного соединения, состоит он из этих частей:
наглядно про этот процесс
- Client Hello: Клиент отправляет серверу сообщение, содержащее:
Версию TLS (1.3, 1.2 и т.д)
Список поддерживаемых «шифронаборов» (Cipher Suites, [tls.DEFAULT_CIPHERS])
Список методов сжатия
Расширения TLS - Server Hello: Сервер отвечает аналогичным сообщением, выбирая из предложенных клиентом опций
- Обмен ключами: Происходит обмен сертификатами и ключами
- Завершение: Стороны подтверждают параметры соединения и начинают шифрованную коммуникацию
Именно эти параметры, передаваемые на моменте Client Hello и Server Hello используются для создания фингерпринтов.
# 3. JA3 [метод создания хеш-отпечатка TLS соединения клиента]
разбираемся в одной из технологий формирования фингерпринтаJA3 это специальная технология используемая для создания хеш-отпечатка TLS соединения клиента, разработана в 2017 году компанией "Salesforce".
Алгоритм JA3 создаёт хеш MD5 на основе следующих параметров из сообщения Client Hello:
* Версия TLS
* Поддерживаемые шифронаборы (cipher suites)
* Расширения TLS
* Эллиптические кривые
* Форматы точек эллиптических кривых
Вот как выглядит строка и её порядок: TLSVersion,Ciphers,Extensions,EllipticCurves,EllipticCurvePointFormats
Пример: 771,49196-49162-49195-52393-49161-49200-49172-49199-52392-49171-159-57-56-107-158-52394-51-50-103-22-19-157-53-61-156-47-60-10,0-23-65281-10-11-13-28,29-23-24-25,0
Результат: 32 символьная строка, например: e7d705a3286e19ea42f587b344ee6865
# 4. JA3S, JA4
улучшение JA3 и следующее поколение идентификацииJA3S [JA3 Server] - это дополнение к JA3, которое создаёт хеш-отпечаток на основе ответа сервера (Server Hello) в процессе TLS Handshake.
JA4[+, семейство] - это новое поколение JA3/JA3S, которое представили в 2023 году. JA4 представляет из себя более комплексный подход к идентификации соединений.
Основные улучшения JA4 включают в себя:
* Учет ALPN (Application-Layer Protocol Negotiation)
* Анализ QUIC-параметров для HTTP/3 соединений
JA4 имеет несколько форматов / вариантов в семействе:
* JA4: Отпечаток клиента (улучшенная версия JA3)
* JA4S: Отпечаток сервера (улучшенная версия JA3S)
* JA4H: Опечаток по HTTP-Заголовкам
(полный список: https://github.com/FoxIO-LLC/ja4?tab=readme-ov-file#current-methods-and-implementation-details)
# 5. Вывод
Все выше перечисленные технологии используются для вычисления реальных пользователей (ну и для шпионажа конечно же) и при правильной эксплуатации недостатков можно спокойно обойти плохо написанную защиту
# 6. Практикуемся [обходим начальный челлендж Яндекс.Капчи]
Теории написано конечно много, но кода совсем мало, надеюсь это не скажется на качестве статьи1. Способ через биндинг curl-impersonate: curl-cffi
Python:
import asyncio
import curl_cffi
async def main():
url = 'https://market.yandex.ru/yourProduct'
async with curl_cffi.AsyncSession() as session:
response = await session.get(url)
print(response.text)
if __name__ == "__main__":
asyncio.run(main())
Этот небольшой кусок кода позволяет легко обойти челлендж-капчу от Яндекса (и CF'а тоже).
Для запуска необходимо установить библиотеку curl_cffi (pip install curl_cffi, uv install curl_cffi)
работает это всё на биндингах (ffi, погуглите, кому неизвестна эта прекрасная технология) форка curl'a который называется curl-impersonate, данный софт имеет в себе поддержку ECH [Encrypted Client Hello] и подделку отпечатков Akamai.
Ссылочка на это чудо: https://github.com/lexiforest/curl-impersonate
2. Способ через костыли (прокси-сервер)
если вы не хотите делать биндинги самостоятельно (если вы вдруг собрались использовать способ обхода капчи в других языках) то можете попробовать различные прокси-сервера для генерации JA3 и тлс фингерпринта, например эти проекты:
https://github.com/LyleMi/ja3proxy [Go]
https://github.com/Danny-Dasilva/CycleTLS [JS/Go]
запускаем сервер и отправляем запросы через прокси находящиеся на локалке на определённом порту
# 7. Конец [доп. источники]
Сильно вас благодарю, если вы дочитали до этого места.Это моя первая статья на данном форуме, надеюсь на хороший фидбек, если что-то не устроило или показалось не полным - дополните в комментариях к треду!
Источники и интересный материал для прочтения:
https://habr.com/ru/articles/596411/ [Как мы TLS Fingerprint обходили…]
https://habr.com/ru/companies/acribia/articles/560168/ [Использование TLS fingerprinting для выявления угроз]
https://browserleaks.com/ [Какую информацию хранит твой фингерпринт]
https://habr.com/ru/companies/selectel/articles/521550/ [Отпечаток браузера: что это, как работает, нарушает ли закон и как защититься. Часть 1]
https://lwthiker.com/networks/2022/06/17/tls-fingerprinting.html [TLS fingerprinting: How it works, where it is used and how to control your signature]
https://trickster.dev/post/understanding-tls-fingerprinting/ [Understanding TLS fingerprinting]