LIMB
Вход Регистрация

тема

☝️Обходим невидимую Yandex SmartCaptch'y (Не такая уж она и Smart) И изучаем TLS!

cipus · · 3 ответов · 489 просмотров

Для начала рассмотрим теорию и после перейдём к варианту обхода с использованием библиотеки curl_cffi на Python. Данная библиотека позволяет работать с HTTP2 и технологиями связанными с TLS

Сейчас поподробнее остановимся на этой части т.к я считаю здесь требуется теоретическое пояснение насчёт технологий связанных с 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
Статья топ, может есть что-то из похожего чтобы получать токен для рекапчи invisible?

upd: не поднимая браузер и не эмулируя действия) мб что готовое есть уже
👍1
Полезно, но хотелось бы подробнее про работу curl-impersonate
сделано интересно. был удивлен сколько информации может парсить сайты, некоторое знал но более детально изучил как работает фингерпринт и другой сайт по сбору инфы браузера, меня удивило)
👍1

Гостевой просмотр. Чтобы отвечать и ставить реакции, войдите или зарегистрируйтесь.