Skip to content
KitploitKITPLOIT
OutilsExploitsBlog
Log in
Soumettre
OutilsExploitsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

FluxContactConfidentialité© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
jshound — Trouvez chaque requête API effectuée par une application web, à partir du JavaScript qu'elle livre : méthode, URL, corps, en-têtes et opérations GraphQL. Une seule commande. | Kitploit
Outils/GitHubGitHub/ambitsecurity/jshound
ReconnaissanceAnalyse StatiqueAnalyse des VulnérabilitésCollecte d'InformationsSécurité WebTests d'IntrusionCrawlerSécurité des API
GitHubambitsecurity/jshound

jshound

Trouvez chaque requête API effectuée par une application web, à partir du JavaScript qu'elle livre : méthode, URL, corps, en-têtes et opérations GraphQL. Une seule commande.

Voir le dépôt
327il y a 4 joursPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

jshound

Récupérez chaque requête qu'une application web est conçue pour émettre à partir du JavaScript qu'elle livre : méthode, URL, corps, type de contenu et en-têtes.

jshound lisant supabase.com/dashboard : 2 282 fichiers analysés, 387 requêtes extraites, chacune avec son corps

Le bundle JavaScript d'une application monopage contient chaque requête API que l'application peut émettre. À partir d'une URL, jshound trouve le bundle de l'application, le parcourt entièrement, y compris les chunks chargés paresseusement, et extrait ces requêtes.

Il est passif. Les seules requêtes qu'il émet sont des GET non authentifiés pour des fichiers statiques publics, la page et son JavaScript. L'analyse s'exécute localement, et rien n'est envoyé à l'API de l'application.

Installation

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

Nécessite Python 3.10 ou plus récent et Node 18 ou plus récent.

Utilisation

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)
  • Il a récupéré la page et chaque script chargé par la page, y compris les 2 281 fichiers sur frontend-assets.supabase.com, où réside le build de supabase.
  • Il a trouvé les chunks chargés paresseusement et les imports dans ces fichiers, les a récupérés, et a répété jusqu'à ce qu'aucun nouveau fichier n'apparaisse.
  • Il a lu chaque requête dans le code, une par ligne :
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"}

Plusieurs cibles à la fois, ou une liste sur stdin :

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

Les fichiers déjà présents sur le disque, comme le dossier js/ d'une exécution précédente, sont lus sans toucher au réseau :

$ 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

Ce qui est sauvegardé

Tout va dans .jshound/<host>/, ou dans -o DIR :

endpoints.txtle tableau ci-dessus, une requête par ligne
requests.jsonlun objet JSON par requête : method, url, body, content_type, headers, graphql ou rpc, et la page et le fichier d'où elle provient
urls.txtMETHOD URL pour les requêtes dont l'hôte est connu, pour les outils qui prennent une liste
openapi.jsonun document OpenAPI 3, à importer dans Burp, Caido ou Postman
js/chaque fichier qui a été récupéré

Lire la sortie

  • {...} est une valeur que jshound n'a pas pu résoudre, écrite telle que le code l'écrit : {baseUrl}, {window.__CONFIG__.apiBaseUrl}. Dans un chemin, {ref} est un paramètre, et {param_o} est le paramètre de fonction o.
  • Un chemin sans hôte, comme /api/surveys/, passe par du code que jshound ne suit pas encore jusqu'à sa base. requests.jsonl nomme le fichier d'où il provient.
  • Les valeurs de corps indiquent d'où vient la valeur de chaque champ : input: un argument, state: une propriété d'un objet, computed: le résultat d'un appel, ? inconnu.
  • application/json? est un type de contenu déduit des autres requêtes du fichier plutôt que lu au site d'appel. ~{...} est un corps qui a plus de champs que ceux listés.
  • {graphql} est une opération GraphQL, avec son nom, son type et ses variables comme corps.

Comment ça marche

Collecter, analyser, tracer, écrire : une requête tracée depuis un module de configuration, à travers un client axios, jusqu'à son site d'appel

Bundlers pris en charge

bundlerURLs de chunks paresseuxarbre de modulescomment
webpack 5ouiouilit __webpack_require__.u depuis l'arbre syntaxique
webpack 4ouiouin'a pas de .u, donc le constructeur d'URL nommé est mis en correspondance par forme plutôt que par nom
Rspackouiouicompatible webpack, émettant généralement de l'ESM
Turbopackouin/aaucun constructeur du tout ; la liste des chunks est un tableau littéral
Vite / Rollupouin/ales chemins sont écrits en dur (__vite__mapDeps) ; l'ESM plat n'a pas de registre à parcourir
esbuildouin/aidem
Parcelouin/ale global du runtime est suffixé par build (parcelRequire5707) et la table des chunks est un objet, pas un tableau
Metro (React Native)n/an/alivre un seul bundle, pas de chunks ; détecté par __METRO_GLOBAL_PREFIX__
webpack Module Federationouiouile constructeur ne porte pas de table d'ids, donc les ids sont pris depuis les sites d'appel __webpack_require__.e(480)

Périmètre

jshound requête la cible que vous lui donnez, et les fichiers JavaScript que les pages de cette cible chargent, où qu'ils soient hébergés. Pour supabase, il s'agit principalement de frontend-assets.supabase.com. Ce sont des fichiers statiques publics que le navigateur de n'importe quel visiteur télécharge. Ces autres hôtes ne reçoivent rien d'autre que ces GET.

Il refuse toute URL qu'une cible nomme dans l'espace d'adressage privé (loopback, RFC1918, link local), sauf si la cible que vous lui avez donnée est elle-même privée ou si vous passez --allow-private.

Options

-o DIRoù vont les résultats (par défaut .jshound/<host>)
-qne pas afficher chaque requête au fur et à mesure
-vafficher aussi le journal d'analyse
--max-chunks Ns'arrêter après ce nombre de chunks paresseux et d'imports (par défaut 50000)
--no-chunksne pas suivre les chunks paresseux
--proxy URLenvoyer chaque requête via un proxy (ou définir JSHOUND_PROXY)
--proxy-ca FILEle certificat CA d'un proxy qui intercepte le TLS
--client PROFILEépingler un profil TLS de navigateur au lieu d'alterner en cas de blocage
--allow-privateautoriser les URLs dans l'espace d'adressage privé (voir Périmètre)

Limitations

Télécharger l’outil