Skip to content
KitploitKITPLOIT
ツールエクスプロイトブログ
Log in
提出
ツールエクスプロイトブログ
提出

ハッキング、侵入テスト、サイバーセキュリティツールをあなたのセキュリティアーセナルに!

Kitploitはハッキング、サイバーセキュリティ、ペネトレーションテストのツールディレクトリです。最新のプロジェクトアップデートを見つけて、脆弱性の発見、システム分析、テストの自動化、セキュリティの強化を行いましょう。

フィードお問い合わせプライバシー© 2026 Kitploit

ツールディレクトリ

カテゴリ

すべてのカテゴリを見る
Loading categories
jshound — Webアプリが送信するJavaScriptから、すべてのAPIリクエストを見つけ出します。メソッド、URL、ボディ、ヘッダー、GraphQLオペレーション。コマンド1つで。 | Kitploit
ツール/GitHubGitHub/ambitsecurity/jshound
偵察静的分析脆弱性分析情報収集ウェブセキュリティペネトレーションテストクローラーAPIセキュリティ
GitHubambitsecurity/jshound

jshound

Webアプリが送信するJavaScriptから、すべてのAPIリクエストを見つけ出します。メソッド、URL、ボディ、ヘッダー、GraphQLオペレーション。コマンド1つで。

リポジトリを見る
3254日前未レビュー

人気

すべて見る →

コミュニティで最も使われているツールを見つけましょう。

すべてのツールを探索

ツールコレクションを閲覧

すべてのツールを見る →
共有

jshound

Webアプリが送信するように作られたすべてのリクエストを、配信されるJavaScriptから復元します: メソッド、URL、ボディ、コンテンツタイプ、ヘッダー。

jshoundがsupabase.com/dashboardを読み取る: 2,282ファイルを処理し、387件のリクエストを出力、それぞれにボディ付き

シングルページアプリのJavaScriptバンドルには、そのアプリが送信しうるすべてのAPIリクエストが含まれています。URLを与えると、jshoundはアプリのバンドルを見つけ、遅延読み込みされるチャンクも含めてすべてをクロールし、それらのリクエストを抽出します。

これはパッシブです。送信するリクエストは、公開静的ファイル、ページ、およびそのJavaScriptに対する未認証のGETのみです。解析はローカルで実行され、アプリの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)
  • ページと、そのページが読み込むすべてのスクリプトを取得しました。これにはfrontend-assets.supabase.com上の2,281ファイルも含まれ、そこにsupabaseのビルドが存在します。
  • それらのファイル内で遅延読み込みされるチャンクとインポートを見つけ、取得し、新しいファイルが見つからなくなるまで繰り返しました。
  • コード内のすべてのリクエストを、1行に1つずつ読み取りました:
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上記の表、1行につき1リクエスト
requests.jsonl1リクエストにつき1つのJSONオブジェクト: method、url、body、content_type、headers、graphqlまたはrpc、およびそれが由来するページとファイル
urls.txtホストが判明しているリクエストのMETHOD URL、リストを受け取るツール向け
openapi.jsonOpenAPI 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クライアントを経て呼び出し箇所まで追跡される

対応するバンドラー

bundlerlazy chunk URLsmodule treehow
webpack 5yesyes構文木から__webpack_require__.uを読み取る
webpack 4yesyes.uを持たないため、名前付きURLビルダーは名前ではなく形状で照合される
Rspackyesyeswebpack互換で、通常はESMを出力する
Turbopackyesn/aビルダーがまったくなく、チャンクリストはリテラル配列
Vite / Rollupyesn/aパスは書き下される(__vite__mapDeps)。フラットなESMにはたどるレジストリがない
esbuildyesn/a同じ
Parcelyesn/aランタイムグローバルはビルドごとに接尾辞が付き(parcelRequire5707)、チャンクテーブルは配列ではなくオブジェクト
Metro (React Native)n/an/a単一のバンドルを配信し、チャンクはない。__METRO_GLOBAL_PREFIX__で検出
webpack Module Federationyesyesビルダーがidマップを持たないため、idは__webpack_require__.e(480)の呼び出し箇所から取得される

スコープ

jshoundは、指定されたターゲット、およびそのターゲットのページが読み込むJavaScriptファイルを、それらがどこでホストされていてもリクエストします。supabaseの場合、それは主にfrontend-assets.supabase.comです。これらは、どの訪問者のブラウザもダウンロードする公開静的ファイルです。それらの他のホストは、これらのGET以外には何も受け取りません。

ターゲットがプライベートアドレス空間(ループバック、RFC1918、リンクローカル)で指定したURLは拒否します。ただし、指定したターゲット自体がプライベートであるか、--allow-privateを渡した場合を除きます。

オプション

-o DIR結果の保存先(デフォルト.jshound/<host>)
-q各リクエストが送信されるたびに表示しない
-v解析ログも表示する
--max-chunks Nこの数の遅延チャンクとインポートの後に停止する(デフォルト50000)
--no-chunks遅延チャンクを追跡しない
--proxy URLすべてのリクエストをプロキシ経由で送信する(またはJSHOUND_PROXYを設定)
--proxy-ca FILETLSを傍受するプロキシのCA証明書
--client PROFILEブロックされたときにローテーションする代わりに、1つのブラウザTLSプロファイルに固定する
--allow-privateプライベートアドレス空間のURLを許可する(スコープを参照)

制限事項

  • リクエストはコードから読み取られるもので、テストされるものではありません。 リクエストがバンドルに含まれていても、サーバーからは削除されていたり、フィーチャーフラグの背後にあったり、管理者に限定されていたりする可能性があります。jshoundはクライアントが送信しうるものを示すのであり、サーバーが受け入れるものを示すのではありません。
  • サインイン後にのみ読み込まれるコードは見つかりません。 アプリがログイン後にのみ請求ページをダウンロードする場合、ログインしていないjshoundはそのコードを決して見ません。
  • WAFがブロックする可能性があります。 最初のリクエストがチャレンジページ、たとえばCloudflareのものを返す場合、実行はblocked by Cloudflareを報告し、何も読み取りません。jshoundはcurl_cffiが知る最新のChrome、Firefox、Safariを模倣するので、curl_cffiを最新に保ってください。--proxyはレート制限やIP禁止には役立ちますが、チャレンジには役立ちません。
  • 実行時に追加されるスクリプトは見逃されます。 ページがdocument.createElement("script")で挿入するスクリプトで、API呼び出しから得たURLを使用するものは、jshoundがダウンロードするどのファイルにも含まれていません。

コントリビューション

CONTRIBUTING.mdを参照してください。

ライセンス

MIT。

ツールをダウンロード