Skip to content
KitploitKITPLOIT
ToolsExploitsBlog
Log in
Einreichen
ToolsExploitsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

FeedsKontaktDatenschutz© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
jshound — Finde jede API-Anfrage, die eine Web-App stellt, anhand des von ihr ausgelieferten JavaScripts: Methode, URL, Body, Header und GraphQL-Operationen. Ein Befehl. | Kitploit
Tools/GitHubGitHub/ambitsecurity/jshound
AufklärungStatische AnalyseSchwachstellenanalyseInformationsbeschaffungWebsicherheitPenetrationstestsCrawlerAPI-Sicherheit
GitHubambitsecurity/jshound

jshound

Finde jede API-Anfrage, die eine Web-App stellt, anhand des von ihr ausgelieferten JavaScripts: Methode, URL, Body, Header und GraphQL-Operationen. Ein Befehl.

Repository anzeigen
325vor 4 TagenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

jshound

Jede Anfrage, die eine Web-App zu stellen programmiert ist, aus dem von ihr ausgelieferten JavaScript rekonstruieren: Methode, URL, Body, Content-Type und Header.

jshound liest supabase.com/dashboard: 2.282 Dateien eingelesen, 387 Anfragen ausgegeben, jede mit ihrem Body

Das JavaScript-Bundle einer Single-Page-App enthält jede API-Anfrage, die die App stellen kann. Ausgehend von einer URL findet jshound das Bundle der App, durchsucht es vollständig, einschließlich lazy geladener Chunks, und extrahiert diese Anfragen.

Es ist passiv. Die einzigen Anfragen, die es stellt, sind unauthentifizierte GETs für öffentliche statische Dateien, die Seite und ihr JavaScript. Die Analyse läuft lokal ab, und nichts wird an die API der App gesendet.

Installation

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

Benötigt Python 3.10 oder neuer und Node 18 oder neuer.

Verwendung

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)
  • Es hat die Seite und jedes Skript geladen, das die Seite lädt, einschließlich der 2.281 Dateien auf frontend-assets.supabase.com, wo der Build von supabase liegt.
  • Es hat die lazy geladenen Chunks und Imports in diesen Dateien gefunden, sie geladen und dies wiederholt, bis keine neuen Dateien mehr auftauchten.
  • Es hat jede Anfrage im Code gelesen, eine pro Zeile:
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"}

Mehrere Ziele gleichzeitig, oder eine Liste über stdin:

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

Dateien, die bereits auf der Festplatte liegen, etwa der js/-Ordner eines vorherigen Durchlaufs, werden gelesen, ohne das Netzwerk zu berühren:

$ 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

Was gespeichert wird

Alles landet in .jshound/<host>/, oder in -o DIR:

endpoints.txtdie obige Tabelle, eine Anfrage pro Zeile
requests.jsonlein JSON-Objekt pro Anfrage: method, url, body, content_type, headers, graphql oder rpc, sowie die Seite und die Datei, aus der sie stammt
urls.txtMETHOD URL für die Anfragen, deren Host bekannt ist, für Tools, die eine Liste entgegennehmen
openapi.jsonein OpenAPI-3-Dokument, zum Importieren in Burp, Caido oder Postman
js/jede Datei, die geladen wurde

Die Ausgabe lesen

  • {...} ist ein Wert, den jshound nicht auflösen konnte, geschrieben so, wie der Code ihn schreibt: {baseUrl}, {window.__CONFIG__.apiBaseUrl}. In einem Pfad ist {ref} ein Parameter, und {param_o} ist der Funktionsparameter o.
  • Ein Pfad ohne Host, wie /api/surveys/, durchläuft Code, dem jshound noch nicht bis zu seiner Basis folgt. requests.jsonl nennt die Datei, aus der er stammt.
  • Body-Werte geben an, woher der Wert jedes Feldes stammt: input: ein Argument, state: eine Eigenschaft eines Objekts, computed: das Ergebnis eines Aufrufs, ? unbekannt.
  • application/json? ist ein Content-Type, der aus den übrigen Anfragen der Datei abgeleitet wurde, statt an der Aufrufstelle gelesen zu werden. ~{...} ist ein Body, der mehr Felder hat als die aufgeführten.
  • {graphql} ist eine GraphQL-Operation, mit ihrem Namen, Typ und ihren Variablen als Body.

Wie es funktioniert

Sammeln, parsen, verfolgen, schreiben: eine Anfrage, verfolgt von einem Config-Modul über einen axios-Client bis zu ihrer Aufrufstelle

Bundler, die es verarbeitet

bundlerlazy chunk URLsmodule treehow
webpack 5jajaliest __webpack_require__.u aus dem Syntaxbaum
webpack 4jajahat kein .u, daher wird der benannte URL-Builder über seine Form statt über seinen Namen erkannt
Rspackjajawebpack-kompatibel, gibt üblicherweise ESM aus
Turbopackjan/aüberhaupt kein Builder; die Chunk-Liste ist ein literales Array
Vite / Rollupjan/aPfade werden niedergeschrieben (__vite__mapDeps); flaches ESM hat keine Registry zum Durchlaufen
esbuildjan/adasselbe
Parceljan/adie Runtime-Globalvariable erhält pro Build ein Suffix (parcelRequire5707) und die Chunk-Tabelle ist ein Objekt, kein Array
Metro (React Native)n/an/aliefert ein einziges Bundle, keine Chunks; erkannt an __METRO_GLOBAL_PREFIX__
webpack Module Federationjajader Builder trägt keine ID-Map, daher werden IDs aus den Aufrufstellen von __webpack_require__.e(480) entnommen

Geltungsbereich

jshound ruft das Ziel auf, das Sie ihm geben, und die JavaScript-Dateien, die die Seiten dieses Ziels laden, wo auch immer sie gehostet werden. Bei supabase ist das größtenteils frontend-assets.supabase.com. Dies sind öffentliche statische Dateien, die der Browser jedes Besuchers herunterlädt. Diese anderen Hosts bekommen nichts außer diesen GETs.

Es lehnt jede URL ab, die ein Ziel im privaten Adressraum nennt (Loopback, RFC1918, Link-Local), es sei denn, das Ziel, das Sie ihm gegeben haben, ist selbst privat oder Sie übergeben --allow-private.

Optionen

-o DIRwohin die Ergebnisse gehen (Standard .jshound/<host>)
-qjede Anfrage nicht ausgeben, während sie gestellt wird
-vzusätzlich das Analyse-Log ausgeben
--max-chunks Nnach dieser Anzahl von lazy Chunks und Imports abbrechen (Standard 50000)
--no-chunkslazy Chunks nicht verfolgen
--proxy URLjede Anfrage über einen Proxy senden (oder JSHOUND_PROXY setzen)
--proxy-ca FILEdas CA-Zertifikat eines Proxys, der TLS abfängt
--client PROFILEein einzelnes Browser-TLS-Profil festlegen, statt bei Blockierung zu rotieren
--allow-privateURLs im privaten Adressraum erlauben (siehe Geltungsbereich)

Einschränkungen

Tool herunterladen