
jshunter — это инструмент командной строки, предназначенный для анализа JavaScript-файлов и извлечения конечных точек. Этот инструмент специализируется на выявлении конфиденциальных данных, таких как API-эндпоинты и потенциальные уязвимости безопасности, что делает его незаменимым ресурсом для охотников за багами и исследователей безопасности.
Профессиональный инструмент анализа безопасности JavaScript
Полное обнаружение конечных точек, выявление конфиденциальных данных и расширенный анализ кода для специалистов по безопасности
JSHunter — это комплексный инструмент командной строки для анализа безопасности JavaScript и обнаружения конечных точек. Созданный для специалистов по безопасности, пентестеров и разработчиков, он предоставляет возможности анализа корпоративного уровня с высокоточными алгоритмами обнаружения и профессиональными функциями отчётности.
https://github.com/user-attachments/assets/5a5f60fa-f8dc-4aac-bd06-2e93779f9af4
JSHunter в действии — реальная запись работы CLI в терминале (все показанные секреты являются фиктивными тестовыми данными)
Точность корпоративного уровня с расширенными алгоритмами анализа
JSHunter разбирает сканируемый JavaScript, а не просто сопоставляет его с шаблонами. Однопроходный сканер ECMAScript классифицирует каждый байт ответа как строковый литерал, шаблонный литерал, комментарий, литерал регулярного выражения или код, и правила обнаружения применяются с учётом этой классификации.
Это важно, потому что регулярное выражение не имеет представления о том, чему оно соответствует. Одни и те же сорок символов base64 означают «учётные данные» внутри строкового литерала, «хэш чанка» внутри минифицированного идентификатора и вообще ничего, когда они разрываются на стыке двух соседних токенов. Знание того, что именно это, заменяет кучу эвристик близости структурным ответом:
key, движок восстанавливает идентификатор или ключ свойства, к которому значение фактически привязано — const stripeSecret = "..." читается совсем иначе, чем {contentHash: "..."}, и правило, основанное только на форме, теперь требует этой привязки.role, SID Twilio — классифицируются, а не сообщаются как утечки. --include-public всё равно сообщает о них.Каждое отклонение обусловлено тем, что тело уверенно является JavaScript или JSON. На чём-либо другом — файле .env, прозе, чистом HTML — движок предоставляет доказательства, но никогда не подавляет, поэтому неверно классифицированный ввод никогда не сможет скрыть секрет. --no-structural полностью отключает этот слой и восстанавливает поведение v0.7.
Находки несут обоснование в виде объекта evidence в --json, --ndjson и в наборе свойств SARIF:```json
"exposure": "secret",
"evidence": {
"region": "string-literal",
"role": "assignment",
"bound_to": "awsAccessKeyId",
"shape": "opaque-token",
"charset": "alphanumeric",
"signals": [
{"name": "in-literal", "delta": 0.04, "detail": "value is a complete string-literal"},
{"name": "credential-binding", "delta": 0.12, "detail": "bound to 'awsAccessKeyId'"}
]
}
`--stats` сообщает, что отбросил каждый этап, поэтому конвейер остаётся проверяемым.
### Граф чанков и обнаружение маршрутов
Современное приложение поставляет один входной бандл и несколько сотен лениво
загружаемых чанков, URL которых собираются во время выполнения из манифеста,
встраиваемого бандлером. Ничто не ссылается на них, поэтому краулер их никогда
не видит. `-G` восстанавливает этот манифест и выводит полный список ресурсов
и таблицу клиентских маршрутов:```console
$ jshunter -u https://target.example/_next/static/chunks/main-a1b2c3.js -G
[CHUNKS] https://target.example/...: next runtime, 214 chunks, 37 routes
[CHUNK] https://target.example/... https://target.example/_next/static/chunks/settings.11aa22bb33cc.js
[ROUTE] https://target.example/... /admin/users/:id
Поддерживаемые среды выполнения: webpack 4 и 5 (__webpack_require__.u, miniCssF,
jsonpScriptSrc), манифесты сборки Next.js, Vite и Rollup (__vite__mapDeps,
__vitePreload), обычный динамический import() и таблицы маршрутов из React Router,
Vue Router и Angular. Вывод разделён табуляцией и дедуплицирован, поэтому его можно
напрямую передать обратно в качестве входного списка для последующего сканирования:```bash
jshunter -u https://target.example/main.js -G -q | awk -F'\t' '/^[CHUNK]/{print $3}' > chunks.txt
jshunter -l chunks.txt -s -j > findings.json
### Профессиональный набор для работы с HTTP и сетями
<details>
<summary><strong>Сетевая конфигурация корпоративного уровня</strong></summary>
**Аутентификация и заголовки:**
- **Пользовательские заголовки** (`-H`): Повторяемые заголовки аутентификации и пользовательские заголовки запросов
- **Управление cookie** (`-c`): Сессионные cookie для доступа к защищённым ресурсам
- **Управление User-Agent** (`-U`): Пользовательские строки UA или ротация на основе файла для скрытности