
Пассивная разведка и картограф поверхности атаки — ноль отправленных запросов
Быстрый старт · Режим охоты · Рабочая область · Режимы · Экспорт · vs Burp · Под капотом
PenScope — это расширение для Chrome. Установите его, откройте сайт, который вам разрешено тестировать, и оно беззвучно нанесёт всю поверхность атаки — каждую конечную точку, каждый секрет, каждый неправильно настроенный заголовок, каждый скрытый параметр. Когда вы дадите команду, оно отправит 36 различных пробных атак, используя ваши реальные сессионные cookie, и сообщит, какие из них сработали.
Или вы устанавливаете scope, нажимаете Hunt, и PenScope делает всё самостоятельно, пока вы занимаетесь чем-то другим — составляя полноценные отчёты об уязвимостях в формате HackerOne для каждого критического и высокого срабатывания, которое оно обнаружит. Вы просыпаетесь с очередью готовых к отправке черновиков.
Это ежедневный инструмент для охотников за багами, которые хотят пропустить рутину «настроить прокси, пощёлкать по трём окнам, alt-tab к списку полезных нагрузок» и просто смотреть на сайт. Или вообще перестать смотреть и позволить инструменту охотиться за них.
Читает всё, ничего не отправляет — пока вы не скажете. Установите scope, нажмите Hunt, закройте ноутбук. Проснитесь с черновиками критических уязвимостей.
Аудиторный рефакторинг в 8 этапов. Ключевые дополнения:
alg, iss, sub, aud, exp, iat, role, scope...). Критичность повышается, если exp в будущем и роль имеет admin-вид.Полный поэтапный разбор в CHANGES.md. Заметки по миграции в MIGRATION.md.
Закрепите расширение. Посетите любой сайт. Нажмите на иконку **P**. PenScope уже следит.
---
## Что вы можете сделать
PenScope захватывает 60+ полей данных на вкладку. Вот что это значит на практике:
**Увидеть полную поверхность атаки.** Каждая конечная точка, включая те, на которые есть ссылки в JavaScript, но которые никогда не вызывались. Пути API, скрытые в исходных картах, операции GraphQL, восстановленные из тел POST-запросов, скрытые маршруты администратора, выведенные из интроспекции фреймворка.
**Найти секреты, которые никто не собирался отправлять.** Ключи API, жёстко закодированные в пакетах `.js`. JWT в `localStorage`. Учётные данные AWS в дампах переменных окружения. Внутренние идентификаторы в телах ответов. То, что попадает в отчёт уровня P1.
**Запустить 36 шагов атаки в вашем браузере.** Обход аутентификации, BAC, IDOR, отражение CORS, JWT alg=none, SSTI, XXE, CRLF-инъекция, загрязнение прототипа, обнаружение параметров, понижение версии API. Три уровня агрессии — осторожный, средний, полный. Вставка пользовательских заголовков. Стелс-режим перемешивает порядок запросов, чтобы не сработал WAF.
**Собирать отдельные находки в реальные эксплойты.** JWT в памяти — это находка. Тот же JWT плюс конечная точка API, которая принимает неподписанные токены, плюс расшифрованная роль admin — это цепочка, и PenScope показывает её в верхней части отчёта с оценкой достоверности, командой для воспроизведения и следующими шагами.
**Редактировать и отправлять любой запрос заново.** В стиле правой кнопки мыши. Repeater открывается в новой вкладке, в полном окне. Измените параметр. Нажмите Отправить. Посмотрите ответ. Отправьте его в Diff для сравнения с базовым.
**Фаззинг с точками вставки.** Отметьте `§payload§` в любом месте запроса, выберите набор нагрузок (40 XSS-строк, 30 SQLi, 28 LFI, 18 SSTI, 22 SSRF, 24 команды для инъекций, ID 1–100, классические обходы аутентификации, распространённые имена пользователей), выберите режим атаки (Sniper / Cluster bomb / Pitchfork / Battering ram), следите за живой таблицей результатов. Строки с аномалиями помечаются звездочкой.
**Тестировать как пять разных пользователей одновременно.** Сохраняйте контексты аутентификации (Аноним, Пользователь A, Пользователь B, Администратор, Внутренний). Один клик переключает активный контекст — каждый запрос в Repeater, каждый запуск Intruder, каждый зонд использует эти учётные данные. Затем запустите **Матрицу авторизации**: PenScope проходит по каждой конечной точке × каждый контекст и раскрашивает сетку. Расхождения между строками — это ваши находки IDOR / BAC, выявленные автоматически.
**Сгенерировать CSP, который действительно подходит сайту.** Проходит по каждому запросу, сделанному страницей, классифицирует каждый по типу ресурса, строит строгую политику. Добавляет `default-src 'none'`, `frame-ancestors 'none'`, `upgrade-insecure-requests`. Обнаруживает встроенные скрипты и `eval()` и предупреждает, когда пришлось оставить `'unsafe-inline'`. Сравнивает с существующим CSP — зелёным выделено ужесточение, красным — ослабление.
**Общаться с Claude в обе стороны.** Нажмите `→ Claude`, чтобы скопировать весь скан в буфер обмена в виде структурированного брифа. Спросите Claude, что тестировать дальше. Claude отвечает огороженной JSON-очередью. Нажмите `⟳ Sync from Claude`, и PenScope разбирает очередь, запускает каждую атаку на живой цели и передаёт результаты обратно в анализатор цепочек.
**Отслеживать свою область видимости с течением времени.** Сделайте снимок сайта сегодня, снова сделайте снимок на следующем спринте, нажмите Сравнить. PenScope сообщает, какие находки новые, какие исправлены, какие не изменились. Экспортируйте различия в Markdown для командного Slack.
**Сопоставлять находки с требованиями соответствия.** Нажмите Аудит соответствия. Каждая находка сопоставляется с конкретными элементами управления в PCI-DSS v4, NESA UAE IAS, SAMA CSF, DESC ISR, ISO 27001, OWASP Top 10 2021 и CWE. Экспортируйте JSON для вашей SIEM. Экспортируйте PDF для аудитора.
---
## Режим охоты
Нажмите `🎯 Hunt` в заголовке всплывающего окна. Откроется новая вкладка. **Панель предварительной проверки** внизу показывает состояние вашего движка — захваченные конечные точки, секреты, обнаруженные технологии, сохранённые контексты аутентификации — чтобы вы знали, достаточно ли у вас поверхности для продуктивной охоты, прежде чем нажать Старт. Если конечных точек < 20, жёлтое предупреждение предлагает сначала просмотреть цель ИЛИ положиться на новый этап автоматического обхода DOM. Настройте целевую область видимости (пути в области видимости, пути вне области видимости, уровень агрессии, бюджет времени). Нажмите `▶ Start Hunt`.
PenScope автономно:
1. Выполняет пассивную разведку
2. **Автоматически включает режим Deep** (отладчик CDP подключается незаметно — без запроса пользователю)
3. **Автоматический обход DOM** — проходит по каждому `<a href>`, `<form action>`, ``, `[routerLink]`, `[ng-href]`, `[to]`, `[data-href]` на текущей странице. Фильтрует URL-адреса с тем же источником. Добавляет новые в очередь зондов. _Чистое извлечение URL — никаких кликов, навигации или побочных эффектов, изменяющих сеанс._
4. Запускает полный конвейер из 36 шагов зондирования + 8 пакетов атак с учётом стека
5. Проходит **Матрицу авторизации** по сохранённым контекстам аутентификации
6. Запускает коррелятор цепочек, фильтрует по вашим правилам области видимости
7. **Создаёт черновик полного отчёта в формате HackerOne для каждого критического и высокого уровня** — цепочек *и* отдельных находок высокой степени серьёзности (раскрытые секреты, JWT alg=none, подтверждённые SSTI/XXE/CRLF). Каждый черновик включает заголовок, степень серьёзности с оценкой CVSS, сводку, шаги для воспроизведения с двухэтапным curl (зонд без аутентификации + базовый уровень с аутентификацией для сравнения), заявление о влиянии, специфичное для данной находки, предлагаемое исправление из библиотеки фрагментов и ссылки.
8. Отправляет уведомление Chrome для каждого критического: _"Режим охоты обнаружил критический IDOR на /api/users — черновик отчёта готов"_
9. Сохраняет черновики в `chrome.storage.local` с ключом по хосту (переживают закрытие вкладки и перезапуск браузера)
Вкладка **Live** в реальном времени описывает каждый шаг фильтрации — количество цепочек до/после фильтра области видимости, распределение по степени серьёзности, что было отброшено и почему. Если охота завершилась с 0 отчётов, диагностика «Почему нет отчётов?» проводит вас через каждую точку фильтра с конкретными предложениями («снять фильтр Critical+High», «сохранить 2+ контекста аутентификации», «сначала больше просмотреть цель»). Больше не нужно гадать, почему охота ничего не дала.
**Вы просыпаетесь и видите очередь готовых черновиков отчётов для баунти.** Прочитайте каждый, нажмите Копировать или Экспортировать, вставьте в свою заявку HackerOne / Bugcrowd / Intigriti.
Это рабочий процесс, который Burp даже не пытается реализовать. Активный сканер Burp запускает атаки, но отчёт всё равно нужно писать. PenScope владеет всем путём от сканирования → эксплойта → отчёта → отправки.
> Установите область видимости. Нажмите Старт. Закройте ноутбук. Проснитесь с очередью черновиков Critical.
### Контроль качества — сохраняйте репутацию
Режим охоты активно отфильтровывает ложные срабатывания, которые могли бы подорвать вашу репутацию при отправке:
- **SPA-оболочки HTML** — загрузочные страницы Angular/React/Vue возвращают одинаковый HTML аутентифицированным и неаутентифицированным запросам, потому что JS обрабатывает аутентификацию на стороне клиента. Режим охоты обнаруживает этот шаблон (путь заканчивается на `.html` + `sameBody=true`) и подавляет находку. Настоящие API по-прежнему сообщаются.
- **Безобидные токены SAS Azure** — краткосрочные SAS-URL только для чтения для медиафайлов (`image.jpg?sv=...&sp=r&se=...`) — это легитимная доставка через CDN, а не утечка учётных данных. Режим охоты проверяет `sp=r` + расширение медиафайла + `se - st < 7 дней` и подавляет. Долгосрочные, с возможностью записи или не медиафайловые токены SAS по-прежнему сообщаются как реальные утечки.
- **Нормализация хеш-фрагментов** — `/Dashboard#!/` — это маршрут на стороне клиента, а не серверная конечная точка. Режим охоты удаляет хеш-фрагменты перед анализом цепочек, чтобы в отчёте отображался `/Dashboard` (фактический серверный путь).
- **Настоящий `baseUrl` в каждом curl** — анализатор цепочек извлекает целевой хост из `tab.url` (только HTTP/HTTPS) с запасным вариантом на первую наблюдаемую конечную точку. Больше никаких URL-заполнителей `https://target.tld` в ваших отчётах.
- **Прозрачная диагностика** — каждый шаг фильтрации (область видимости, степень серьёзности, дедупликация) записывает свои значения до/после в ленте в реальном времени. Когда охота завершается с 0 отчётов, лента заканчивается блоком «Почему нет отчётов?», в котором объясняется, где была отброшена каждая потенциальная находка, с конкретными предложениями дальнейших действий, адаптированными к вашей конкретной конфигурации.
### Настоящий черновик в режиме охоты
Вот отредактированный отрывок из реального черновика, созданного режимом охоты для государственной LMS за 4 минуты:```markdown
# Authentication bypass on sensitive endpoint: /api/DashboardApi/getUsefulLinks
**Severity:** CRITICAL (CVSS estimate: 9.0–10.0)
**Confidence:** 95%
**Target:** https://lms.example.gov/Dashboard
**Discovered:** 2026-05-01T07:31:13.151Z
**Detected by:** PenScope v6.2 Hunt Mode (chain pattern: chain-authbypass)
## Summary
PenScope's probe confirmed that GET /api/DashboardApi/getUsefulLinks returns
the same data whether or not authentication cookies are sent
(auth=200, noauth=200, sameBody=false). The path name strongly suggests this
endpoint should be role-gated — it's returning sensitive data to
unauthenticated callers.
## Steps to reproduce
# Verify unauthenticated access
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks"
# Compare to authenticated baseline (paste your real cookies):
curl -i "https://lms.example.gov/api/DashboardApi/getUsefulLinks" -b "session=..."
## Impact
Successful exploitation enables an attacker to bypass core security controls,
gain unauthorized access to sensitive functionality or data, and pivot to
broader compromise. This is a credible breach path warranting immediate
remediation.
## Suggested fix
Enforce server-side authentication on every endpoint that returns sensitive
data. The fact that PenScope received a 200 with no cookies means the
authorization middleware is missing or disabled for this route.
[ ... full Express/Django/Laravel snippet examples + references ... ]
Это отчет о баунти, который можно отправить. Составлен, пока вы занимались чем-то другим.
Верстак — это то, что превращает PenScope из "инструмента пассивной разведки" в "всё, для чего вы открываете Burp". Нажмите ⌘ Workbench в заголовке всплывающего окна, и откроется полноэкранная вкладка Chrome с шестью инструментами, которые используют общее состояние с вашим сканированием.
Захватили запрос, который хотите модифицировать? Нажмите на него в карте сайта. Полный запрос — метод, URL, заголовки, тело — загружается в редактор. Редактируйте что угодно. Нажмите Send (или Ctrl+Enter). Ответ отображается справа с указанием статуса, размера, времени и активного контекста аутентификации, с которого он был отправлен.
Панель истории хранит последние 50 отправок. Три кнопки превращают текущий запрос в полезные артефакты: Copy as curl (для терминалов и отчетов), Send to Intruder (с теми же заголовками и телом), Send response to Diff.
Возьмите любой запрос. Оберните значение, которое хотите фаззинговать, в §...§. Выберите набор полезной нагрузки. Нажмите Start.
Встроенная библиотека полезных нагрузок:
Или вставьте свой собственный список. Четыре режима атаки: Sniper (одна позиция за раз), Cluster bomb (все комбинации), Pitchfork (позиции синхронно), Battering ram (одна и та же полезная нагрузка везде). Таблица результатов в реальном времени с обнаружением аномалий — строки, где код статуса или размер ответа отличаются от базового, помечаются.
Жесткое ограничение: 200 запросов на атаку. Нечаянно не устроите DoS своей цели баунти.
Обратимые преобразования для форматов, с которыми хантеры сталкиваются каждый день:``` Base64 ↔ B64-URL ↔ URL ↔ HTML ↔ Hex ↔ MD5 / SHA-1 / SHA-256 / SHA-512
Plus a dedicated **JWT card**: paste a token, decode the header and payload, edit either, then forge a new one. Two forge modes:
- **alg=none** — the classic JWT auth bypass test (server trusts unsigned tokens)
- **HS256** — sign with a guessed weak secret (`secret`, `key`, `password`, `jwt-secret` are the common ones)
Output is a single token, copy-paste ready.
### Diff
Two text panes. Send responses from Repeater with one click. Hit `Compute Diff`. PenScope runs an LCS line-diff and color-codes the result: `+` for added, `−` for removed. Summary count at the top.
This is the IDOR-confirmation killer. "Is the response for User A *the same* as for User B, or did the server actually return User B's data?" Diff tells you in three seconds.
### Site Map
Hierarchical tree of every endpoint PenScope captured, organized by host → path. Method pills (`GET`, `POST`, `DELETE`...). Status code badges per node, color-coded green/yellow/orange/red. Click any path to load it into Repeater.
The full attack surface, in one view, ready to test.
### Auth Contexts + Authorization Matrix
This is the differentiator. Burp doesn't ship this.
Save named auth profiles. Each profile = a name + a set of cookies + a set of headers. Build them by logging in as each user, copying their session cookies + Authorization header, pasting into the editor. Add notes ("paid plan", "read-only role", "internal staff"). One click switches the active context. Every Repeater / Intruder / probe request now fires with those credentials.
Then click `Run authorization matrix`. PenScope hits every endpoint × every context and renders a grid:```
Anonymous User A User B Admin
GET /api/me 401 200 200 200
GET /api/users 401 403 403 200
GET /api/admin 401 403 403 200
DELETE /api/orders/5 405 403 403 ★ 200
PATCH /api/users/42 401 200 ★ 403 200
Звёздочки отмечают строки, где контексты расходятся. Эти строки — ваши находки IDOR и BAC, автоматически выявленные.
Типичный хантер тратит целый день на ручное тестирование каждой конечной точки для каждого пользователя, записывая заметки в документ. PenScope делает это за 30 секунд и раскрашивает результаты.
Один и тот же движок данных, три представления. Выберите то, что подходит под вашу задачу.
Переключайте режимы с помощью пилюль Classic / Red / Blue в заголовке всплывающего окна. Каждая вкладка запоминает, в каком режиме вы были в последний раз. Цвета темы меняются вместе с режимом.
Нажмите Export ▾ в заголовке всплывающего окна. Десять форматов, два назначения:
Markdown-отчёт создан для обмена — все учётные данные заменяются, заголовок отчёта явно об этом сообщает. JSON создан для синхронизации с напарником по ханту — все учётные данные передаются как есть.
PenScope и Burp решают одну и ту же проблему с разных сторон. PenScope живёт в вашем браузере; Burp — это MITM-прокси. У каждого своё место. Вот честное сравнение.
Где PenScope побеждает: бесплатно, быстрее настройка, нативный для браузера (использует вашу реальную сессию, без танцев с сертификатами), цепочная корреляция, инструменты для защитников, AI-мост.
Где Burp побеждает: перехват на уровне TLS позволяет видеть и изменять запросы до того, как они покинут сетевой стек — полезно для нативных приложений и smuggle вебсокетов. Collaborator предоставляет инфраструктуру out-of-band callback для слепых XXE / SSRF.
Если вы занимаетесь баунти исключительно в браузере для веб-приложений, PenScope заменяет Burp примерно на 95% вашего повседневного рабочего процесса. Если вы реверсите мобильные приложения или тестируете толстых клиентов, Burp всё ещё ваш друг.
PenScope ничего не отправляет без явного действия пользователя. Нет:
Исходящий трафик происходит только в трёх случаях:
Ноль npm-пакетов. Ноль CDN-скриптов. Ноль сторонних SDK. Чистый ванильный JavaScript, манифест MV3, нулевая поверхность атак через цепочку поставок.
Архитектура, 36 атак-зондов, 13 шаблонов цепочек, карта файлов и почему всё это не требует этапа сборки.
┌──────────────────────────┐
│ state[tabId] │
│ 60+ fields populated by │
│ webRequest / content / │
│ CDP / probe layers │
└──────────┬───────────────┘
│
┌───────────────────────┼───────────────────────┐
│ │ │
Classic mode Red mode Blue mode renderClassic() renderRed() renderBlue() │ │ │ └───────────────────────┴───────────────────────┘ │ ┌────────────────┴────────────────┐ │ │ Workbench Hunt Mode (Repeater · Intruder · Encoder (autonomous orchestrator · Diff · Site Map · Auth Matrix) drafting H1 reports)
**Один движок, три режима, три поверхности.** Движок данных не зависит от режима — каждое поле состояния собирается одинаково независимо от того, в каком представлении вы находитесь. Режимы — это выбор темы + рендерера над одними и теми же данными. Workbench и Hunt Mode — это отдельные вкладки Chrome, которые обмениваются `state[tabId]` через обработчики фоновых сообщений.
Переопределения CSS-переменных (`body.mode-red`, `body.mode-blue`) перетемизируют всё без изменения ни одного селектора правил. Именно поэтому Classic Mode — это полностью та же v5.9, байт в байт.
---
## Производительность
PenScope находится на каждой вкладке постоянно. По умолчанию он пропускает дорогостоящее обогащение для ~50 известных шумных суффиксов хостов (видео CDN, такие как `googlevideo.com`, рекламные сети, такие как `doubleclick.net`, телеметрические конечные точки, такие как `sentry.io`, крупные статические CDN, такие как `gstatic.com`). Сотни запросов фрагментов `googlevideo.com` в минуту на YouTube больше не проходят через 14 регулярных выражений AUTH_PATTERN + обнаружение параметров пути + поиск Swagger — они регистрируются как конечные точки (так что карта сайта все еще включает их) и пропускаются для остального.
Тот же быстрый путь для типов ресурсов `image`/`media`/`font`/`stylesheet`/`object`/`ping` на любом хосте. Ошибки почти никогда не прячутся в параметрах URL `.css`.
Повторные сканирования DOM в скрипте контента выполняются через `requestIdleCallback` (с жестким минимальным интервалом в 15 секунд между сканированиями) и полностью пропускаются, когда вкладка скрыта. MutationObserver отфильтровывает только текстовые изменения (тиканье таймеров, обновления символьных данных), так что постоянное изменение DOM на YouTube не вызывает полное повторное сканирование каждые 3 секунды.
Доступно переопределение: флажок **«Полный захват на шумных хостах»** в выпадающем меню Probe. Когда вы специально аудите YouTube/Twitch/Sentry и т.д. В КАЧЕСТВЕ цели, установите его, и быстрый путь будет обойден.
---
## 45 атак Probe
Выполняются по запросу. Три уровня агрессии с обязательными условиями: **Осторожный** = только GET/HEAD/OPTIONS с минимальным интервалом 200 мс между запросами; **Средний** = добавляет POST для операций чтения (≤3 параллельно); **Полный** = все методы, включая DELETE/PUT/PATCH, а также пакеты с гонками (≤10 параллельно). Пользовательские заголовки вставляются в каждый запрос. Режим скрытности перемешивает порядок шагов с помощью Фишера-Йетса и добавляет 0–80% джиттера к задержкам между шагами. Ожидаемый метод каждого шага проверяется на соответствие активному уровню при запуске; заблокированные шаги перечислены в журнале диагностики.
| # | Атака | Что делает |
|---|---|---|
| 1 | Интроспекция GraphQL | Извлекает схему, типы, запросы, мутации |
| 2 | Сбор Source Map | Загружает `.map`, извлекает секреты и конечные точки |
| 3 | Загрузка Swagger/OpenAPI | `/swagger.json`, `/openapi.json` и т.д. |
| 4 | OPTIONS preflight | CORS preflight на каждом пути API |
| 5 | Разведка путей | `/admin`, `/.env`, `/.git/HEAD`, `/actuator` |
| 6 | Перебор префиксов/суффиксов API | `/api/v1/<word>` |
| 7 | Умный перебор суффиксов | Перемешанные в скрытном режиме префикс × суффикс |
| 8 | BAC (нарушенный контроль доступа) | Конечные точки, изменяющие состояние, без аутентификации |
| 9 | Автотест IDOR | Подстановка ID и сравнение тела ответа |
| 10 | Тест отражения CORS | Отражение Origin с учетными данными |
| 11 | Подмена метода | Замена GET/POST/PUT/PATCH/DELETE |
| 12 | Зонд открытого перенаправления | Варианты `?redirect=evil.com` |
| 13 | Зонд гонки условий | Параллельные запросы к чувствительным к идемпотентности конечным точкам |
| 14 | Загрязнение HTTP-параметров | `?id=1&id=2` |
| 15 | Перечисление поддоменов | Из логов CT и наблюдаемого трафика |
| 16 | Фаззинг полей GraphQL | Проверяет каждое проинтроспектированное поле на аутентификацию |
| 17 | Принятие JWT alg=none | Сервер доверяет неподписанным токенам? |
| 18 | Внедрение заголовка Host | Варианты `X-Forwarded-Host` |
| 19 | Отравление кэша | Внедрение безключевого заголовка |
| 20 | IDOR подтвержден sameBody | Сходство тела ответа у разных ID |
| 21 | Тест удаления аутентификации | Удалить куки, искать 200-е ответы |
| 22 | Отсутствие проверки CSRF | Конечные точки, изменяющие состояние, без токена |
| 23 | Отражение gRPC | Открытая служба отражения gRPC |
| 24 | Оракул сжатия (BREACH) | Эвристика, не выполняет реальную эксплуатацию |
| 25 | Угон WebSocket | Cross-origin WS-соединения |
| 26 | Зонд отравления кэша | Ввод на основе безключевого заголовка |
| 27 | Временной оракул | Расхождение времени ответа одной и той же конечной точки |
| 28 | Обход COOP/COEP | Сила изоляции Cross-Origin |
| 29 | Разделение хранилища | Изоляция хранилища между сайтами |
| 30 | Умное рекурсивное обнаружение | 3 волны зондирования, цепляющиеся от предыдущих ответов |
| 31 | Обнаружение параметров | Перебор 38 скрытых параметров (`debug`, `admin`, `_method`, `bypass`...) |
| 32 | Зонд SSTI | `{{7*7}}`, `${7*7}`, `<%=7*7%>` |
| 33 | Зонд XXE | XML с внешними сущностями |
| 34 | Внедрение CRLF | `%0d%0a` в параметрах перенаправления |
| 35 | Понижение версии API | `/v1/`, `/v2/` для каждого наблюдаемого `/vN/` |
| 36 | Загрязнение прототипа | `__proto__` / `constructor.prototype` в JSON-телах |
| 37 | Зонд параметров SSRF | 26 имен параметров SSRF с полезными нагрузками метаданных облака; помечает отраженное содержимое метаданных |
| 38 | Внедрение операторов NoSQL | `{"$ne":null}` / `{"$gt":""}` / `{"$exists":true}` на JSON-полях ID |
| 39 | Усиление псевдонимов GraphQL | Запрос с 50 псевдонимами → поверхность усиления DoS (только полный уровень) |
| 40 | Усиление пакета GraphQL | Пакет из 25 элементов JSON-массива → усиление DoS (только полный уровень) |
| 41 | Обман кэша | Стиль `/api/me/avatar.css` — конфиденциальное содержимое кэшируется за статическими расширениями |
| 42 | Перехват поддомена | Зонд HEAD для захваченных поддоменов; сопоставляет сигнатуры захвата GitHub Pages / S3 / Heroku / Netlify / Vercel / Bitbucket / Shopify |
| 43 | TabNabbing | Cross-origin `<a target="_blank">` без `rel="noopener"` |
| 44 | Корреляция origin в postMessage | Слушатели `addEventListener("message")` без проверки origin |
| 45 | Злоупотребление областью Service Worker | Флаги широких областей SW (особенно `/`) |
Плюс **8 наборов атак, учитывающих стек**, которые запускаются автоматически, когда Red mode обнаруживает соответствующий фреймворк: Laravel, Spring Boot, Rails, ASP.NET, Django, Next.js, GraphQL, WordPress. Каждый набор содержит от 4 до 9 тестов, специфичных для стека. Только набор Spring Boot поражает `/actuator/heapdump`, `/actuator/env`, `/jolokia/list`, `/h2-console`.
---
## 13 шаблонов цепочек
Отдельные находки — это шум. Составные находки — это эксплойты. Анализатор цепочек PenScope проходит по всему состоянию и выдает цепочки там, где несколько сигналов объединяются в нечто эксплуатируемое.
1. **Обход аутентификации на чувствительной конечной точке** — подтверждено отсутствие аутентификации + путь admin/billing/user
2. **Разрушительный BAC** — уязвимая конечная точка с `delete`/`remove`/`purge` в пути
3. **Уязвимая к CSRF мутация GraphQL** — подтверждено отсутствие CSRF + это мутация
4. **Раскрытый токен аутентификации + живое API** — JWT в памяти + соответствующие конечные точки
5. **Подтвержденный IDOR с конфиденциальными данными** — ответ с тем же скелетом для разных ID
6. **Отражение CORS С учетными данными** — полный обход SOP
7. **Открытое перенаправление в процессе аутентификации** — параметр redirect на путях обратного вызова OAuth
8. **Скрытые маршруты администратора** — 3 и более путей admin в коде, никогда не наблюдавшихся в трафике
9. **Принятие JWT alg=none** — сервер доверяет неподписанным токенам
10. **Утечка секретов через Source Map** — в производстве поставлены файлы `.map` с жестко закодированными ключами
11. **Утечка внутреннего IP через WebRTC** — частные IP-адреса раскрыты через STUN
12. **Кластер находок рекурсивного зонда** — 3 и более чувствительных находок на нескольких конечных точках
13. **Специфичная для стека поверхность RCE** — набор для стека обнаружил открытый actuator/Ignition и т.д.
Каждая цепочка имеет степень серьезности, сводку, команду воспроизведения, следующие шаги и показатель уверенности. Отсортировано по `severity × confidence`. Отображается в верхней части Red mode и в верхней части каждого отчета Claude.
---
## Оценка здоровья (Blue mode)```
score = max(10, 100 − min(90, crit×22 + high×9))
Строго намеренно. Только критичные и высокие изменяют число. Средние и низкие все еще отображаются в плитках счетчика и топ-5 исправлений — их стоит исправлять — но они не влияют на оценку.
Нижняя граница равна 10, чтобы катастрофический сайт показывал '10/100', а не '0/100' (что пользователь не смог бы отличить от 'ошибка сканирования').
PenScope/ ├── manifest.json MV3 manifest, v6.3.0, "type":"module" service worker ├── popup.html Mode UI shell — three modes, glassmorphism dark theme ├── popup.js Renderers, mode router, weaponize panels, fix snippets, │ compliance, Hunt + Workbench launchers, exports ├── content.js Content script — DOM scanning, secrets, JSON islands, │ tech fingerprints, XSS sinks, postMessage scan │ ├── workbench.html / .js Workbench tab — Repeater / Intruder / Encoder / │ Diff / SiteMap / AuthCtx + AuthMatrix │ ├── hunt.html / .js Hunt Mode tab — autonomous orchestrator │ ├── regex-pack.json 81 secret patterns + 44 response-body patterns │ (loaded by SW at boot, merged into RESP_PATTERNS, │ fetched by content script via getRegexPack message) │ ├── src/ Service worker entry + module tree (Phase 7 migration) │ ├── background.js Entry — webRequest, CDP, probe orchestrator, │ │ chain correlator, message router (~7,000 lines) │ ├── probe/ │ │ └── stack-packs.js STACK_ATTACK_PACKS (8 stacks) — extracted module │ └── (other audit-named files are stubs — see MIGRATION.md) │ ├── fonts/ Local woff2: JetBrains Mono + Plus Jakarta Sans │ (4 + 5 weights, ~590 KB total). Replaces the │ Google Fonts beacon that earlier versions hit on │ every popup open. │ ├── icons/ 16, 48, 128 px PNG ├── CHANGELOG.md Full version history v5.1 → v6.3.0 ├── CHANGES.md v6.3 per-phase fix breakdown ├── MIGRATION.md Phase 7 module-migration map (real vs stub) ├── LICENSE MIT └── README.md You are here
Четыре старых файла-справочника (`red-attacks.js`, `blue-fixes.js`, `blue-csp.js`, `blue-compliance.js`) были удалены в версии 6.3 — их содержимое уже было встроено в `popup.js` / `background.js` начиная с версии 6.0; отдельные файлы являлись мёртвым кодом. `STACK_ATTACK_PACKS` теперь является реальным ES-модульным экспортом из `src/probe/stack-packs.js`.
---
## Без этапа сборки```bash
git clone https://github.com/spider12223/PenScope
# That's it.
Никакого npm install. Никакого webpack. Никакого babel. Никакого TypeScript. Никакого сборщика. Чистый ванильный JavaScript. Тег <script> в popup.html указывает напрямую на popup.js. Сервис-воркер загружает background.js напрямую. CSS встроен в <style>.
Реализация MD5 занимает ~50 строк встроенного эталонного RFC 1321 (потому что crypto.subtle не предоставляет MD5). LCS diff — ~30 строк. Подпись JWT использует нативный crypto.subtle.sign. Коррелятор цепочек — это просто регулярное выражение + перебор массива. Всё, что вы читаете в этой кодовой базе, именно то, что выполняется в браузере.
Инструмент разведки, который поставляется с 200 транзитивными npm-зависимостями, имеет 200 пакетов поверхности атаки цепочки поставок. У PenScope — ноль.
Приветствуются отчёты об ошибках и PR. Некоторые ограничения:
package.json. Если нужна небольшая утилита, напишите 20 строк.state[tabId]. Не вводите новые глобальные хранилища.:focus-visible, ARIA-метки, контраст ≥4.5:1.new Function(). Сервис-воркеры MV3 запрещают динамический код. Используйте именованные объявления функций + args для chrome.scripting.executeScript.MIT. Используйте, форкайте, публикуйте.
Если PenScope найдёт вам критическую уязвимость, создайте issue и расскажите нам. Мы собираем истории из практики.
Сделано охотниками, для охотников.
Accessibility.getFullAXTree выявляет чувствительные aria-метки (кнопки admin/sudo/delete/destroy). Storage.getCookies раскрывает CHIPS-разделённые cookie, которые chrome.cookies.getAll не видит.<script type="application/json"> (Next __NEXT_DATA__, Nuxt __NUXT__, Remix __remixContext, Apollo __APOLLO_STATE__) разбираются на конечные точки + ID-поля, а не просто сканируются регулярками./users/123, /users/124 в /users/{id} с подсчётом. Автопанель для поддоменов admin.*, api.*, internal.*.ffuf -w.window.__ps_ctx больше не раскрывает заголовки авторизации пользователя в контексте страницы после завершения проверки. Команды воспроизведения цепочек по умолчанию скрывают сессионные cookie (в Red режиме есть переключатель для включения реальных значений). Снимки fetch/JSON/Promise/atob/btoa/и т.д. в IIFE зонда захватываются при загрузке, чтобы страницы с аналитикой не могли перехватить зонд, переопределив глобальные переменные. Локальное встраивание шрифтов — нулевые исходящие запросы при открытии всплывающего окна."type":"module". Дерево каталогов src/ на месте; STACK_ATTACK_PACKS извлечены в src/probe/stack-packs.js. Оставшиеся модули — заглушки, документирующие путь извлечения.| Набор | Количество | Сценарий использования |
|---|
| XSS | 40 | Тестирование отражений, DOM XSS, варианты SVG/iframe |
| SQLi | 30 | Boolean blind, error-based, time-based, UNION |
| LFI / Path Traversal | 28 | Варианты кодирования, Windows + Linux, отравление логов |
| SSTI | 18 | Jinja2, Twig, Freemarker, Velocity, Smarty |
| SSRF | 22 | Варианты localhost, метаданные AWS/Azure/GCP, gopher/dict |
| Command Injection | 24 | Bash, PowerShell, обход IFS |
| IDs 1-100 | 100 | Для перебора IDOR |
| Auth bypass | 25 | Трюки с путями, повышение роли, обход SQL-аутентификации |
| Common usernames | 25 | admin, root, test, support, service... |
| Режим | Для кого | Что на экране |
|---|
| 🟣 | Классический | Привычный рабочий процесс, все данные | Каждая вкладка, каждая деталь. Оригинальный PenScope. |
| 🔴 | Red | Наступательное тестирование | Панель цепочек эксплойтов вверху с кнопками вооружения (curl, Nuclei YAML, Burp request, H1 report draft, Claude queue). Пакеты атак, учитывающие стек, автоматически запускаются на обнаруженных фреймворках (Laravel, Spring Boot, Rails, ASP.NET, Django, Next.js, GraphQL, WordPress). В первую очередь цепочки, классические вкладки свёрнуты внизу. |
| 🔵 | Blue | Защитники / обзор безопасности | Оценка здоровья (0-100, строгая — учитываются только критические и высокие). Топ-5 исправлений, отсортированных по критичности × простоте, каждое с примерами для копирования в Nginx / Apache / IIS / Express / Django / Laravel / Rails / ASP.NET. Генератор CSP на основе наблюдаемого трафика. Аудит соответствия по 7 фреймворкам. Снимок и дифф регрессии. Непрерывный мониторинг с уведомлениями Chrome при утечке новых секретов. |
| Экспорт | Включает учётные данные? | Для чего использовать |
|---|
| JSON (полные данные) | ✅ Да | Формат для обмена в команде. Два хантера, работающие с одной целью, нуждаются в общих контекстах аутентификации для воспроизведения находок. Отправляйте через Signal / зашифрованный канал. |
| 📄 Полный отчёт (.md) | ❌ Заменено | Для отправки на баунти, взаимодействия с клиентом, везде, где информация покидает вашу команду. Значения заголовков аутентификации (Authorization, Cookie, X-API-Key, X-Auth-Token, X-CSRF-Token, X-Amz-Security-Token и т.д.) заменены на <redacted, N chars>. Включает встроенные отчёты режима охоты, срабатывания пакетов атак, оповещения непрерывного мониторинга и статус триажа "Помечено как исправленное". |
| Список URL для Burp | Только список URL | Вставьте в область целей Burp или передайте в ffuf/nuclei |
| Список параметров | Только имена | Словари для фаззинга — параметры запроса + имена полей форм + имена скрытых полей |
| Список параметров (ffuf) | Только имена | Те же данные, выводимые в виде строк param=FUZZ для ffuf -w |
| Конечные точки (txt) | Только список URL | Метод/статус/путь/хост/теги/размер, разделённые табуляцией — наблюдаемые и обнаруженные маршруты |
| 📤 Экспорт HAR | Заголовки + тела | Полный захват HAR-1.2, который можно импортировать в Chrome DevTools / просмотрщик HAR / передать коллеге |
| 🔧 Спецификация Swagger (.yaml) | Только список URL | Восстановленная спецификация OpenAPI 3.0 из наблюдаемого трафика |
| 🗺️ Source Maps (JSON) | Только извлечения из исходников | Полные разобранные карты исходников с деревьями файлов, секретами, маршрутами, переменными окружения, зависимостями |
| ⚔️ Шаблоны Nuclei (.yaml) | Только URL зондов | Поместите в ~/.config/nuclei/custom/ для непрерывного сканирования |
| Функция | PenScope (бесплатно) | Burp Suite Pro ($449/год) |
|---|
| Repeater | ✅ | ✅ |
| Intruder (4 режима атак) | ✅ | ✅ |
| Decoder (B64/URL/Hex/JWT) | ✅ | ✅ |
| Comparer / Diff | ✅ | ✅ |
| Target / Site Map | ✅ | ✅ |
| Active scanner | ✅ (45 зондов + 8 стековых пакетов) | ✅ |
| Обработка контекстов сессий/аутентификации | ✅ (сохранённые профили + матрица) | ✅ (на основе правил) |
| Тестер матрицы авторизации | ✅ (встроенный) | ❌ (платное расширение) |
| Цепочная корреляция (составные находки) | ✅ (13 шаблонов) | ❌ |
| Эвристика захвата поддоменов | ✅ (8 сигнатур служб) | ❌ (платное расширение) |
| Тесты поверхности DoS GraphQL (алиас + пакетная обработка) | ✅ | ❌ |
| Кнопка повторного запроса без аутентификации для каждой конечной точки | ✅ | ❌ |
| Импорт и экспорт HAR | ✅ (туда и обратно) | ✅ (односторонний) |
| Diff IndexedDB (утечки состояния клиента) | ✅ | ❌ |
| Захват разделённых cookie CHIPS | ✅ | ❌ |
| Парсер JSON-островков (данные гидратации Next/Nuxt/Remix) | ✅ | ❌ |
| Сопоставление с требованиями (PCI/NESA/SAMA/ISO/OWASP) | ✅ (7 фреймворков) | ❌ |
| Генератор CSP из наблюдаемого трафика | ✅ | ❌ |
| Дифф регрессии (снимок + сравнение) | ✅ | ❌ |
| Интеграция AI (двунаправленная связь с Claude) | ✅ | ❌ |
| Автономный режим охоты (создаёт черновики отчётов H1, пока вы спите) | ✅ | ❌ |
| Время настройки | 60 секунд | ~30 минут (прокси + сертификат + настройка браузера) |
| Перехват на уровне TLS | ❌ (ограничение браузера) | ✅ |
| Out-of-band тестирование (Collaborator) | ❌ (планируется) | ✅ |
| Магазин расширений | ❌ | ✅ |
| Стоимость | $0 | $449 / пользователь / год |
| Состояние | Оценка |
|---|
| 0 крит., 0 выс. | 100 (чисто) |
| 1 выс. | 91 |
| 3 выс. | 73 |
| 1 крит. | 78 |
| 1 крит. + 3 выс. | 51 |
| 3 крит. | 34 |
| 5+ крит. | 10 (минимум) |
| Разрешение | Зачем |
|---|
webRequest | Перехватывать каждый запрос/ответ без повторной загрузки |
webNavigation | Обнаруживать изменения маршрута SPA через pushState/replaceState (v6.3+), чтобы конечные точки с app.com не попадали в состояние нового источника при навигации SPA между разными источниками |
activeTab | Читать URL текущей вкладки + отправлять сообщения контентному скрипту |
scripting | Внедрять запускатели зондов, стеки пакетов и запросы Workbench в контекст страницы |
tabs | Сопоставлять находки с правильной вкладкой; открывать Workbench в новой вкладке |
cookies | Читать HttpOnly-куки, которые document.cookie не видит |
debugger | Требуется для режима Deep — включает CDP для полных тел ответов, интроспекции во время выполнения, извлечения исходного кода, проблем аудита, дерева доступности, сегментированных куки |
notifications | Уведомления непрерывного мониторинга о новых утечках секретов |
alarms | Тики с 5-минутным интервалом для непрерывного мониторинга |
storage | Сохранять состояние (session) и снимки (local) между перезапусками SW |
<all_urls> разрешение на хосты | Перехват не привязан к цели; пользователь управляет тем, какая вкладка открыта |