Skip to content
KitploitKITPLOIT
ИнструментыЭксплойтыБлог
Log in
Отправить
ИнструментыЭксплойтыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

ЛентыКонтактыКонфиденциальность© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
jshound — Найдите все API-запросы, которые выполняет веб-приложение, по его JavaScript-коду: метод, URL, тело, заголовки и операции GraphQL. Одна команда. | Kitploit
Инструменты/GitHubGitHub/ambitsecurity/jshound
РазведкаСтатический анализАнализ уязвимостейСбор информацииВеб-безопасностьТестирование на ПроникновениеКраулерБезопасность API
GitHubambitsecurity/jshound

jshound

Найдите все API-запросы, которые выполняет веб-приложение, по его JavaScript-коду: метод, URL, тело, заголовки и операции GraphQL. Одна команда.

Репозиторий
3274 дней назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

jshound

Восстановите каждый запрос, который веб-приложение создано выполнять, из поставляемого им JavaScript: метод, URL, тело, тип содержимого и заголовки.

jshound читает supabase.com/dashboard: обработано 2 282 файла, получено 387 запросов, каждый с его телом

JavaScript-бандл одностраничного приложения содержит каждый API-запрос, который приложение может выполнить. Получив URL, jshound находит бандл приложения, обходит его целиком, включая лениво загружаемые чанки, и извлекает эти запросы.

Он пассивен. Единственные запросы, которые он делает, — это неаутентифицированные GET-запросы к публичным статическим файлам, странице и её JavaScript. Анализ выполняется локально, и ничего не отправляется в API приложения.

Установка

git clone https://github.com/AmbitSecurity/jshound && cd jshound
python3 -m venv .venv && source .venv/bin/activate
pip install -e .

Требуется Python 3.10 или новее и Node 18 или новее.

Использование

jshound supabase.com/dashboard
$ jshound supabase.com/dashboard
  307    128B  https://supabase.com/dashboard
  200     19K  https://supabase.com/dashboard/org
  200     28K  https://frontend-assets.supabase.com/studio/8617532ae1a4/_next/static/chunks/1p849pzlxcp4n.js?dpl=dpl_ESaSquAbnWrJqbvvyRh7F1qj5wWH
  ...
supabase.com  200  2282 files (2281 from frontend-assets.supabase.com, 1 from supabase.com)  ->  387 endpoints
              1 declared chunk(s) could not be fetched
              -> .jshound/supabase.com/endpoints.txt  (also requests.jsonl, urls.txt, openapi.json)
  • Он загрузил страницу и каждый скрипт, который загружает страница, включая 2 281 файл на frontend-assets.supabase.com, где находится сборка supabase.
  • Он нашёл лениво загружаемые чанки и импорты в этих файлах, загрузил их и повторял, пока не появились новые файлы.
  • Он прочитал каждый запрос в коде, по одному на строку:
POST    https://api.supabase.com/platform/auth/{ref}/otp                                       {"phone":"state:phone"}
DELETE  https://api.supabase.com/v1/projects/{param_n}/functions/{param_e}
DELETE  https://supabase.com/dashboard/api/integrations/stripe-sync     application/json   {"projectRef":"input:e","startTime":"input:t"}
POST    https://supabase.com/docs/api/search/fts                        application/json   {"query":"computed:trim"}

Несколько целей сразу или список на stdin:

jshound app.example.com api.example.com
cat scope.txt | jshound

Файлы, уже находящиеся на диске, например папка js/ из предыдущего запуска, читаются без обращения к сети:

$ jshound examples/demo-app
GET    https://demo-app.test/api/feature-flags
POST   https://demo-app.test/t/events                                  {"sid":"?","evt":"?"}
DELETE https://demo-app.test/v1/sessions/current
POST   {baseUrl}/v1/media                         multipart/form-data  {"file":"file-upload"}
POST   {baseUrl}/v1/subscribe                     application/json     {"email":"computed:trim","pageUri":"state:href"}
GET    {baseUrl}/v1/users/{param_o}/profile

Что сохраняется

Всё попадает в .jshound/<host>/ или в -o DIR:

endpoints.txtтаблица выше, один запрос на строку
requests.jsonlодин JSON-объект на запрос: method, url, body, content_type, headers, graphql или rpc, а также страница и файл, из которого он пришёл
urls.txtMETHOD URL для запросов, чей хост известен, для инструментов, принимающих список
openapi.jsonдокумент OpenAPI 3 для импорта в Burp, Caido или Postman
js/каждый загруженный файл

Чтение вывода

  • {...} — это значение, которое jshound не смог разрешить, записанное так, как его пишет код: {baseUrl}, {window.__CONFIG__.apiBaseUrl}. В пути {ref} — это параметр, а {param_o} — это параметр функции o.
  • Путь без хоста, например /api/surveys/, проходит через код, который jshound пока не отслеживает до его базы. requests.jsonl указывает файл, из которого он пришёл.
  • Значения тела говорят, откуда берётся значение каждого поля: input: — аргумент, state: — свойство объекта, computed: — результат вызова, ? — неизвестно.
  • application/json? — это тип содержимого, выведенный из других запросов файла, а не прочитанный в месте вызова. ~{...} — это тело, в котором полей больше, чем перечислено.
  • {graphql} — это операция GraphQL с её именем, типом и переменными в качестве тела.

Как это работает

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

Поддерживаемые сборщики

сборщикURL ленивых чанковдерево модулейкак
webpack 5дадачитает __webpack_require__.u из синтаксического дерева
webpack 4дадане имеет .u, поэтому именованный построитель URL сопоставляется по форме, а не по имени
Rspackдадасовместим с webpack, обычно выдаёт ESM
Turbopackдан/дпостроителя вообще нет; список чанков — это литеральный массив
Vite / Rollupдан/дпути записаны явно (__vite__mapDeps); плоский ESM не имеет реестра для обхода
esbuildдан/дто же самое
Parcelдан/дглобальная переменная времени выполнения имеет суффикс для каждой сборки (parcelRequire5707), а таблица чанков — это объект, а не массив
Metro (React Native)н/дн/дпоставляет один бандл, без чанков; определяется по __METRO_GLOBAL_PREFIX__
webpack Module Federationдадапостроитель не несёт карту id, поэтому id берутся из мест вызова __webpack_require__.e(480)

Область действия

jshound запрашивает указанную вами цель и JavaScript-файлы, которые загружают страницы этой цели, где бы они ни размещались. Для supabase это в основном frontend-assets.supabase.com. Это публичные статические файлы, которые скачивает браузер любого посетителя. Эти другие хосты не получают ничего, кроме этих GET-запросов.

Он отказывается от любого URL, который цель указывает в частном адресном пространстве (loopback, RFC1918, link local), если только указанная вами цель сама не является частной или вы не передали --allow-private.

Опции

-o DIRкуда попадают результаты (по умолчанию .jshound/<host>)
-qне выводить каждый запрос по мере его выполнения
-vтакже выводить журнал анализа
--max-chunks Nостановиться после такого количества ленивых чанков и импортов (по умолчанию 50000)
--no-chunksне следовать за ленивыми чанками
--proxy URLотправлять каждый запрос через прокси (или задать JSHOUND_PROXY)
--proxy-ca FILEсертификат CA прокси, перехватывающего TLS
--client PROFILEзакрепить один TLS-профиль браузера вместо ротации при блокировке
--allow-privateразрешить URL в частном адресном пространстве (см. Область действия)

Ограничения

Скачать инструмент