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

## مقدمة

ال fuzzing هي طريقة بنستخدمها علشان نكتشف الثغرات ونتأكد ان التطبيق شغال بشكل صحيح وبيعرف يتعامل مع انواع البيانات المختلفة من غير ما يتعطل, والfuzzing هو احد الطرق المستخدمة في عملية اختبار الصندوق الاسود للتطبيقات (Black Box Testing)

### مثال

دي python function بتاخد عددين وترجع مجموعهم المفروض انها **تجمع الاعداد الصحيحة فقط**

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWONCnBypXzSgDPzvlp%2F-MWOXTsJJn8jZxYx5QJj%2Fpython_function.png?alt=media\&token=48792c37-ba6d-4e0f-a867-604f8088af5f)

دلوقتي عايزين نتاكد ان ال function  بتشتغل بشكل صحيح ولا لا باستخدام ال fuzzing

هنستخدم function تانيه تعمل  call  لل function بتاعتنا و هتمررلها بعض الdata types المختلفه وتطبعلنا الناتج

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWONCnBypXzSgDPzvlp%2F-MWOYq9F9ozUGxD9A12E%2Ffuzz_function.png.png?alt=media\&token=f1e70494-4528-4514-a3a7-d56f83a23747)

بعد ما عملنا fuzz  اتضح ان ال function مش بتشتغل بالشكل المطلوب وهو انها تجمع الاعداد الصحيحة فقط ولاكن ممكن تجمع ال floats او  strings  و في بعض الاحيان بترجع error

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWONCnBypXzSgDPzvlp%2F-MWOZsZFnmL8mdn8o6mX%2Ffuzz_results.png?alt=media\&token=1277e390-6b7d-46e4-a4a1-31171bc308d1)

خلينا نصلح الfunction  بتعاتنا ونختبرها تاني, عدلنا  ال function وخليناها تتأكد من  data type الاول قبل ما تنفذ عمليه الجمع

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWONCnBypXzSgDPzvlp%2F-MWO_niBRpiOg51Z-vKA%2Ffix_function.png?alt=media\&token=e9036071-9b74-450c-8f30-16df99780772)

ودي نتيجة ال fuzzing , كدا ال function  شغالة بالشكل المطلوب

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWONCnBypXzSgDPzvlp%2F-MWOa2ZF1o7tFhcsrv6S%2Ffix_results.png?alt=media\&token=0ffd1f40-a216-4834-8b9a-15e26cfa3e02)

&#x20;نفس الكلام ممكن يطبق علي functions  اكثر تعقيداً أو علي Applications, في المقال دا هشرح ازاي نعمل fuzz لتطبيقات الويب باستخدام أدا **ffuf**

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

### المثال رقم 1 (Directory brute forcing)

