Qyran (каз. Қыран — беркут) — моя self-hosted платформа для bug bounty и аудита безопасности. Она собирает десятки инструментов разведки и сканирования в один процесс, хранит всё в общей базе, показывает результаты в удобной панели и подключает AI-агентов там, где нужен анализ. В этой статье — зачем она появилась, через какие попытки я к ней пришёл и как она устроена изнутри.

Код проекта закрыт. Все скриншоты сделаны на реальных данных и обезличены: имена целей, домены, IP-адреса и превью страниц размыты.

Проблема: разведка руками не масштабируется

Классическая разведка и аудит — это:

  • десятки инструментов — subfinder, httpx, nmap, ffuf, nuclei, OpenVAS, OWASP ZAP и многие другие, каждый под свою задачу;
  • разные форматы вывода — одни находят то, что не находят другие, часть результатов дублируется;
  • ручная агрегация — объединять, чистить и сравнивать результаты приходится часами;
  • риск забыть — из-за количества инструментов, аргументов и форматов легко пропустить проверку или потерять важную находку.

Для этого есть готовые платформы, но серьёзные решения вроде Faraday относятся к enterprise-сегменту и стоят дорого. Для одного исследователя или небольшой команды это неподъёмно.

Мой путь к панели

Мой путь в offensive security — bug bounty, Hack The Box, лаборатории PortSwigger, челленджи на Root-Me и собственная база знаний в Obsidian. За годы в ней накопились тысячи заметок: техники атак, разборы уязвимостей, чеклисты разведки, вордлисты.

Первая попытка — ReconWTF

Первой попыткой автоматизации был ReconWTF — Bash-фреймворк, который запускал 30+ инструментов по цепочке. Он работал, но упёрся в потолок:

  • результаты — текстовые файлы, которые всё равно нужно разбирать руками;
  • нет базы данных, истории и сравнения между запусками;
  • Bash плохо масштабируется — поддерживать и развивать его стало тяжело.

Проект я заархивировал и начал думать о полноценной панели.

Поворотный момент — ИИ

Решение делать панель пришло, когда я взял из своей базы знаний методику поиска XSS, оформил её как навык (skill) для ИИ-агента и направил на лабораторию PortSwigger. Агент нашёл все уязвимости лаборатории за несколько минут — вручную на это могли уйти часы.

Главное открытие было даже не в скорости: база знаний, которую я собирал почти десять лет, наконец начала работать как инструмент. Из заметок получились не короткие подсказки, а полноценные playbook’и: деревья решений, правила безопасной работы, чеклисты, payload’ы, ветки обхода WAF, требования к доказательствам и отчёту, маршрутизация между классами уязвимостей.

Стало понятно: если таких навыков будет много, а данные разведки будут лежать в одной базе, получится фреймворк для автоматизированного поиска и анализа уязвимостей.

Философия: код — для рутины, ИИ — для анализа

Главный принцип Qyran:

Всё, что можно сделать кодом, программируется. ИИ занимается тем, где нужен анализ и творческий подход.

ИИ — важный компонент, но не единственный и не основной. Разведка, сканирование, дедупликация, сравнение с прошлыми запусками и оценка активов — это детерминированный код. ИИ получает уже подготовленные данные и решает задачи, где нужна гибкость: проверить гипотезу, разобрать бизнес-логику, связать находки в цепочку.

Это ещё и вопрос денег. Подписки на топовые модели стоят порядка $200 в месяц. Ядро AI-слоя построено на opencode, который позволяет подключать разных провайдеров моделей и выбирать вариант по цене и качеству. По моим тестам выгоднее всего оказалась одна из моделей DeepSeek — одно полное сканирование обходится примерно в доллар.

Полный цикл проверки

Полный цикл проверки: разведка, сбор данных, сканирование, ручной поиск, анализ, эксплуатация, отчёт

На вход загружаются известные цели — домены, поддомены, IP-адреса и диапазоны — и задаётся scope. Дальше остаётся ждать. Режимы запуска: разовый, раз в сутки или бесконечный мониторинг; отдельные этапы можно включать и отключать.

Проекты с оценкой приоритета: каждая цель получает opportunity score
Проекты: у каждой цели — оценка приоритета, число активов, находок и запусков. Имена целей размыты.

Архитектура

Архитектура Qyran

Всё поднимается одной командой через Docker Compose:

