Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
jshound — اعثر على كل طلب API يقوم به تطبيق ويب، من خلال JavaScript الذي يرسله: الطريقة، وعنوان URL، والجسم، والترويسات، وعمليات GraphQL. أمر واحد. | Kitploit
أدوات/GitHubGitHub/ambitsecurity/jshound
الاستطلاعالتحليل الثابتتحليل الثغرات الأمنيةجمع المعلوماتأمن الويباختبار الاختراقزاحف الويبأمن واجهات برمجة التطبيقات
GitHubambitsecurity/jshound

jshound

اعثر على كل طلب API يقوم به تطبيق ويب، من خلال JavaScript الذي يرسله: الطريقة، وعنوان URL، والجسم، والترويسات، وعمليات GraphQL. أمر واحد.

عرض المستودع
325منذ 4 أياملم تتم المراجعة بعد

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

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، إلى موضع استدعائه

أدوات التجميع التي يتعامل معها

bundlerعناوين URL للقطع المحمّلة بتأخيرشجرة الوحداتكيف
webpack 5نعمنعميقرأ __webpack_require__.u من شجرة الصياغة
webpack 4نعمنعمليس لديه .u، لذا يُطابَق باني العنوان المسمّى بالشكل بدلًا من الاسم
Rspackنعمنعممتوافق مع webpack، ويصدر عادةً ESM
Turbopackنعمغير متاحلا يوجد باني على الإطلاق؛ قائمة القطع مصفوفة حرفية
Vite / Rollupنعمغير متاحالمسارات مكتوبة (__vite__mapDeps)؛ ESM المسطح ليس لديه سجل للتنقل فيه
esbuildنعمغير متاحنفسه
Parcelنعمغير متاحالعام العالمي للوقت التشغيلي ملحق لكل بناء (parcelRequire5707) وجدول القطع كائن، وليس مصفوفة
Metro (React Native)غير متاحغير متاحيوزع حزمة واحدة، بلا قطع؛ يُكتشف بواسطة __METRO_GLOBAL_PREFIX__
webpack Module Federationنعمنعمالباني لا يحمل خريطة معرّفات، لذا تُؤخذ المعرّفات من مواضع استدعاء __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 في مساحة عنوان خاصة (انظر النطاق)

القيود

  • تُقرأ الطلبات من الشيفرة، ولا تُختبر. قد يكون الطلب في الحزمة ومع ذلك يكون قد أُزيل من الخادم، أو خلف علامة ميزة، أو مقصورًا على المشرفين. يخبرك jshound بما يمكن للعميل إرساله، لا بما يقبله الخادم.
  • الشيفرة التي تُحمّل فقط بعد تسجيل الدخول لا تُوجد. إذا نزّل تطبيق صفحات الفوترة فقط بعد تسجيل دخولك، فإن jshound، غير المسجَّل الدخول، لا يرى تلك الشيفرة أبدًا.
  • قد يحجبه WAF. إذا حصل الطلب الأول على صفحة تحدٍّ، مثل صفحة Cloudflare على سبيل المثال، يبلّغ التشغيل blocked by Cloudflare ولا يقرأ شيئًا. يحاكي jshound أحدث Chrome وFirefox وSafari التي يعرفها curl_cffi، لذا أبقِ curl_cffi محدّثًا. يساعد --proxy مع حدود المعدل وحظر IP، لا مع التحديات.
  • السكربتات المضافة في وقت التشغيل تُفوَّت. سكربت تُدرجه الصفحة بـ document.createElement("script")، باستخدام عنوان URL تحصل عليه من استدعاء API، ليس في أي شيء ينزّله jshound.

المساهمة

انظر CONTRIBUTING.md.

الترخيص

MIT.

تنزيل الأداة