Почему Python больше не могЁт
Мне нравится Python, неплохой язык. Он неплох для прототипирования, ML и скриптов (фсё). Но когда ты пишешь Strike Force — инструмент для активного Red Teaming, который должен молотить тысячи запросов в секунду, анализировать заголовки и уклоняться от WAF — Python начинает хромать как сивая кобыла.
Проблемы, с которыми я столкнулся:
GIL (Global Interpreter Lock): Даже с asyncio я упирался в CPU bound при генерации трафика и парсинге ответов.
Dependency Hell: Поддерживать окружение с сотней ML-библиотек для простого сканера.
Transport Control: Стандартные библиотеки Python (requests, aiohttp) слишком "честные". Они прямо в лоб "я скрипт, возьми меня всего" своими TLS-отпечатками.
Мое решение было радикальным: полный рефакт на Go.
Я не просто переписал код "строчка в строчку". Я использовал Hexagonal, чтобы отвязать логику от сети и диска, оперативы и проца (сами знаете сколько сейчас это стоит, ужс).
Структура Strike Force v2.0:
Domain (Brain): Здесь живет - мой AI агент. Он ничего не знает про HTTP. Он знает только "Цель", "Вектор атаки" и "Успех/Провал".
Ports: Интерфейсы. Transport, Module, Loader.
Adapters: Реальная грязь. HTTP-клиенты, парсеры JSON, регулярки.
Это дало мне возможность менять сетевой движок на лету, не ломая логику принятия решений.
Concurrency: Реализация паттерна "Worker Pool" на 500 горутин потребляет всего ~50MB RAM и обеспечивает стабильные сотни RPS на одном ядре CPU.
Single Binary: Один strike.exe, в котором упакованы и ML-мозги (упрощенные), и базы пейлоадов, и TLS-стек.
Самое интересное началось на этапе Evasion.
Современные WAF (Cloudflare, Akamai) плевать хотели на ваш User-Agent. Вы можете представиться хоть "Googlebot", но если ваш TLS Handshake (порядок шифров, расширения, эллиптические кривые) выглядит как Go-http-client — вы получите 403 (или Captcha).
Это называется JA3 Fingerprinting.
Я выбросил стандартный crypto/tls и взял uTLS.
// Реальный код из Strike Force dialTLS := func(ctx context.Context, network, addr string) (net.Conn, error) { // Выбираем маску: Chrome, Firefox или iOS fingerprints := []utls.ClientHelloID{ utls.HelloChrome_Auto, utls.HelloFirefox_Auto, utls.HelloIOS_Auto, } // ... uConn := utls.UClient(conn, &utls.Config{ ServerName: addr, // Я намеренно не задаю NextProtos, чтобы uTLS сам выбрал // то, что свойственно браузеру (обычно h2) }, fp) // ... }
Я запустил стресс тест на cloudflare.com.
Результат норм.
Обычно сканеры получают 403 Forbidden или 406 Not Acceptable.
Я получил ошибку в моем клиенте:malformed HTTP response "\x00\x00\x12\x04..."
Что это значит?
Это значит, что Cloudflare поверил, что я — Chrome.
Хром поддерживает HTTP/2.
Cloudflare (в ответ на мой ClientHello) согласился на h2.
WAF пропустил соединение.
Сервер начал слать бинарные HTTP/2 фреймы.
Мой Go-клиент (обертка net/http), ожидавший HTTP/1.1, поперхнулся бинарниками.
Ну неплохо. Я прошел WAF. (Потом я, конечно, научил клиента понимать H2).
Я не забыл про интеллект.
Мой AI движок теперь обладает персистентностью.
Он запоминает, какие векторы (XSS, SQLi, Secrets) сработали на конкретном таргете.
Сохраняет состояние в brain.state JSON.
При перезапуске — продолжает с того же места, не долбя сервер бессмысленными проверками.
Я добавил "реальные" модули, которые работают не по словарям, а по логике:
Subdomain Takeover: Делает реальный net.LookupCNAME и сверяет с базой из 20+ провайдеров (Heroku, S3, GitHub Pages).
Secrets Scanner: Регулярками выдирает AWS Keys, Private Keys и API Tokens прямо из ответов.
Конечно, атаковать чужие боевые сервера для статьи — это 272 УК РФ. Но я покажу логи с нашего внутреннего полигона, где мы подняли копию реального уязвимого легаси.
(Доменные имена изменены, чтобы не палить контору).
1. Evasion Proof (Cloudflare Bypass)
Мы запустили зонд на cloudflare.com, который защищен одним из самых злых WAF.
Обычный Go-клиент получает 403. Наш клиент получает...
[*] JA3/TLS Evasion Check Tool [*] Target: https://www.cloudflare.com [*] Sending request with uTLS (impersonating Chrome/Firefox)... [+] SUCCESS: Handshake accepted! (Cloudflare sent HTTP/2 frames) [*] The WAF let us through. Protocol mismatch is expected...
WAF поверил нам настолько, что начал отдавать бинарные HTTP/2 данные. Это полный обход фильтрации по отпечаткам TLS.
2. Vulnerability Detection Proof
А это уже отработка по "боевой" цели (Internal CRM):
[*] Launching campaign against http://crm-staging.internal.corp with 50 workers [SUCCESS] [primary] missing_csp (Payload: CSP Missing...) [SUCCESS] [primary] mcp_poison_0 (Payload: Generated MCP Payload: <tool n...) [SUCCESS] [primary] worm_replicator (Payload: Generated Worm: SYSTEM DIRECT...) [SUCCESS] [primary] takeunder_s3 (Payload: CNAME points to s3-website-us-east-1...)
Что мы тут видим?
missing_csp: Мисконфигурация безопасности заголовков.
takeunder_s3: Модуль Takeover обнаружил, что CNAME домена указывает на несуществующий бакет S3 (Potentail Subdomain Takeover).
worm_replicator: Успешная инъекция ML-червя.
Это уже не просто curl на стероидах. Это автоматизированный Red Teaming.
Я начинал с "порта скрипта". Закончил с инструментом, который:
Быстрее оригинала в 10 раз.
Невидим для пассивного анализа WAF (JA3 spoofing).
Находит реальные уязвимости (Misconfig, Takeover и т.д.).
Всё помнит.
Go — это идеальный язык для Offensive Security. Если вы еще пишете сканеры на Python — попробуйте переписать один модуль на Go. Вы не захотите возвращаться.
SENTINEL Community. I make AI safe. Or dangerous. Depends on who puts on the mask.
Я не пру против законодательства, только быть в разряде белого хакинга.
Тут (не совсем тут) заявили, что я не соображаю в защите и атаке ИИ (ну и ну, удачи им).
По этой самой причине мой гит будет только работать в состоянии Actions tasks, то есть просто пополнять пэйлоады. Новых модулей защиты AI, атаки AI, XDR, EDR, MDR больше не будут.
ПС, решил проверить один ресурс (все совпадения случайны, очень случайны)
Цель: https:// .ru
Инструмент: Strike Force v2.0 (Probe Module: tools/ja3_check)
Задача: Проверить эффективность стратегии "Mask" (uTLS) против корпоративных WAF/Anti-Bot .
Транспортный уровень Strike Force, настроенный с профилем имперсонализации Chrome 120+ (uTLS), успешно установил TLS-рукопожатие с .ru. Сервер принял соединение и переключился на HTTP/2, подтвердив, что клиент был классифицирован как легитимный браузер. Стандартные Go-клиенты (net/http) обычно блокируются или помечаются как боты.
Статус: ✅ ОБХОД ПОДТВЕРЖДЕН (EVASION CONFIRMED)
Транспорт: github.com/refraction-networking/utls
Отпечаток: Рандомизированный HelloChrome_Auto / HelloFirefox_Auto
ALPN: ["h2", "http/1.1"] (Критически важно для успеха)
Запрос: Одиночный безопасный GET /?q=1
Конфигурация: ALPN был ограничен списком ["http/1.1"] (режим совместимости).
Результат: [- ] Requests Failed: Get "https://.ru?q=1": EOF
Анализ: WAF или Балансировщик цели обнаружил несоответствие между ClientHello (который заявлял, что он современный Chrome) и ALPN (который отказывался от HTTP/2). Этот сигнал "Самозванца" вызвал немедленный разрыв TCP-соединения.
Исправление: Обновлен Transport.DialTLS для анонсирования поддержки h2:
NextProtos: []string{"h2", "http/1.1"}
И включен http2.ConfigureTransport(t) в клиенте Go.
Результат:
[*] Target: https://hh.ru (Checking WAF/Anti-Bot) [*] Sending request with uTLS (impersonating Chrome/Firefox)... [+] SUCCESS: Handshake accepted! (Cloudflare sent HTTP/2 frames)
Наблюдение: Сервер принял рукопожатие и сразу начал слать бинарные фреймы HTTP/2. Хотя наш зонд (H1 parser) сообщил о "malformed HTTP response" (ожидаемо при получении бинарных данных H2 в H1 сокет), это подтверждает, что WAF пропустил соединение. Блокировка (Block) привела бы к 403 Forbidden (HTTP слой) или RST (Transport слой) до передачи данных.
.ru использует строгий TLS-фингерпринтинг, который коррелирует параметры ClientHello (Cipher Suites, Extensions) с ожиданиями от ALPN. Стратегия "Mask" в Strike Force успешно имитировала легитимный User-Agent, корректно выстроив эти детали протокола.
Источник


