
أداة اكتشاف محتوى الويب وواجهات برمجة التطبيقات عالية السرعة التي تخترق المسارات باستخدام مجموعات بيانات Swagger المجمعة، وتدعم المسح العميق، وقوائم الكلمات المخصصة، والمسح المتزامن للمضيفين.

لأطول فترة، كان اكتشاف المحتوى يركز على إيجاد الملفات والمجلدات. بينما هذا الأسلوب فعال لخوادم الويب القديمة التي تستضيف ملفات ثابتة أو تستجيب بـ 3xx عند مسار جزئي، لم يعد فعالاً للتطبيقات الحديثة، خاصة واجهات برمجة التطبيقات (APIs).
مع الوقت، شهدنا استثمار الكثير من الوقت في جعل أدوات اكتشاف المحتوى أسرع لاستخدام قوائم كلمات أكبر، لكن فن اكتشاف المحتوى لم يشهد ابتكاراً جديداً.
Kiterunner هي أداة قادرة ليس فقط على أداء اكتشاف المحتوى التقليدي بسرعات فائقة، بل أيضاً على تخمين المسارات/النقاط النهائية في التطبيقات الحديثة.
أطر العمل الحديثة مثل Flask وRails وExpress وDjango وغيرها تتبع نموذج تعريف المسارات بشكل صريح والتي تتوقع طرق HTTP معينة، ورؤوس، ومعاملات، وقيم.
عند استخدام أدوات اكتشاف المحتوى التقليدية، غالباً ما تفوت هذه المسارات ولا يمكن اكتشافها بسهولة.
من خلال تجميع مجموعة من مواصفات Swagger وتكثيفها في مخططنا الخاص، يمكن لـ Kiterunner استخدام هذه المجموعة لتخمين نقاط نهاية API عن طريق إرسال طريقة HTTP الصحيحة، والرؤوس، والمسار، والمعاملات، والقيم لكل طلب ترسله.
تم جمع ملفات Swagger من عدة مصادر بيانات، بما في ذلك مسح واسع للإنترنت لأكثر من 40 مساراً شائعاً لـ Swagger. شملت المصادر الأخرى GitHub عبر BigQuery، وAPIs.guru.
يمكنك تنزيل نسخة مبنية مسبقاً من https://github.com/assetnote/kiterunner/releases.
make build
ln -s $(pwd)/dist/kr /usr/local/bin/kr
kr kb compile routes.json routes.kite
kr scan hosts.txt -w routes.kite -x 20 -j 100 --ignore-length=1053
يمكن العثور على مجموعات بيانات JSON أدناه:
- [routes-large.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-large.json.tar.gz) (118MB مضغوط، 2.6GB بعد فك الضغط)
- [routes-small.json](https://wordlists-cdn.assetnote.io/rawdata/kiterunner/routes-small.json.tar.gz) (14MB مضغوط، 228MB بعد فك الضغط)
بدلاً من ذلك، من الممكن تنزيل ملفات `.kite` المترجمة من الروابط أدناه:
- [routes-large.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-large.kite.tar.gz) (40MB مضغوط، 183M بعد فك الضغط)
- [routes-small.kite](https://wordlists-cdn.assetnote.io/data/kiterunner/routes-small.kite.tar.gz) (2MB مضغوط، 35MB بعد فك الضغط)
## AUR
يمكن للمستخدمين الذين يستخدمون توزيعة قائمة على Arch تنزيل الثنائي المبني مسبقًا من [AUR](https://aur.archlinux.org/packages/kiterunner-bin/)
يمكنك استخدام "مساعد AUR" مثل `yay` لتثبيت kiterunner```
yay -S kiterunner-bin
kr [scan|brute] [flags]
- `<input>` يمكن أن يكون ملفًا، أو نطاقًا، أو URI. سنقوم بمعالجته لك. راجع [تنسيق الإدخال/المضيف](#inputhost-formatting) لمزيد من التفاصيل```
# Just have a list of hosts and no wordlist
kr scan hosts.txt -A=apiroutes-210328:20000 -x 5 -j 100 --fail-status-codes 400,401,404,403,501,502,426,411
# You have your own wordlist but you want assetnote wordlists too
kr scan target.com -w routes.kite -A=apiroutes-210328:20000 -x 20 -j 1 --fail-status-codes 400,401,404,403,501,502,426,411
# Bruteforce like normal but with the first 20000 words
kr brute https://target.com/subapp/ -A=aspx-210328:20000 -x 20 -j 1
# Use a dirsearch style wordlist with %EXT%
kr brute https://target.com/subapp/ -w dirsearch.txt -x 20 -j 1 -exml,asp,aspx,ashx -D
Usage: kite scan [flags]
Flags: -A, --assetnote-wordlist strings use the wordlists from wordlist.assetnote.io. specify the type/name to use, e.g. apiroutes-210228. You can specify an additional maxlength to use only the first N values in the wordlist, e.g. apiroutes-210228;20000 will only use the first 20000 lines in that wordlist --blacklist-domain strings domains that are blacklisted for redirects. We will not follow redirects to these domains --delay duration delay to place inbetween requests to a single host --disable-precheck whether to skip host discovery --fail-status-codes ints which status codes blacklist as fail. if this is set, this will override success-status-codes --filter-api strings only scan apis matching this ksuid --force-method string whether to ignore the methods specified in the ogl file and force this method -H, --header strings headers to add to requests (default [x-forwarded-for: 127.0.0.1]) -h, --help help for scan --ignore-length strings a range of content length bytes to ignore. you can have multiple. e.g. 100-105 or 1234 or 123,34-53. This is inclusive on both ends --kitebuilder-full-scan perform a full scan without first performing a phase scan. -w, --kitebuilder-list strings ogl wordlist to use for scanning -x, --max-connection-per-host int max connections to a single host (default 3) -j, --max-parallel-hosts int max number of concurrent hosts to scan at once (default 50) --max-redirects int maximum number of redirects to follow (default 3) -d, --preflight-depth int when performing preflight checks, what directory depth do we attempt to check. 0 means that only the docroot is checked (default 1) --profile-name string name for profile output file --progress a progress bar while scanning. by default enabled only on Stderr (default true) --quarantine-threshold int if the host return N consecutive hits, we quarantine the host as wildcard. Set to 0 to disable (default 10) --success-status-codes ints which status codes whitelist as success. this is the default mode -t, --timeout duration timeout to use on all requests (default 3s) --user-agent string user agent to use for requests (default "Chrome. Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.96 Safari/537.36") --wildcard-detection can be set to false to disable wildcard redirect detection (default true)
Global Flags: --config string config file (default is $HOME/.kiterunner.yaml) -o, --output string output format. can be json,text,pretty (default "pretty") -q, --quiet quiet mode. will mute unecessarry pretty text -v, --verbose string level of logging verbosity. can be error,info,debug,trace (default "info")
bruteforce flags (جميع العلامات المذكورة أعلاه +)```
-D, --dirsearch-compat this will replace %EXT% with the extensions provided. backwards compat with dirsearch because shubs loves him some dirsearch
-e, --extensions strings extensions to append while scanning
-w, --wordlist strings normal wordlist to use for scanning
عند توفير إدخال، سيحاول kiterunner حل الإدخال بالترتيب التالي:
إذا قمت بتوفير 'مجال'، ولكنه موجود كملف، على سبيل المثال google.com ولكن google.com هو أيضًا ملف txt في الدليل الحالي، فسنقوم بتحميل google.com ملف النص، لأننا وجدناه أولاً.
تحليل المجال
يُفضل أن تقدم URI كامل كإدخال، ومع ذلك يمكنك تقديم URIs غير مكتملة وسنحاول تخمين ما تقصده. فيما يلي قائمة أمثلة على المجالات التي يمكنك تقديمها:``` one.com two.com:80 three.com:443 four.com:9447 https://five.com:9090 http://six.com:80/api
القائمة أعلاه من النطاقات ستتوسع إلى القائمة التالية من الأهداف```
(two targets are created for one.com, since neither port nor protocol was specified)
http://one.com (port 80 implied)
https://one.com (port 443 implied)
http://two.com (port 80 implied)
https://three.com (port 443 implied)
http://four.com:9447 (non-tls port guessed)
https://five.com:9090
http://six.com/api (port 80 implied; basepath API appended)
القواعد التي نطبقها هي:
عندما يكون لديك هدف واحد```bash
kr scan https://target.com:8443/ -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr scan target.com -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr scan targets.txt -w routes.kite -A=apiroutes-210228:20000 -x 10 --ignore-length=34
## القوة العمياء العادية```bash
kr brute https://target.com -A=raft-large-words -A=apiroutes-210228:20000 -x 10 -d=0 --ignore-length=34 -ejson,txt
عندما يكون لديك wordlist قديمة لا تزال تحتوي على %EXT% في القائمة، يمكنك استخدام -D. وهذا سيستبدل الامتداد فقط حيثما يكون %EXT% موجودًا في المسار```bash
kr brute https://target.com -w dirsearch.txt -x 10 -d=0 --ignore-length=34 -ejson,txt -D
# الميزات التقنية
## الفحص العميق
من الميزات الرئيسية لـ kiterunner هو الفحص القائم على العمق. يحاول هذا التعامل مع اكتشاف أحرف البدل نظرًا للتوجيه القائم على مسار التطبيق الافتراضي. يحدد العمق عدد مستويات الدليل التي يتم إجراء الفحوصات الأساسية فيها على سبيل المثال.```bash
~/kiterunner $ cat wordlist.txt
/api/v1/user/create
/api/v1/user/delete
/api/v2/user/
/api/v2/admin/
/secrets/v1/
/secrets/v2/
/ فقط الفحوصات الأساسية التي يتم إجراؤها للكشف عن أحرف البدل/api و /secrets فحوصات أساسية يتم إجراؤها؛ وسيتم استخدام هذه الفحوصات مقابل /api و /secrets على التوالي/api/v1 و /api/v2 و /secrets/v1 و /secrets/v2 فحوصات أساسية يتم إجراؤها.بشكل افتراضي، يكون لـ kr scan عمق 1، لأننا من الاستخدام الداخلي، غالبًا ما رأينا هذا على أنه العمق الأكثر شيوعًا حيث يحدث التوجيه الافتراضي. بينما kr brute له عمق افتراضي 0، لأنك عادةً لا تريد إجراء هذا الفحص باستخدام قائمة كلمات ثابتة.
بطبيعة الحال، زيادة العمق ستزيد من دقة عمليات الفحص، ولكن هذا أيضًا يزيد من عدد الطلبات إلى الهدف. (# من الفحوصات الأساسية * # من أدلة العمق الأساسية). ومن هنا، نوصي بعدم تجاوز 1، وفي حالات نادرة الوصول إلى العمق 2.
نوفر تنزيلًا وتخزينًا مؤقتًا مدمجًا لقوائم الكلمات من assetnote.io. يمكنك استخدامها مع العلامة -A التي تستقبل قائمة مفصولة بفواصل من الأسماء المستعارة أو الأسماء الكاملة.
يمكنك الحصول على قائمة كاملة بجميع قوائم كلمات Assetnote باستخدام kr wordlist list.
عند استخدام قوائم الكلمات، يتم تخزينها مؤقتًا في ~/.cache/kiterunner/wordlists. عند استخدامها، يتم تجميعها من .txt إلى .kite.```
+-----------------------------------+-------------------------------------------------------+----------------+---------+----------+--------+
| ALIAS | FILENAME | SOURCE | COUNT | FILESIZE | CACHED |
+-----------------------------------+-------------------------------------------------------+----------------+---------+----------+--------+
| 2m-subdomains | 2m-subdomains.txt | manual.json | 2167059 | 28.0mb | false |
| asp_lowercase | asp_lowercase.txt | manual.json | 24074 | 1.1mb | false |
| aspx_lowercase | aspx_lowercase.txt | manual.json | 80293 | 4.4mb | false |
| bak | bak.txt | manual.json | 31725 | 634.8kb | false |
| best-dns-wordlist | best-dns-wordlist.txt | manual.json | 9996122 | 139.0mb | false |
| cfm | cfm.txt | manual.json | 12100 | 260.3kb | true |
| do | do.txt | manual.json | 173152 | 4.8mb | false |
| dot_filenames | dot_filenames.txt | manual.json | 3191712 | 71.3mb | false |
| html | html.txt | manual.json | 4227526 | 107.7mb | false |
| apiroutes-201120 | httparchive_apiroutes_2020_11_20.txt | automated.json | 953011 | 45.3mb | false |
| apiroutes-210128 | httparchive_apiroutes_2021_01_28.txt | automated.json | 225456 | 6.6mb | false |
| apiroutes-210228 | httparchive_apiroutes_2021_02_28.txt | automated.json | 223544 | 6.5mb | true |
| apiroutes-210328 | httparchive_apiroutes_2021_03_28.txt | automated.json | 215114 | 6.3mb | false |
| aspx-201118 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2020_11_18.txt | automated.json | 63200 | 1.7mb | false |
| aspx-210128 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_01_28.txt | automated.json | 46286 | 928.7kb | false |
| aspx-210228 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_02_28.txt | automated.json | 43958 | 883.3kb | false |
| aspx-210328 | httparchive_aspx_asp_cfm_svc_ashx_asmx_2021_03_28.txt | automated.json | 45928 | 926.8kb | false |
| cgi-201118 | httparchive_cgi_pl_2020_11_18.txt | automated.json | 2637 | 44.0kb | false |
عند استخدام قوائم الكلمات المقدمة من assetnote، قد لا ترغب في استخدام القائمة بأكملها، لذا يمكنك اختيار استخدام أول N سطر في قائمة كلمات معينة باستخدام صيغة head. الصيغة هي <wordlist_name>:<N lines> عند تحديد قائمة كلمات.
الاستخدام```
kr scan targets.txt -A=apiroutes-210228:20000 -x 10 --ignore-length=34
kr brute targets.txt -A=aspx-210228:10 -x 10 --ignore-length=34 -easp,aspx
## إعدادات التزامن/العمل بسرعة
تم تصميم Kiterunner ليعمل بسرعة على عدد كبير من المضيفين. ولكن، مجرد قدرتك على تشغيل kiterunner بـ 20000 غوروتين (goroutine) لا يعني أنها فكرة جيدة. سيحدث اختناق وتدهور في الأداء عند أعداد الخيوط العالية بسبب زيادة الوقت المستغرق في جدولة الغوروتينات التي تنتظر إدخال/إخراج الشبكة وتبديل السياق في النواة.
هناك إعدادان رئيسيان للتزامن في kiterunner:
- `-x, --max-connection-per-host` - أقصى عدد من الاتصالات المفتوحة التي يمكننا الحصول عليها على مضيف. يحكمه غوروتين واحد لكل اتصال. لتجنب هجوم رفض الخدمة (DOS) على مضيف، نوصي بإبقاء هذا الرقم منخفضًا في نطاق 5-10. اعتمادًا على زمن الوصول إلى الهدف، سينتج عن هذا في المتوسط ما بين 1-5 طلبات في الثانية لكل اتصال (200ms - 1000ms/req) لمضيف.
- `-j, --max-parallel-hosts` - أقصى عدد من المضيفين يمكن فحصهم في أي وقت. يحكمه مشرف غوروتين واحد لكل منهم.
اعتمادًا على الأجهزة التي تفحص منها، سيختلف العدد "الأقصى" للغوروتينات التي يمكنك تشغيلها بشكل أمثل. على مثيل AWS t3.medium، لاحظنا تدهورًا في الأداء عند تجاوز 2500 غوروتين. أي أن 500 مضيف × 5 اتصالات لكل مضيف (2500) سيعطي أداءً ذرويًا.
نوصي **بعدم** تشغيل kiterunner من جهاز **macbook** الخاص بك. نظرًا لضعف تحسينات النواة لأعداد الإدخال/الإخراج العالية واستدعاءات النظام Epoll على macOS، لاحظنا أداءً أضعف بشكل ملحوظ (0.3-0.5x) مقارنة بتشغيل kiterunner على مثيل linux مهيأ بشكل مماثل.
لتعظيم الأداء عند فحص هدف فردي، أو سطح هجوم كبير، نوصي بالنصائح التالية:
- قم بتشغيل مثيل EC2 في منطقة جغرافية/مركز بيانات مشابه للأهداف التي تفحصها
- قم بإجراء بعض الاختبارات الأولية مقابل مجموعة أهدافك باستخدام خيارات `-x` و `-j` المختلفة. نوصي ببدء نموذجي من حوالي `-x 5 -j 100` ثم زيادة `-j` لأعلى مع سماح استخدام وحدة المعالجة المركزية/أداء الشبكة بذلك.
## التحويل بين تنسيقات الملفات
سيسمح لك Kiterunner أيضًا بالتحويل بين JSON المخطط، ملف kite وقائمة كلمات txt قياسية.
**الاستخدام**
يتم تحديد التنسيق من خلال امتداد نوع الملف المقدم من حقلي `<input>` و `<output>`. نحن ندعم `txt` و `json` و `kite````bash
kr kb convert wordlist.txt wordlist.kite
kr kb convert wordlist.kite wordlist.json
kr kb convert wordlist.kite wordlist.txt
❯ go run ./cmd/kiterunner kb convert -qh
convert an input file format into the specified output file format
this will determine the conversion based on the extensions of the input and the output
we support the following filetypes: txt, json, kite
You can convert any of the following into the corresponding types
-d Debug mode will attempt to convert the schema with error handling
-v=debug Debug verbosity will print out the errors for the schema
Usage:
kite kb convert <input> <output> [flags]
Flags:
-d, --debug debug the parsing
-h, --help help for convert
Global Flags:
--config string config file (default is $HOME/.kiterunner.yaml)
-o, --output string output format. can be json,text,pretty (default "pretty")
-q, --quiet quiet mode. will mute unecessarry pretty text
-v, --verbose string level of logging verbosity. can be error,info,debug,trace (default "info")``bigquery
عندما تتلقى مجموعة من المخرجات من kiterunner، قد يكون من الصعب فهم سبب تسبب طلب معين في رمز/طول استجابة محدد. تقدم kiterunner طريقة لإعادة بناء الطلب من قوائم الكلمات المستخدمة بما في ذلك جميع معاملات الرأس والنص.
kb replay.--proxy لتوجيه طلباتك من خلاله، بحيث يمكنك تعديل/تكرار/اعتراض الطلب باستخدام أدوات طرف ثالث إذا أردت.11:25AM INF Outbound request POST /dedalo/lib/dedalo/publication/server_api/v1/json/thesaurus_parents?ar_fields=48637466&code=66132381&db_name=08791392&lang=lg-eng&recursive=false&term_id=72336471 HTTP/1.1 Host: target.com User-Agent: Go-http-client/1.1 Content-Length: 0 Content-Type: any Accept-Encoding: gzip
11:25AM INF Response After Redirects HTTP/1.1 403 Forbidden Connection: close Content-Length: 45 Content-Type: application/json Date: Wed, 07 Apr 2021 01:25:28 GMT X-Amzn-Requestid: 7e6b2ea1-c662-4671-9eaa-e8cd31b463f2
User is not authorized to perform this action
## التنفيذ التقني
### نوع البيانات الوسيط (PRoutes)
نستخدم تمثيلاً وسيطاً لقوائم الكلمات (wordlists) ومخططات json الخاصة بـ kitebuilder في kiterunner. وهذا يسمح لنا بتوليد الحقول في قائمة الكلمات ديناميكياً وإعادة بناء أجسام الطلبات (bodies) والرؤوس (headers) ومُعاملات الاستعلام (query parameters) وفقاً لمواصفات محددة.
يتكون نوع PRoute من مُعاملات Headers وBody وQuery وCookie المُشفرة في `pkg/proute.Crumb`. نوع Crumb هو واجهة (interface) يتم تنفيذها على أنواع مثل UUIDs وFloats وInts وRandom Strings وغيرها.
عند إجراء التحويلات من وإلى ملفات txt وjson وkite، يتم أولاً إجراء جميع التحويلات إلى النوع الوسيط `pkg/proute.API`. ثم يتم كتابة الترميز المقابل.
## تنسيق ملف Kite
نستخدم تنسيق ملف kite فائق السرية لتخزين مخططات json من kitebuilder. وهي ببساطة ملفات `pkg/proute.APIS` مشفرة بـ protobuf ومكتوبة في ملف. يتم استخدام التجميع للسماح لنا بإلغاء تسلسل قائمة الكلمات التي تم تحليلها بسرعة. هذا التنسيق غير مستقر، ويجب التفاعل معه فقط باستخدام أدوات التحويل المدمجة في kiterunner.
عند إصدار إصدار جديد من تنسيق ملف kite، قد تحتاج إلى إعادة تجميع ملفات kite الخاصة بك.