СервисРоль
apiFastAPI-бэкенд и собранный React-интерфейс
worker, recon-orchestrator, recon-stage-dispatcherоркестрация многостадийной разведки
schedulerпериодические сканы и задачи
mongodbосновное хранилище и очереди задач
mitmproxy → zapперехватывающий прокси и активное/пассивное сканирование
openvas, hack-toolsсканер инфраструктуры и контейнер с CLI-утилитами
js-analysisотдельный микросервис анализа JavaScript

Стек: Python 3.12, FastAPI, React + TypeScript + Vite + Tailwind, MongoDB, Docker Compose. Бэкенд — около 67 тысяч строк Python, весь проект — порядка 150 тысяч строк.

Интересное решение — без Redis и отдельного брокера. Очереди сделаны на коллекциях MongoDB с атомарным захватом задач: воркер одной операцией помечает задачу как свою, поэтому две копии воркера не возьмут одно и то же. Меньше сервисов — проще деплой.

Сердце панели: сигнальный конвейер разведки

Самая интересная часть под капотом — то, как устроена разведка. Это не линейный скрипт «шаг 1 → шаг 2 → шаг 3», а конвейер на сигналах.

Каждая стадия описана контрактом:

  • какие сигналы она принимает на вход;
  • какие сигналы производит на выходе;
  • от каких стадий зависит;
  • её приоритет.
hostname ──► dns_resolution ──► dns_resolved, ip
dns_resolved ──► http_liveness ──► live_origin
live_origin ──► full_http_metadata ──► technology, certificate
live_origin ──► crawl ──► endpoint, js_source
live_origin ──► proxy_capture ──► proxy_captured
live_origin ──► screenshot ──► screenshot_captured
ip ──► ports_services ──► port, service
hostname ──► historical_urls ──► endpoint, archive_js
endpoint, api_route, parameter ──► wordlist_refresh ──► wordlist_updated

Каждая новая находка — сигнал. Новый поддомен порождает задачу на DNS-резолв, резолв порождает проверку живости, живой хост — сбор метаданных, краулинг, скриншот и захват через прокси. Конвейер сам планирует, что делать дальше, исходя из того, что уже найдено. Внутри проекта такие циклы называются Ouroboros — змея, кусающая свой хвост: результаты одного цикла становятся входом следующего.

Почему это важно:

  • никаких лишних проверок — стадия запускается только когда есть данные для неё;
  • идемпотентность — одинаковые сигналы склеиваются, повторный запуск не плодит дубликаты;
  • легко расширять — новая стадия описывается контрактом и автоматически встраивается в граф;
  • бесконечный режим — конвейер может работать постоянно, реагируя на изменения у цели.

Разделы панели

Overview — сводка по цели

Обзор цели: активы, эндпоинты, TLS, технологии, HTTP-статусы, уязвимости и прогресс триажа
Overview: сводный дашборд цели. Имена хостов в блоке сертификатов размыты.

На одном экране — сколько активов и живых эндпоинтов, топ технологий, распределение HTTP-статусов, состояние TLS-сертификатов (в том числе давно истёкших), уязвимости по критичности и прогресс триажа.

Assets — обозреватель активов

Обозреватель активов с фильтрами и карточками хостов
Assets: по каждому хосту — теги назначения, DNS и почтовая безопасность, технологии, TLS, источники. Хосты, IP и превью размыты.

Для каждого хоста собрана полная картина: назначение (admin, API, login, mail, portal, VPN), DNSSEC и почтовые записи (SPF, DMARC, CAA), заголовки безопасности (HSTS, CSP, защита от фрейминга), технологии и версии, открытые порты, TLS, источники, из которых хост был найден, и выявленные риски — например, «наружу открыт сервис удалённого администрирования». Десятки фильтров позволяют быстро найти, скажем, все хосты без HSTS с открытой админкой.

Отдельные представления: Endpoints (всё, что нашёл краулер), Network (IP, порты, версии служб и связанные домены), Virtual Hosts, Cloud Footprint (CDN и облачные провайдеры), Technology Stack (где используется конкретная технология — удобно, когда выходит новая CVE) и TLS Intelligence.

Opportunity score — куда копать в первую очередь

На скриншотах у целей и активов есть цифра от 0 до 100. Это оценка привлекательности для исследователя, и она полностью объяснимая — складывается из трёх ограниченных корзин:

