Для начала рассмотрим теорию и после перейдём к варианту обхода с использованием библиотеки curl_cffi на Python. Данная библиотека позволяет работать с HTTP2 и технологиями связанными с TLS
Сейчас поподробнее остановимся на этой части т.к я считаю здесь требуется теоретическое пояснение насчёт технологий связанных с TLS
Используется во многих проектах и в какой то степени действительно позволяет защититься от ботов, вот информация хранящаяся в цифровом отпечатке:
Юзер-Агент, Часовой пояс, Разрешение экрана и глубину цвета, Supercookies, Настройки куки, Системные шрифты, Плагины к браузеру и их версии, Журнал посещений
существует специальные сайты позволяющие посмотреть информацию которую знает о вас браузер (и фингерпринт в том числе): https://abrahamjuliot.github.io/creepjs/
TLS — это комплексный протокол безопасности, который объединяет различные процессы шифрования, проверки целостности и аутентификации, обеспечивая защиту и безопасность в интернете.
Один из таких процессов это TLS Handshake (aka TLS рукопожатие), оно необходимо для установки безопасного соединения, состоит он из этих частей:
1. Client Hello: Клиент отправляет серверу сообщение, содержащее:
* Версию TLS (1.3, 1.2 и т.д)
* Список поддерживаемых "шифронаборов" (Cipher Suites, [tls.DEFAULT_CIPHERS])
* Список методов сжатия
* Расширения TLS
2. Server Hello: Сервер отвечает аналогичным сообщением, выбирая из предложенных клиентом опций
3. Обмен ключами: Происходит обмен сертификатами и ключами
4. Завершение: Стороны подтверждают параметры соединения и начинают шифрованную коммуникацию
Именно эти параметры, передаваемые на моменте Client Hello и Server Hello используются для создания фингерпринтов.
Алгоритм 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
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)
Все эти технологии используются для защиты сервисов от ботоводства, и если правильно с ними обращаться то можно найти много способов обхода тех или иных технологий защиты
Я думаю сейчас вы немного удивитесь, но вся эта практика не обозначает что мы будем писать 500 строк, можно обойтись готовыми решениями или же попробовать что-то накостылить, естественно я покажу сразу 2 примера
1 Способ через биндинг curl-impersonate: curl-cffi
Этот небольшой кусок кода позволяет легко обойти челлендж-капчу от Яндекса.
Для запуска необходимо установить библиотеку curl_cffi (pip install curl_cffi, uv install curl_cffi)
работает это всё на биндингах (ffi, погуглите, кому неизвестна эта прекрасная технология) форка curl'a который называется curl-impersonate, данный софт имеет в себе поддержку ECH [Encrypted Client Hello], сжатия ZSTD и подделку отпечатков Akamai.
Ссылочка на это чудо: https://github.com/lexiforest/curl-impersonate
2 Способ через прокси-сервер
если вы не хотите делать биндинги самостоятельно (если вы вдруг собрались использовать способ обхода капчи в других языках) то можете попробовать различные прокси-сервера для генерации 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 рукопожатие), оно необходимо для установки безопасного соединения, состоит он из этих частей:
1. Client Hello: Клиент отправляет серверу сообщение, содержащее:
* Версию TLS (1.3, 1.2 и т.д)
* Список поддерживаемых "шифронаборов" (Cipher Suites, [tls.DEFAULT_CIPHERS])
* Список методов сжатия
* Расширения TLS
2. Server Hello: Сервер отвечает аналогичным сообщением, выбирая из предложенных клиентом опций
3. Обмен ключами: Происходит обмен сертификатами и ключами
4. Завершение: Стороны подтверждают параметры соединения и начинают шифрованную коммуникацию
Именно эти параметры, передаваемые на моменте 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. Практикуемся [обходим начальный челлендж Яндекс.Капчи]
Я думаю сейчас вы немного удивитесь, но вся эта практика не обозначает что мы будем писать 500 строк, можно обойтись готовыми решениями или же попробовать что-то накостылить, естественно я покажу сразу 2 примера
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())
Этот небольшой кусок кода позволяет легко обойти челлендж-капчу от Яндекса.
Для запуска необходимо установить библиотеку curl_cffi (pip install curl_cffi, uv install curl_cffi)
работает это всё на биндингах (ffi, погуглите, кому неизвестна эта прекрасная технология) форка curl'a который называется curl-impersonate, данный софт имеет в себе поддержку ECH [Encrypted Client Hello], сжатия ZSTD и подделку отпечатков Akamai.
Ссылочка на это чудо: https://github.com/lexiforest/curl-impersonate
2 Способ через прокси-сервер
если вы не хотите делать биндинги самостоятельно (если вы вдруг собрались использовать способ обхода капчи в других языках) то можете попробовать различные прокси-сервера для генерации 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]
👍31
😁7
👏4
😢6
💯8
LIMB