![](https://gblobscdn.gitbook.com/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWK5Fmg_lH4YNvIx2ed%2F-MWLAdMZprgnbeQPoJFW%2Fbasic.png?alt=media\&token=ce35e8d4-4e53-494d-bb75-80c6677acfa0)

في المثال دا استخدمنا **FFUF** علشان نعمل directory brute forcing

1- استخدمنا `w` ك input method والقيمة بتاعتها ملف فيه بعض المسارات اللي عايزين نخمنها

2- ال `u` والقيمة بتاعتها ال URL المستهدف

3- كلمة `FUZZ` مع كل Request بيتم استبدالها بقيمة من ال word-list

### المثال رقم 2 (FUZZ with multiple word-lists)

![](https://gblobscdn.gitbook.com/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWK5Fmg_lH4YNvIx2ed%2F-MWLDssoaXO_kiPsA7CF%2Fmulti_word_list.png?alt=media\&token=e4846dea-8535-4062-a3fc-8845cb2cde5e)

في المثال دا استخدمنا اكتر من word-list في عملية ال fuzzing واحدة فيها URL parameters والتانية في paths بالاضافة لاننا كتبنا جنب كل word-list كلمة مميزة وفصلنا بينهم ب `:` ال tool بتسبدل مكان الكلمات بقيمة من ال word-list اللي الكلمة مرتبطه بيها

![](https://gblobscdn.gitbook.com/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWK5Fmg_lH4YNvIx2ed%2F-MWLFP47gXGWM4jgtEds%2Fbrup1.png?alt=media\&token=b8476345-158d-4eda-8567-08108c72fc58)

بتستبدل كلمة `PATH` بقيمة من ال word-list المرتبطة بيها وكلمة `PARAM` بقيمة من ال word-list المرتبطة بيها

### المثال رقم 3 (Proxy)

```
ffuf -w worldlist.txt -u https://example.com/FUZZ -x http://localhost:8080
```

![](https://gblobscdn.gitbook.com/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWK5Fmg_lH4YNvIx2ed%2F-MWLKErgGx_Is9accTft%2Fproxy.png?alt=media\&token=08e10636-5584-4640-94d5-073f7509baba)

ممكن تستخدم ال `x` option علشان تقدر تستخدم HTTP proxy زي brup او zap

### المثال رقم 4 (use different HTTP Method)

```
ffuf -w wordlist.txt -u http://example.com/FUZZ -X POST
```

ممكن نستخدم `X` capital علشان نستخد HTTP method مختلفة

### المثال رقم 5 (Matchers and Filters)

من الخواص المهمة في أداة ffuf هي ال Matchers وال Filters, طب هي لازمة الخواص دي؟ خلينا نتكلم عن ال Matchers

#### 1- استخدامات ال Matchers

وانت بتعمل fuzzing ل web app وعايز الاداة تظهرلك نتائج بمواصفات معينة هنا يجي دور ال Matchers ودي في منها اربع انواع

**النوع الاول** `mc` ودي بنستخدمها لما نكون عايزين نعرض النتايج لstatus code معين

```
ffuf -w wordlist.txt -u https://example.com/FUZZ mc 200,302
```

**النوع الثاني** `ml` ودي بتظهر النتايج علي حسب عدد ال lines اللي في ال response

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -ml 2
```

النوع الثالث `mr` ودي بتظهرلك النتايج بناء علي regex pattern معين انك مثلا عايز تشوف النتايج اللي فيها Error معين

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -mr <regex pattern>
```

**النوع الرابع** `ms` ودي بتظهرلك النتايج علي حسب ال response size

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -ms 300
```

**النوع الخامس** `mw` ودي بتظهرلك النتايج اللي فيها عدد معين مين الكلمات

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -mw 50
```

#### 2 - استخدمات ال Filters

عكس استخدمات ال Matchers وهي لو انت مش عايز تظهر نتايج بمواصفات معينة

```
ffuf -w wordlist -u https://example.com/FUZZ -fc 400
```

في المثال دا عملنا تصفية لل status codes 400

### المثال رقم 6 (raw request as input)

دلوقتي لو معاك request معين في file تقدر تستخدمه مع fuff مع تعديل اي جزء في ال request علشان يتم استبدالة بقيمه من ال word-list

```
GET /FUZZ HTTP/1.1
Host: example.com
User-Agent: Mozilla/5.0
```

```
ffuf -w wordlist.txt -request <requst files>
```

### المثال رقم 7 (save results)

تقدر تحفظ النتايج باستخدام ال `o`

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -o <output file name>
```

تقدر كمان تختار نوع ال output file زي HTML او JSON او  CSV باستخدام `of`

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -o <output file name> -of <json or html or csv or all>
```

### المثال رقم 8 (HTTP headers)

ممكن نستخدم HTTP header معينه مع ال Requests باستخدام ال `H` وكمان تقدر تستخدمها اكتر من مرة

```
ffuf -w wordlist.txt -u https://example.com/FUZZ -H 'User-Agent: Mozilla/5.0' -H 'X-Custom-Header: header value'
```

## أمثلة عملية

### **المثال رقم 1 (V-Host Enumeration)**

يعني ايه v-host ؟  هي اختصار ل virtual host  و ال virtual hosting  هي ميزية موجودة في ال web servers  بتسمحلنا اننا نستضيف اكتر من web site  علي نفس عنوان الانترنت ip address&#x20;

يعني لو عندنا server عنوانه 1.1.1.1  نقدر نستضيف عليه النطاق example.com و admin.example.com و  dev.example.com  ولما بنحاول نتصفح موقع معين منهم بنطلبه من الweb server  من خلال  ال HTTP Host Header

```bash
curl http://admin.example.com
```

```
GET / HTTP/1.1
Host: admin.example.com
User-Agent: curl

```

دلوقتي لو عاوزين نكتشف ال v-hosts  باستخدام ffuf  نعمل ايه؟

1- هنعمل dns lookup لل host اللي معانا&#x20;

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWOEwE-xtezHjViB_pL%2F-MWOHydBTcU3HGuGgnL-%2Fdig.png?alt=media\&token=e3ab824f-c4f1-406b-b8a1-981366659897)

2- محتاجين subdomains word-list : هنستعين ب **seclists** ودا مستودع علي  github  هتلاقي عليه  word-lists  كتير تساعدك.&#x20;

هننزل word-list من قسم ال DNS علشان نستخدمها

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWOEwE-xtezHjViB_pL%2F-MWOJf6NVsKJv6gnjYE-%2Fseclists.png?alt=media\&token=568c9193-af66-4543-941f-375a6858738a)

3- هنجمع بين subdomains و الdomain  في ملف واحد باستخدام Bash For loop:

```bash
for i in $( cat <subdominslist> )
do echo $i.<domain> >> <outputfile>
done
```

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWOEwE-xtezHjViB_pL%2F-MWOLcSFVE6aw3qacYLP%2Fsubdomins_list.png?alt=media\&token=20581fdf-6108-418f-a94d-c173c9e8ae23)

4- بعد كدا هناخد ال IP address  وال  word list اللي عملناها ونبدا fuzzing  علي ال  v-host

```bash
ffuf -w subdomains_worlist.txt -u http://<ip-address>/ -H 'Host: FUZZ' -mc 200,302,307,401
```

![](https://1561511200-files.gitbook.io/~/files/v0/b/gitbook-legacy-files/o/assets%2F-MWK4sIVJ3qdxKp6dyGH%2F-MWOEwE-xtezHjViB_pL%2F-MWON0Jk8kTl27Z2Lr_1%2Ffuzz_hosts.png?alt=media\&token=1267020f-28c8-41d6-8c18-c27b9658cfad)

### المثال رقم 2 (Testing for open redirects)

دلوقتي انا معايا URL بالشكل دا في parameter  اسمه path المفروض بعمل تحويل علي ال home directory, عازين نتأكد أن ال redirection  شغال بشكل صحيح

```
https://example.com/redir?path=/home
```

محتاجين open redirect payloads word-list, ممكن نعملها بنفسنا او ندور علي word-lists  جاهزة

دا امثلة علي بعض ال payload اللي ممكن نستخدمها

```
//google.com
//whitelisted.com.evil.com
javascript:alert(1)
\/\/google.com
java%0d%0ascript%0d%0a:alert(1)
/google.com/
//google.com/
//google%00.com/
```

هنعمل fuzz  لل path   و هنعمل Match  لل redirects status codes

```bash
ffuf -w payloads_list.txt -u https://example.com/redir?path=FUZZ -mc 300,301,302,303,304,305,307,308
```

## المصادر

{% embed url="<https://github.com/ffuf/ffuf>" %}

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

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

{% embed url="<https://owasp.org/www-community/Fuzzing​>" %}
