> For the complete documentation index, see [llms.txt](https://aufzayed.gitbook.io/web-security-tools/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://aufzayed.gitbook.io/web-security-tools/projectdiscovery-nuclei-usage-arabic.md).

# nuclei طريقة استخدام أداة

## مقدمة

أداة nuclei هى security scanner  بيعتمد على ال templates علشان يشتغل تقدر تستخدمها فى عملية فحص المواقع بأكثر من protocol زى ال HTTP, DNS, FILE, NETWORK او تستخدمها ك headless browser فى المقال دا هشرح أشهر البروتوكولات المستخدمة (HTTP, DNS) بالاضافة لل FILE  وال NETWORK

#### طريقة تثبيت الأداة:

`GO111MODULE=on go get -v github.com/projectdiscovery/nuclei/v2/cmd/nuclei​`

#### ايه هى ال templates؟

ال templates أو القوالب هى عبارة عن ملفات YAML بيكون فيها كل المعلومات عن نوع وشكل وتفاصيل ال request سواء كان HTTP أو DNS الأداة بتعتمد عليها فى عملية الفحص

شكل وتفاصيل ال template:

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfET3_R2Tz1uSAT8uzy%2Fhttp.png?alt=media\&token=13474d24-04ef-40f7-a000-6ff8bd489bb9)

بشكل عام ال template  بيتقسم لثلاث أقسام:

1- ال template ID: بيكون فيه ال CVE ID  او اى ID  تختاره لازم تتأكد انوا خالى من المسافات

2- ال template INFO: والقسم دا بيكون فيه بعض المعلومات الخاصة بال TEMPLATE زى الاسم name والشخص اللى كتب ال template أو ال author وال severity ممكن تكون info, low, medium,...  على حسب خطورة الثغرة وال الوصف او ال description  ودا بيكون فيها الشرح الخاص بوظيفة ال template

3- ال requests: والقسم دا بيبقى فى ال requests لمختلفة على حسب النوع وال matchers اللى على أساسها الأداة بتحدد هل الموقع مصاب بالثغرة اللى موجودة فى ال template  ولا لا

ال template دا بيعمل فحص لثغرة xss بنكون محددين المسار اللى فيه الثغرة و كاتبين ال payload وفى ال matchers بنكتب الكلمة المميزة اللى المفروض تكون فى ال response وعلى أساسها الأداة هتعرف هل فى ثغرة ولا لا

## طريقة استخدام الأداة

### 1- HTTP Request

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfEYKRon_00bITv5HI5%2Fhttp.png?alt=media\&token=a20e0982-f2d2-4910-a971-2bf2426c471a)

هنفترض ان خدمة معينة بتستخدمها مجموعة من المواقع مصابة بثغرة xss علشان نستغل الثغرة دا محتاجين payload وال parameter المصاب يالثغرة دى وبنبعت ال payload  باستخدام HTTP Client زى المتصفح مثلا ونلاحظ ال response هل ال payload رجع فى ال response ولا لا, لو رجع كدا الموقع مصاب لو مرجعش كدا الموقع غير مصاب

لو الخدمة المصابة بثغرة ال xss  دى بيستخدمها 10000 موقع مثلا هل هتروح على واحد واحد فيهم وتبدأ تختبره بشكل يدوى؟ أكيد لا, وهنا تكمن قوة أداة زى nuclei الاداة بتاخد ال request و القيمة أو العلامة المميزة اللى الأداة هتبحث عنها فى ال response والقيمة دا بتكون فى ال matchers, فى شكل template وبتاخد ال domains list وتبدأ تبعتلهم واحد واحد وترجعلك النتايج فى الأخر, فى ال request هنلاقى `{{BaseURL}}` ودى قيمة مميزة بيتم استبدالها بال URL لخاص بالموقع اللى هيتعمله فحص, والقيمة دى  case sensitive لازم تتكتب زى ما هى

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfEb95c-VOJzbEYCLnz%2Fnuclei-command.png?alt=media\&token=188e9f50-3748-4aaa-a1fe-a8beea6369e8)

### 2-  Raw HTTP Request

فى المثال الاول كنا بنكتب ال Request ك parameters  وتقدر تضيف ال headers من خلال ال **`headers`**&#x20;

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfFv-G-A7ah3bcq47UG%2Frequst-with-custom-headers.png?alt=media\&token=cde41c0c-bba7-41a8-a82c-03ea8ed56021)

لاكن هنا تقدر تنسخ ال request  زى ما هو من ال burpsuite  مثلا وتكتبة فى block  واحد فى ال section  اللى اسمه **`raw`**

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfFywD-zs6_mMnQrrFW%2Fburp-request.png?alt=media\&token=101af26f-e29d-46ec-afb2-493edcf75692)

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfFvS2BCsWHpigg8m60%2Fhttp-raw.png?alt=media\&token=9c6f641b-400a-460d-8d4f-3c28954aae5d)

### 3- Network Requests

فى أداة اسمها netcat ممكن تستخدمها فى انك تبدأ اتصال TCP or UDP  ترسل بيها أو تستلم بيانات, على سبيل المثال ممكن تستخدمها فى انك تبعت HTTP request

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfFxB1JOby0HTiRaAU4%2Fnc-http-request.png?alt=media\&token=f0985a0f-3486-41b4-933b-3a0c602207b1)

أداة nuclei ممكن تؤدى نفس الوظيفة من خلال ال Network request

فى المثال دا هنستخدم nuclei  فى اننا بعت raw HTTP request  زى اللى بعتناه ب netcat

