РАЗБОР Статья

Обход антибот-защиты: детекция и evasion

Сергей Попов
Сергей Попов Red Team · 6,7 тыс. сообщений
Подписаться
1,1 тыс.
[ обложка статьи ]
Режим чтения
Компактное пентест-устройство на антистатическом коврике рядом с ноутбуком, экран которого показывает тёмную панель с цифрами JA3 и индикатором доверия 97 на фоне янтарной подсветки и размытых огней.


На редтим-проекте в прошлом квартале Cloudflare отрезал автоматизированную разведку за три запроса. Три. Скрипт на requests получал 403 ещё до парсинга HTML, а Selenium с дефолтным chromedriver блокировался на этапе рендера - антибот фиксировал navigator.webdriver=true и сбрасывал сессию. Через два дня я собрал стек из tls-client, патченного Chromium с отключёнными CDP-маркерами и пула резидентных прокси - прошёл все слои детекции, и он стабильно держался весь скоуп. Ниже - разбор каждого слоя и конкретные техники обхода антибот-защиты, которые работают на практике.

Механизмы детекции ботов: четыре уровня фильтрации​

Антибот-системы не блокируют по одному признаку. Они выстраивают конвейер из четырёх уровней - IP-репутация, TLS/HTTP fingerprinting, browser fingerprinting и поведенческий анализ - и агрегируют скоринг по всем слоям. Финальное решение (пропустить, показать CAPTCHA, выдать 403) определяется суммарным trust-скором. По данным Imperva Bad Bot Report, автоматизированный трафик уже приближается к половине всего веба. Антибот работает в режиме "каждый запрос подозрителен по умолчанию", и это не паранойя - это статистика. Подробнее - в нашем материале про пентест веб-приложений.

Для пентестера обход антибот-защиты - это не про парсинг. Это recon целевого приложения за WAF на этапе initial access, тестирование аутентификации под нагрузкой, имитация credential stuffing (A07:2021 по OWASP - Identification and Authentication Failures). В ряде кейсов - маскировка C2-трафика под легитимные браузерные сессии. В MITRE ATT&CK смежные техники: External Proxy (T1090.002, Command and Control) и Automate/Avoid CAPTCHA (T1696.001 / T1696.002). T1036.012 (Browser Fingerprint) формально описывает сценарий, когда вредоносный код проверяет окружение жертвы для anti-analysis, а не обход antibot-fingerprinting атакующим - маппинг условный, по общей концепции browser fingerprinting.

TLS fingerprinting JA3 и отпечаток HTTP/2​

При HTTPS-соединении TLS-рукопожатие (ClientHello) раскрывает набор шифров, расширения, эллиптические кривые и порядок их перечисления. Из этой комбинации считается JA3-хеш - уникальный идентификатор TLS-клиента.

JA4 - формат следующего поколения. Он разделяет отпечаток на компоненты: тип протокола, версия TLS, количество расширений, SNI-флаг и отсортированный список шифров. Именно сортировка - ключевое отличие. random_tls_extension_order=True работает против JA3-детекции, но JA4-хеш не трогает вообще. Чтобы обойти JA4, нужно воспроизводить точный набор расширений и шифров конкретного браузера, а не только тасовать их порядок.

Стандартные HTTP-библиотеки Python (requests, httpx), Node (axios) и Go (net/http) генерируют JA3-хеши, не совпадающие ни с одним браузером. По данным Zenrows, заявленный Chrome User-Agent в паре с JA3 от Python requests - мгновенное палево на любой из основных антибот-систем. Cloudflare, DataDome и Akamai сравнивают хеш с базой известных профилей: User-Agent говорит Chrome, а TLS-отпечаток говорит "скриптовый клиент" - сессия дропается до бэкенда.

Второй сигнал - HTTP/2 fingerprinting. Реальные браузеры отправляют фиксированный набор SETTINGS-фреймов в определённом порядке со специфической структурой WINDOW_UPDATE. HTTP-библиотеки используют другой порядок фреймов. Рассогласование HTTP/2 frame ordering вызывает блокировку на Akamai и Cloudflare даже при корректных заголовках и TLS-профиле. Т.е. можно идеально подделать JA3 - и всё равно спалиться на фреймах.

Fingerprinting браузера: canvas, WebGL и WebDriver detection​

После прохождения транспортного уровня антибот запускает клиентский JavaScript для сбора browser fingerprint. Разберём ключевые компоненты.