КорзинаМаксимумЧто учитывает
Чувствительность40насколько актив «вкусный»: админки, API, базы данных, dev/staging, объём поверхности
Экспозиция35насколько он атакуем прямо сейчас: подтверждённые находки, открытые порты управления и БД, секреты в JS, отсутствие CDN/WAF, риск захвата поддомена
Гигиена25дефекты конфигурации: TLS, заголовки, CORS

Высокий балл = слабый + доступный + чувствительный актив с подтверждёнными находками. Именно его стоит смотреть первым. Оценка — чистая функция от уже собранных данных, поэтому пересчитывается после каждого скана и всегда показывает, какие сигналы дали балл.

Vulnerabilities — управление находками

Канбан уязвимостей с колонками новых, в работе, отложенных, подтверждённых и исправленных
Vulnerabilities: находки всех сканеров в одном канбане с триажем.

Находки всех сканеров — nuclei, ZAP, OpenVAS, nikto, анализа JS — попадают в один канбан: новые, в процессе, отложенные, подтверждённые, исправленные. Карточки с markdown-описанием, подзадачами, комментариями, вложениями и исполнителями. Есть переключатель «Скрыть шум» — информационные находки не мешают работать с важными.

Discoveries и Potential Targets

Discoveries — лента изменений. В режиме мониторинга панель сравнивает каждый запуск с предыдущим: появился новый поддомен, открылся порт, поменялся ответ сервиса. Если на каком-то поддомене «упал» файрвол и сервис стал доступен извне, это нужно увидеть сразу, а не через месяц.

Potential Targets — активы, которые косвенно связаны с целью (общий IP, сертификат, регистрант), но не сканируются по умолчанию: они могут принадлежать другой компании. Исследователь сам решает, относятся ли они к scope. Сканировать то, на что нет разрешения, нельзя — и панель это поддерживает архитектурно, а не на честном слове.

Свой перехватывающий прокси

Внутри панели есть полноценный перехватывающий прокси в духе Burp и Caido:

  • Intercept — остановить запрос, ответ или WebSocket-сообщение, отредактировать и отпустить или отбросить;
  • HTTP и WS History — весь захваченный трафик с фильтрацией;
  • Replay — коллекции и сессии повторных отправок;
  • Scopes и Filters — сохранённые пресеты;
  • Sitemap — дерево обойдённого сайта.

Редактор правил Match & Replace с проверкой до и после
Match & Replace: правило переписывания трафика и мгновенная проверка «до/после».

Две вещи я сделал по-своему.

HTTPQL — язык запросов к истории трафика, как в Caido. Вместо десятка галочек пишешь условие вроде resp.code.eq:200 и получаешь ровно то, что нужно. Тот же язык используется как условие в правилах Match & Replace.

Match & Replace на одном движке. Движок правил написан на чистой стандартной библиотеке Python, без зависимостей от приложения. Поэтому один и тот же файл монтируется и в контейнер mitmproxy, и используется бэкендом для кнопки «Test». Что показал тест в панели — ровно то и произойдёт с живым трафиком. Правило — это секция (заголовки или тело запроса/ответа), тип сопоставления (полная замена, подстрока или regex с группами $1) и необязательное HTTPQL-условие.

Технически трафик идёт через mitmproxy, а ZAP подключён как upstream: так весь трафик, который исследователь генерирует руками, параллельно проходит пассивный анализ ZAP.

Шаблоны nuclei

Отдельный раздел — управление шаблонами nuclei. Помимо официальной библиотеки, у панели есть своя структура:

  • рабочие шаблоны — черновики, которые я пишу и отлаживаю;
  • боевые — проверенные, которые запускаются в сканах;
  • URL-шаблоны — для точечных проверок;
  • импорт шаблонов из GitHub-репозиториев и форк официальных шаблонов в рабочие для доработки.

Отдельный AI-агент умеет писать шаблоны nuclei под конкретную находку и сразу их запускать — так ручная находка превращается в автоматическую проверку для всего парка целей.

Анализ JavaScript, секреты и Dependency Confusion

Современные приложения прячут половину логики в JavaScript. Отдельный микросервис собирает JS-файлы и source maps, хранит их ревизии, показывает дифф между версиями и извлекает из них эндпоинты и параметры. Новые API-маршруты в свежем бандле — одна из самых недооценённых точек входа.

