HackBrowser
Когда использовать HackBrowser
| Сценарий | Выбор |
|---|---|
| Ручное исследование с несколькими ролями | Расширение Chrome |
| Автоматический обход без участия пользователя | HackBrowser |
Нужен UI-контекст форм (флаги readonly, hidden, disabled) при захвате | HackBrowser |
| Существующая предварительно аутентифицированная браузерная сессия | Оба варианта — расширение Chrome проще |
Два пути не являются взаимоисключающими. Оба используют один и тот же эндпоинт /session/ingest и один и тот же конвейер proxy-agent. Их можно комбинировать в рамках одной сессии.
Как это работает
┌────────────────────────────────────────────────────────────────────┐│ Chromium (Playwright) ││ ├── Scanner — DOM → дерево доступности (RawElement[]) ││ ├── Navigator — вызов LLM → план страницы (задачи форм/кликов) ││ ├── Executor — План → действия Playwright ││ ├── Capture — HTTP-запросы + снимок ui_context ││ └── Live panel — Shadow-DOM телеметрия (видимый режим) │└────────────────────────┬───────────────────────────────────────────┘ │ POST /session/ingest (HTTP loopback) │ text + response + ui_context + access_context ▼┌────────────────────────────────────────────────────────────────────┐│ Cyberstrike API ││ ├── Normalize → deduplicate → Request.add ││ └── IngestQueue → SessionPrompt(agent="proxy-agent") │└────────────────────────┬───────────────────────────────────────────┘ ▼ proxy-agent → proxy-analyzer + 8 тестировщиков уязвимостейВ отличие от расширения Chrome, HackBrowser сам управляет браузером. LLM видит страницу как дерево доступности (метки кнопок, роли полей ввода, ARIA-атрибуты) и решает, какие формы заполнять и какие кнопки нажимать. Каждый захваченный запрос включает снимок ui_context — поля формы, их флаги (readonly, disabled, hidden) и параметры запроса, отсутствующие в UI — которые proxy-analyzer и proxy-tester-mass-assignment используют для выявления подозрительных структур запросов.
Три точки входа
Один и тот же движок краулера обслуживает три точки входа. Выбирайте подходящую для вашего контекста.
| Точка входа | Формат | Когда использовать |
|---|---|---|
cyberstrike hackbrowser <target> | CLI-подкоманда | Запуск новой TUI-сессии с привязкой к свежему обходу |
/hackbrowser | Slash-команда TUI | Запуск обхода внутри уже открытой сессии |
Инструмент hackbrowser | Вызываемый LLM инструмент | Агент решает начать обход на основе разговора |
Все три вызывают один и тот же лаунчер (launchHackbrowser), используют одну и ту же схему WorkerOptions и записывают прогресс в одну запись HackbrowserStatus боковой панели.
CLI-подкоманда
Запуск Cyberstrike, создание сессии и обход одной командой:
cyberstrike hackbrowser https://shop.example.comОпции:
| Флаг | Описание |
|---|---|
--scope <pattern> | Шаблон области действия по имени хоста (напр. *.example.com). Повторяемый. По умолчанию — *.{eTLD+1}, полученный из URL цели. |
--exclude <label> | UI-метка, которую планировщик должен пропустить (напр. "Delete Account"). Повторяемый. Семантическое совпадение. |
--steps <n> | Максимум страниц для обхода. По умолчанию 50. |
--credential <label> | Учётные данные для обхода. Повторяемый. Принудительно открывает видимый браузер для ручного входа. |
--headfull | Запуск браузера в видимом режиме. Принудительно при использовании --credential. |
TUI открывается немедленно, обход работает в фоне. Захваты поступают в сессию по мере прогресса обхода.
Slash-команда
Внутри существующей сессии:
/hackbrowserОткрывает диалог запуска с полями для URL цели, учётных данных, области действия, исключаемых меток, шагов и режима headless. ID сессии определяется неявно — захваты попадают в текущую сессию.
Для отмены текущего обхода:
/hackbrowser-stopЭта команда видна только пока обход находится в фазе starting или crawling. Браузер завершает задачи текущей страницы, корректно закрывается и записывает финальный статус. Отмена считается нормальным выходом из жизненного цикла, а не ошибкой.
Инструмент
Агент может запустить HackBrowser автономно, когда контекст разговора этого требует (напр. «протестируй это приложение», «у нас есть URL цели, но нет захваченных запросов»). Инструмент возвращает управление сразу после запуска фонового обхода — захваты поступают в сессию в течение следующих 30 секунд — 2 минут.
Параметры:
| Параметр | Описание |
|---|---|
target | URL цели (обязательный) |
credentials | Массив ID учётных данных для обхода. Принудительно headless: false. |
scope | Шаблоны имён хостов для ограничения захвата |
exclude | UI-метки для пропуска |
steps | Максимум страниц (по умолчанию 50) |
headless | Видимый браузер при false. Принудительно false при указании учётных данных. |
Фазы обхода
Типичный обход проходит три фазы:
1. Анонимная └── BFS-обход публичной поверхности, откладывание страниц авторизации (login/register/logout)
2. Аутентифицированный переход (один из вариантов) ├── --credential admin — ручной вход, браузер открывается видимо ├── (сохранённый файл сессии) — загрузка cookie, пропуск входа [только CLI] └── отложенная авторизация — register → login → logout
3. Повторное обнаружение после входа └── Повторная постановка в очередь всех посещённых страниц для пере-обхода на основе отпечатков. Страницы с неизменённым отпечатком пропускаются (без вызова LLM).Краулер соблюдает лимит повторных посещений URL (2 посещения на учётную запись) и лимит постановки в очередь по шаблону пути, чтобы багованное приложение или бесконечная пагинация не могли заблокировать обход.
Обход с несколькими учётными данными
Передайте два или более флагов --credential (или credentials: [...] инструменту) для последовательного обхода по ролям:
cyberstrike hackbrowser https://shop.example.com \ --credential admin \ --credential customerДля каждой учётной записи HackBrowser открывает видимое окно Chromium, ждёт ручного входа, затем выполняет полный обход с пометкой этой учётной записи. Захваты из каждого обхода помечаются раздельно, чтобы proxy-agent мог сравнить доступ каждой роли.
Caution
Только ручной вход. В текущей версии каждая учётная запись требует присутствия человека для шага входа. Без пользователя обход зависнет на ожидании входа. См. Планируется: автоматический вход ниже.
Планируется: автоматический вход
Движок обхода уже реализует три пути автоматического входа внутренне; они доступны в отдельном CLI, но ещё не подключены через подкоманду cyberstrike hackbrowser, slash-команду /hackbrowser или инструмент hackbrowser. Подключение запланировано.
| Планируемый флаг | Поведение | Сценарий |
|---|---|---|
--session <path> | Загрузка cookie из ранее сохранённого файла сессии | CI-запуски с предварительно аутентифицированными сессиями |
--save-session <path> | Сохранение cookie после успешного входа для повторного использования | Однократный интерактивный вход, затем автоматические повторные запуски |
--user <name> / --pass <secret> | Автоматическое заполнение обнаруженной формы входа | Полностью автоматический обход с простой формой аутентификации |
До реализации этих функций полностью автоматическое тестирование с несколькими ролями лучше выполнять через расширение Chrome с контейнерами Chrome, где вы входите один раз в каждом контейнере, а захват происходит прозрачно.
Различия страниц и доступность элементов
В режиме нескольких учётных данных, после того как каждая учётная запись посетит одну и ту же страницу, HackBrowser отправляет запись page-diff в /session/ingest:
- Какие учётные записи достигли страницы (
visited_by) - Какие интерактивные элементы видела каждая учётная запись (напр.
button:Delete User → ["admin"]) - Совпадает ли отпечаток DOM страницы между учётными записями
Proxy-agent использует этот сигнал для обнаружения различий доступа на основе ролей без необходимости повторного тестирования каждого эндпоинта для каждой учётной записи.
Пейлоад UI-контекста
Отличие от расширения Chrome — блок ui_context, прикреплённый к каждому захвату. Он содержит структуру формы в момент отправки запроса:
{ "text": "PUT /api/users/42 HTTP/1.1\r\n...", "sessionID": "session-abc123", "credential_id": "web_credential-admin", "scheme": "https", "response": { "status": 200, "headers": {...}, "body": "..." }, "ui_context": { "pageUrl": "https://shop.example.com/settings/profile", "pageTitle": "Edit Profile", "componentPath": "Settings > Profile", "formName": "Update Profile", "fields": [ { "name": "email", "type": "text", "isReadOnly": true, "isHidden": false, "value": "..." }, { "name": "username", "type": "text", "isReadOnly": false, "isHidden": false, "value": "..." }, { "name": "role", "type": "hidden", "isReadOnly": false, "isHidden": true, "value": "user" } ], "hiddenParams": ["account_id", "_csrf"] }, "trigger_element": "button:Save", "element_roles": ["admin"], "page_url": "/settings/profile", "page_visited_by": ["admin", "customer"]}Proxy-analyzer и proxy-tester-mass-assignment используют эти сигналы для выявления подозрительных структур:
- Поле
readonlyв UI, но отправляется в запросе -> проверка, обеспечивает ли сервер это ограничение - Поле с
type=hidden-> кандидат на mass assignment - Параметр запроса в
hiddenParams(UI-элемент вообще отсутствует) -> скрытый параметр наивысшего риска - Элемент
visible_to: ["admin"]только -> тестирование того же эндпоинта с учётной записью без прав администратора
Область сети
По умолчанию HackBrowser захватывает запросы, чьё имя хоста соответствует *.{eTLD+1} URL цели — определяется с помощью Public Suffix List. Для https://shop.example.com это означает захват всего под *.example.com.
Переопределите область через --scope (CLI) или scope: [...] (инструмент/slash). Несколько областей объединяются:
cyberstrike hackbrowser https://app.example.com \ --scope app.example.com \ --scope api.example.comОбласть — это сетевой фильтр. Она не останавливает навигацию браузера на внешние хосты (напр. сторонние SSO-провайдеры при входе) — эти навигации работают, но их трафик не пересылается в API.
Исключение чувствительных действий
Используйте --exclude, чтобы планировщик не запускал метки, которые не должны срабатывать при обходе:
cyberstrike hackbrowser https://app.example.com \ --exclude "Delete Account" \ --exclude "Cancel Subscription" \ --exclude "Wipe Data"Исключение — семантическое совпадение с планом задач LLM, а не regex. Указывайте метки так, как они отображаются в UI — планировщик получает инструкцию никогда не планировать задачи, совпадающие с этими метками.
Это не зависит от отключённых действий WSTG внутри диспетчера proxy-agent (который уже может фильтровать деструктивные пейлоады на уровне тестирования). Используйте --exclude, чтобы предотвратить нажатие кнопки краулером.
Панель телеметрии
Когда браузер работает в видимом режиме, HackBrowser внедряет Shadow-DOM-панель на каждую страницу. Панель показывает события обхода в реальном времени — переходы между страницами, решения плана, захваченные запросы, сигналы интеллекта (обнаружение пустого состояния, триггеры повторного посещения), переключения учётных данных.
Отключите панель с помощью --no-panel (отдельный CLI). При вызове через инструмент или slash-команду панель активна, когда headless: false.
Панель не влияет на тесты, выполняемые против страницы. Она использует Shadow DOM для полной изоляции стилей от целевого приложения.
Боковая панель статуса
Пока работает обход, боковая панель TUI показывает секцию Hackbrowser с:
- Фаза:
starting->crawling->completed/failed - URL цели
- Исследованные страницы
- Захваченные эндпоинты
- Текущая страница (во время
crawling) - Стоимость (после
completed)
Боковая панель обновляется в реальном времени через SSE, по мере поступления записей CSEvent от рабочего подпроцесса к родительскому.
Успешные обходы обновляют только боковую панель — они не записывают синтетическое сообщение в чат. Это сделано намеренно: отображение успеха в чате спровоцировало бы агента на повторный опрос инструмента. Ошибки, напротив, записывают синтетическое сообщение пользователя, чтобы агент увидел ошибку в следующем ходу.
Отмена
Три способа отменить текущий обход:
| Триггер | Поведение |
|---|---|
Slash-команда /hackbrowser-stop | Надёжный. Отправляет abort воркеру через IPC. |
Esc на активном ходу чата (только запуск через инструмент) | Пересылает ctx.abort воркеру. |
| Закрытие TUI (CLI-подкоманда) | onExit вызывает stopHackbrowser для освобождения Playwright. |
Во всех случаях агент завершает задачи текущей страницы перед выходом. Браузер закрывается корректно. Статус переходит в completed, а не failed — отмена считается нормальной.
Info
Задержка отмены. Агент проверяет сигнал отмены на границах итераций (между страницами BFS). Текущие вызовы LLM не отменяются на уровне SDK. В худшем случае — объём работы одной полной страницы после отправки /hackbrowser-stop.
Повторный вход
На одну сессию разрешён только один запуск HackBrowser. Попытка запустить второй обход в той же сессии при активном первом вызовет ошибку — запуски не ставятся в очередь. Для нового обхода:
- Дождитесь завершения текущего или отмените его, или
- Создайте новую сессию
Это ограничение действует на уровне лаунчера для инструмента, slash-команды и CLI-подкоманды.
Устранение неполадок
Браузер Chromium не установлен
Chromium browser is not installed at /Users/.../chrome.app/...Run: bunx playwright install chromiumВоркер HackBrowser использует встроенный Chromium от Playwright. Установите его один раз указанной командой. Кэш общий между bunx playwright install и npx playwright install.
playwright не установлен
playwright is not installed. Run: npm install --prefix ~/.local/share/cyberstrike playwright npx playwright install chromiumСам JavaScript-пакет Playwright не найден. Это может произойти при минимальной установке. Выполните две указанные команды.
hackbrowser worker не найден
hackbrowser worker not found at ~/.local/share/cyberstrike/bin/hackbrowser-worker.js.Re-install cyberstrike (npm install -g @cyberstrike-io/cyberstrike) to set it up.JavaScript-бандл воркера размещается скриптом postinstall. Переустановите Cyberstrike для его пересоздания.
multi-credential mode requires headless: false
Обход с несколькими учётными данными всегда использует ручной вход. Перезапустите с видимым браузером или используйте режим одной учётной записи.
hackbrowser already running for session
Текущая сессия имеет активный обход. Дождитесь его завершения или сначала выполните /hackbrowser-stop.
Связанная документация
- Расширение Chrome — Альтернатива с ручным просмотром через профили Chrome