Canvas fingerprinting - рендеринг скрытого текста или графики через Canvas API. Результат зависит от GPU, драйверов, ОС и версии шрифтов, создавая устойчивый хеш. Headless-браузеры часто выдают "чистый" рендер без аппаратных шумов. Парадокс: слишком идеальная картинка - сама по себе маркер бота.

WebGL renderer возвращает строку GPU вроде ANGLE (NVIDIA GeForce RTX 3070 Direct3D11). Headless-окружения возвращают SwiftShader или Mesa - моментальная метка автоматизации. Если видишь SwiftShader в своём headless - антибот тоже его видит.

navigator.webdriver - флаг, который Selenium, Playwright и Puppeteer ставят в true по умолчанию. Проверяется одной строкой JS. По данным Olostep, headless-браузеры также оставляют CDP-артефакты: вызовы Runtime.enable, наличие window.cdc_adoQpoasnfa76pfcZLmcfl_* переменных (chromedriver), модификации прототипов объектов - всё то, что реальная браузерная сессия не генерирует.

Audio Context - AudioContext API создаёт отпечаток, специфичный для аудио-устройства. Виртуальные аудио-драйверы в headless-окружениях дают результат, отличающийся от реального железа.

Каждый компонент по отдельности не уникален, но комбинация формирует профиль с высокой энтропией. Антибот-системы проверяют не только наличие каждого параметра, но и согласованность: User-Agent заявляет Windows, а canvas выдаёт рендер macOS - финальный скор падает. Один врущий параметр тянет за собой все остальные.

Поведенческий анализ бота и ML-скоринг​

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

DataDome использует per-customer ML-модели, обучаемые на трафике конкретного сайта. По данным Zenrows, bypass, сработавший на одном DataDome-защищённом ресурсе, может не сработать на другом с тем же DataDome - модели тренируются на разных baseline. Это неприятный сюрприз, когда думаешь, что "уже разобрался с DataDome". PerimeterX (HUMAN Security) отправляет поведенческую телеметрию через POST-запросы к /api/v2/collector; реплей этих запросов без реального браузерного исполнения детектируется.

Honeypot-ловушки - скрытые ссылки и поля, невидимые пользователю, но обнаруживаемые DOM-парсером - входят в поведенческий слой и часто становятся причиной блокировки при грубом парсинге HTML. Бот кликает по невидимой ссылке - и выдаёт себя с головой.

Идентификация антибот-системы перед обходом​

1793596890990.webp

Bypass, работающий на Cloudflare, бесполезен против Kasada. Первый шаг - определить вендора. По данным Scrapfly, это делается по сигнатурам в HTTP-ответе, без попыток обхода.

Заголовки ответа: Cloudflare - CF-RAY и server: cloudflare; DataDome - X-DataDome-* на 403; Akamai - reference number akamai-grn.

Cookies: Cloudflare - cf_clearance, [I]_cf_bm; DataDome - datadome, _dd_s; PerimeterX - _px3, _pxvid; Akamai - _abck; Kasada - KP_UIDz; Imperva - incap_ses, reese84; AWS WAF - aws-waf-token; F5/Shape - TS[/I]-prefixed cookies.

JS-файлы: Cloudflare - challenge.js; DataDome - tags.js; PerimeterX - px.js; Kasada - ips.js.

Быстрая проверка одним запросом:
Python:
import requests

try:
    resp = requests.get(url, headers={
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) Chrome/131.0.0.0"
    }, timeout=10)
    hdrs = {k: v for k, v in resp.headers.items()
            if any(s in k.lower() for s in ["cf-", "datadome", "akamai"])}
    print("Status:", resp.status_code)  # 403/429 тоже диагностический сигнал
    print("Headers:", hdrs)
    print("Cookies:", list(resp.cookies.keys()))
except Exception as e:
    # Дроп на TLS-уровне - сам по себе указывает на антибот
    print("Blocked pre-HTTP:", type(e).__name__, e)
Код 429 с пустым телом без брендированных заголовков - характерная сигнатура Kasada. 403 без подписи вендора - вероятно F5/Shape или AWS WAF. Wappalyzer тоже определяет антибот, но ручной анализ заголовков даёт больше контроля и не требует запуска браузера.

Методы обхода детекции ботов: практический арсенал​

1793596970012.webp

📚 Часть контента скрыта. Этот материал доступен участникам сообщества с рангом One Level или выше
Получить доступ просто — достаточно зарегистрироваться и проявить активность на форуме