&#x20;القيمة المميزة **`{{Hostname}}`**&#x628;يتم استبدالها بال domain  اللى هنبدأ معاه الاتصال

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfC7v2N-9NXdSYFS5TA%2F-MfFxU-NJdgBYvxzG8ie%2Fraw-http-over-tcp.png?alt=media\&token=3b334544-cb00-4154-8472-1651dc4af6c0)

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfIYwFBBr835yf0DIDI%2F-MfIs_r-_1eWAUt6LsF4%2Fnc-raw-http-over-tcp.png?alt=media\&token=73fd32bb-59ea-43c9-af48-89762f745876)

### 4- DNS Requests

ممكن نستخدم nuclei فى اننا نعمل automation  لل DNS Lookups  ونبحث عن records معينة, هنلاحظ فى الصورة الname القيمة بتاعته **`{{FQDN}}`** ودى قيمة مميزة بيتم استبادلها بكل Domain هنعمله lookup  وال type وقيمته بتختلف على حسب نوع ال dns record  اللى بنعمله lookup

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfI9Tnom4CBdBsWnLDv%2Fdns.png?alt=media\&token=09f3bff6-3129-4c91-80a1-8c3836486e2b)

ممكن نستخدم DNS requests  فى اننا نجمع ال domains اللى شغالة فى ip range  معين, على سبيل المثال ال domains  اللى بتستخدم cloudflare, أو فى بعض الخدمات ممكن نتأكد اذا كان subdomain معين ممكن نعمله takeover

### 5- File Requests

دلوقتى لو معانا مجموعة من الملفات المختلفة (js, py, txt, html, jpg, png) وعايزين نقرأ نوع معين منهم ونستخرج منه بعض البيانات ممكن نستخدم أداة زى grep  مثلا

فى المثال دا استخدمنا grep  علشان نعمل extraction  لل script tags  من ملف HTML

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIE2yJKQXKfWPp6hD-%2Fgrep.png?alt=media\&token=072680d6-d7ae-4bbb-9db5-3c1dcfddc0ef)

ممكن ننفذ نفس العملية ولاكن باستخدام nuclei باستخدام ال template  دا على سبيل المثال, بنحدد ال file types  من خلال قسم ال  extensions  وبنكتب ال file extension اللى الأدة المفروض تقرأها فلو عندى ممجموعة مختلفه من الملفات هقدر أقرأ نوع معين, وبنحدد الحاجة اللى بندور عليها فى الملفات دى من خلال ال extractors  والنوع هنا بيكون regex  وبنكتب ال pattern  اللى بندور عليه

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIETUBep0FWKA8TmnV%2Ffile-script-tags.png?alt=media\&token=86c1184d-f704-478c-9c43-eacfe9cc28e5)

فى المثال دا كانت الأداة بتبحث عن  google API key دا خل ملفات JavaScript

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIFcnR_JE2HoJshPyU%2Ffile.png?alt=media\&token=5573ac6a-2288-493b-849a-e2342ee3b798)

## طريقة كتابة ال template

لو افترضنا انك معاك PoC لثغرة معينة سواء أنت لقيت الثغرة دى بنفسك أو لوقيت ال PoC  على twitter  على سبيل المثال أزاى ممكن تحول ال PoC  دا ل Template  تقدر تستخدمه فى nuclei

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIIhTw9I_SO7tu0eBy%2Fpw-cisco-xss-PoC.png?alt=media\&token=f0dbcd64-f195-49ee-8d15-00d1692bd43a)

1- أول خطوة ممكن نعملها اننها نعمل reproduce  للثغرة

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfISgdBDn4kY26hJqJ2%2Fcurl.png?alt=media\&token=4b157816-1e90-46d2-ac2d-20350f0a3721)

2- هنعمل capture لل request باستخدام ال burp لى سبيل المثال

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfISwnZxqP44fSGgnOe%2Fburp.png?alt=media\&token=b738e7b1-c5ea-4ed5-aa11-dca62f7a9544)

3- هناخد ال request  ونكتبه فى صورة template  اما على شكل parameters او raw

لو هنكتبه غلى شكل parameters  هيكون بالشكل دا متقسم لثلاث أقسام رئيسية (id , info, requests)

قسم ال requests بيتقسم لعدة أجزاء على حسب شكل ال requests فى الصورة دى متقسم لخمس أجزاء (method, path, headers, body, matchers)

1- method: GET, POST, PUT, DELETE, ....

2- path: file path on the server

3- headers: HTTP headers

4- body: optionally (based on HTTP method)

5- matchers: بيكون فيها البيانات اللى الاداة هتبحث عنها

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIUNB-KjxNkXWulZNI%2Frequest-anatomy.png?alt=media\&token=b77cbc78-a819-4140-91ea-b9db49d671fb)

اما لو هنكتبة بشكل raw فبيكون بالشكل دا الrequst  زى ما هو فى block واحد

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIWYvkmih4jhwVVlK5%2FCISCO-RAW.png?alt=media\&token=cf11fe54-98b7-4593-8346-a4e60a8c2f28)

واخر خطوة بنتأكد ان كل حاجة سليمة بنشغل الأداة ونعترض ال request, شغال تمام زى ما واضح فى الصورة

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MfI3UnJznIwSFa11t56%2F-MfIXSCNrQ-MvnU5N7gG%2Fcisco-xss.png?alt=media\&token=b574c3b1-324e-410c-b0e8-da00be4a2569)

## المصادر

{% embed url="<https://nuclei.projectdiscovery.io/templating-guide/​>" %}

{% embed url="<https://github.com/projectdiscovery/nuclei​>" %}