Secrets ищет утёкшие ключи и токены. Для известных провайдеров есть валидатор: он делает один безопасный запрос только на чтение к API самого провайдера, чтобы понять, жив ли ключ. Запросы уходят только на белый список хостов провайдеров, а пользовательский ввод никогда не подставляется в адрес хоста.

Dependency Confusion вытаскивает из собранного JS имена npm-пакетов и проверяет, существуют ли они в публичном реестре. Если внутренний пакет не занят публично, это потенциальная атака подмены зависимости. Проверка идёт только к реестру npm и базе OSV — сама цель при этом не затрагивается.

Для рендеринга современных JS-приложений, скриншотов и предпросмотра ответов в панель встроен headless-браузер с отдельными профилями.

Отчёты, история и настройки

  • Reports — предпросмотр и экспорт отчёта в PDF;
  • Scan History — логи и история всех запусков;
  • Tool Control — тонкая настройка инструментов прямо из интерфейса: rate limit, потоки, таймауты, заголовки, профили портов;
  • Test Accounts — хранилище тестовых учёток для авторизованных проверок.

AI-слой

Как база знаний стала инструментом: заметки, навыки, агенты, панель

База знаний → навыки

Хранилище Obsidian — 4800+ markdown-заметок — монтируется в контейнеры только на чтение. Из него собрано 120+ навыков, большинство — hack-* по классам уязвимостей и техникам: веб-инъекции, аутентификация и контроль доступа, бизнес-логика, API, Active Directory, облака, мобильные приложения, контейнеры и другие. Навык — это не промпт «найди XSS», а методичка, которую агент подгружает под задачу.

Агенты

32 специализированных агента. Главный — pentester, оркестратор: разведка → делегирование задач → сборка находок. Под ним специалисты по направлениям — разведка, API, веб, аутентификация, бизнес-логика и IDOR, инфраструктура, обход WAF, цепочки атак. И отдельная группа, которая делает результат надёжным:

  • triage — разбор и приоритизация находок;
  • verifier — скептическая перепроверка: агент, который пытается доказать, что находка ложная;
  • enricher — обогащение CVSS, CWE, CVE и рекомендациями по исправлению.

Ещё одна группа агентов занимается развитием самой платформы и базы знаний — от архитектуры и тестов до создания новых навыков.

Автономные смены и контроль

Самое опасное в автономном ИИ — что он сделает что-то не то или сожжёт бюджет. Поэтому у автономной работы жёсткие рамки:

  • смены (shifts) — ограниченные по времени и бюджету сессии тестирования; при достижении дедлайна или лимита стоимости смена останавливается и передаёт дела;
  • правила безопасности встраиваются в задание каждой смены;
  • watchdog следит за автономными агентами и наводит порядок, если что-то пошло не так;
  • одобрение действий — инструменты агента подключены через MCP, и потенциально рискованные действия требуют подтверждения. Политика автоодобрения настраивается глобально и для расписаний;
  • проверка scope на уровне инструментов — агент не может выйти за разрешённую область;
  • журнал покрытия — какие проверки выполнены полностью, частично, провалены или пропущены. Видно не только что найдено, но и что ещё не проверено.

Ответственное использование

Qyran — инструмент для авторизованного тестирования: bug bounty программ в рамках их правил и аудитов по договору. Поэтому в панель встроены ограничения на уровне архитектуры:

  • явные In Scope и Out of Scope для каждого проекта;
  • косвенно связанные активы попадают в Potential Targets и не сканируются, пока исследователь не примет решение;
  • проверки секретов и зависимостей не трогают цель;
  • рискованные действия агентов требуют подтверждения.

Что дальше

  • больше навыков и агентов-специалистов;
  • углубление бесконечной разведки: гипотезы от ИИ, которые конвейер сам проверяет;
  • развитие отчётов под форматы bug bounty платформ.

Для меня Qyran — это главный итог многих лет в ИБ: база знаний, которую я собирал со школы, превратилась в работающий инструмент, а рутина разведки — в конвейер, который работает, пока я сплю.

Код проекта закрыт, но я с удовольствием покажу панель вживую — напишите мне. О защитной «сестре» Qyran — панели триажа уязвимостей для SOC — я рассказываю в статье «SOC на Wazuh с нуля».