Главное правило browser fingerprint spoofing: согласованность всех параметров одновременно. TLS говорит Chrome 131 на Windows, User-Agent подтверждает, Client Hints совпадают - а canvas выдаёт рендер из другой ОС. Все предыдущие слои пройдены, но fingerprinting браузера провален. Один несогласованный параметр убивает весь стек.

Ротация прокси и OPSEC​

IP-репутация - первый фильтр, срабатывающий до проверок fingerprint.

Datacenter IP - диапазоны AWS, GCP, DigitalOcean публично известны. Антибот-системы блокируют их превентивно по ASN. По данным AbuseIPDB, ряд хостинг-провайдеров (включая "bulletproof" ASN) содержит высокую концентрацию IP с abuse confidence score выше 75 - порога, рекомендуемого для автоматической блокировки. Годятся только для целей без серьёзной защиты.

Residential IP - адреса домашних ISP. Смешиваются с легитимным трафиком и значительно сложнее для блокировки. Основной выбор для обхода Cloudflare антибот, DataDome и PerimeterX. Дорого, но работает.

Mobile IP - адреса мобильных операторов с CGNAT, где тысячи пользователей делят один IP. Самые сложные для блокировки, но и самые дорогие.

Ротация IP по каждому запросу - не всегда оптимально. Слишком частая смена адреса сама по себе подозрительна. Sticky-сессии (один IP на 30-60 секунд) с сохранением cookie jar между запросами дают более реалистичный профиль. Геолокация IP должна совпадать с Accept-Language и timezone: IP из Бразилии в паре с Accept-Language: ru-RU - очевидный красный флаг. В MITRE ATT&CK ротация прокси маппится на External Proxy (T1090.002) и Multi-hop Proxy (T1090.003).

Обход капчи и JS-челленджей​

CAPTCHA - не первая линия обороны, а реакция на низкий trust-скор. Если TLS, fingerprint и поведение корректны, многие антибот-системы пропускают запрос без челленджа. По MITRE ATT&CK - Avoid CAPTCHA (T1696.002, Stealth): лучший обход капчи - сделать так, чтобы она не появилась.

Cloudflare Turnstile - invisible-челлендж, генерирующий cf_clearance cookie. Headless-браузер с корректным fingerprint часто проходит его автоматически. Без танцев с бубном.

JS proof-of-work - Cloudflare и Kasada используют JavaScript, выполняющий вычисления в браузере и отправляющий результат на сервер. Без реального JS-движка пройти невозможно - чистые HTTP-клиенты здесь бессильны.

Визуальные CAPTCHA (reCAPTCHA, hCaptcha) обходятся через сервисы решения (2Captcha, CapMonster, Anti-Captcha): отправляете sitekey и URL через API, получаете токен, подставляете в следующий запрос. По MITRE ATT&CK - Automate CAPTCHA Completion (T1696.001, Stealth).

Kasada - отдельный зверь. По данным Scrapfly, это единственная система, где самостоятельный обход нежизнеспособен на постоянной основе. Kasada активно зондирует окружение исполнения (не пассивный fingerprinting), применяет анти-дебаг и анти-деобфускацию, а челленджи ротируются per-site. Характерная сигнатура - bare 429 с пустым телом без брендинга. Если увидели такой ответ и ничего в заголовках - скорее всего, это она.

Антибот-защита - гонка вооружений без финиша. Каждый раунд обновлений на стороне вендоров ломает часть рабочих bypass-техник. За десятки проектов, где стояла задача обхода WAF и антибот-систем для имитации реального атакующего, наблюдение одно: побеждает не конкретный инструмент, а согласованность всех слоёв одновременно. TLS-профиль, User-Agent, Client Hints, canvas, WebGL, геолокация IP, поведенческие паттерны - если хоть один слой противоречит остальным, trust-скор рушится. Большинство пентестеров фиксируются на одном уровне - ставят residential proxy или патчат webdriver - и не понимают, почему блокировки продолжаются. Проблема не в инструменте, а в рассогласованности сигналов.

И есть момент, который мало кто проговаривает: bypass-техники деградируют. То, что работало на Cloudflare три месяца назад, сегодня может не пройти. Поддержка актуальности стека - не разовая настройка, а непрерывный ресёрч с отслеживанием обновлений антибот-вендоров и актуализацией профилей. На HackerLab (ХакерЛаб) лежат web-задачи, где bypass-цепочку нужно собрать в полную последовательность от fingerprint до цели самостоятельно.
Полезно

Комментарии

0