انتقل إلى المحتوى

Authentication Enumeration — الفكرة ببساطة

Authentication Enumeration يعني إنك تحاول تعرف معلومات عن نظام تسجيل الدخول بدون ما تخترقه فعليًا.

الهدف غالبًا يكون:

  • معرفة يوزرنيمات صحيحة

  • معرفة سياسة الباسورد

  • معرفة وجود حسابات

يعني بدل ما المهاجم يجرب:

username + password

هو يحاول الأول يعرف:

username الصحيح

وبعدها يركز بس على الباسورد.


1️⃣ Identifying Valid Usernames

دي أشهر طريقة في الـ Enumeration.

مثال 👇

لو عملت login كده:

username: admin
password: 123456

الموقع يرد:

Incorrect password

لكن لو كتبت:

username: randomuser123
password: 123456

الموقع يرد:

User does not exist

هنا حصلت مشكلة أمنية.

لأن الرسالة بتفرق بين الحالتين.

النتيجة:

المهاجم عرف إن:

admin = username صحيح

حتى لو الباسورد غلط.


2️⃣ Password Policy Enumeration

دي معناها إنك تحاول تفهم سياسة الباسورد بتاعت الموقع.

المثال اللي في الكود:

$pattern = '/^(?=.[A-Z])(?=.\d)(?=.*[\W_]).+$/';

الـ regex ده معناه:

الباسورد لازم يحتوي على:

requirement المعنى
(?=.*[A-Z]) حرف Capital
(?=.*\d) رقم
(?=.*[\W_]) Symbol

مثال باسورد مقبول:

Password1!


المشكلة الأمنية هنا

لو الموقع قال للمستخدم:

Password must contain uppercase, number, and symbol

المهاجم فهم:

  • نوع الباسورد

  • شروطه

فيقدر يعمل wordlist مخصوصة.

مثلاً باستخدام أدوات زي:

  • Burp Suite

  • ffuf


3️⃣ أماكن يحصل فيها Enumeration

Registration Page

لو عملت register بيوزر:

ahmed

الموقع رد:

Username already exists

ده معناه إن:

ahmed = مستخدم حقيقي

المهاجم يكرر العملية مع آلاف الأسماء.


Password Reset

في صفحة reset password:

لو كتبت:

admin@example.com

الرد:

Password reset link sent

لكن لو كتبت:

random@email.com

الرد:

Email not found

كده المهاجم عرف الإيميلات الصحيحة.


Verbose Error Messages

الرسائل التفصيلية مشكلة كبيرة.

سيء:

User not found

أو

Incorrect password

الأفضل:

Invalid username or password

رسالة واحدة للحالتين.


4️⃣ Data Breach Information

المهاجم ممكن يستخدم بيانات من تسريبات.

مثال مواقع:

  • Have I Been Pwned

لو لقى:

mostafa@example.com

موجود في تسريب.

هيجربه في مواقع تانية.

دي اسمها:

Credential Stuffing


مثال عملي للهجوم

المهاجم يعمل الخطوات دي:

1️⃣ يجمع usernames
2️⃣ يعرف password policy
3️⃣ يعمل wordlist مناسبة
4️⃣ يبدأ brute force


سؤال مهم غالبًا بييجي في TryHackMe

ليه Authentication Enumeration خطر؟

الإجابة:

لأنه يسمح للمهاجم:

  • تحديد المستخدمين الحقيقيين

  • تحسين هجمات brute force

  • تقليل عدد المحاولات


💡 سؤال ليك بقى عشان أتأكد إن الفكرة وصلت:

لو موقع login بيرجع الرسالة دي:

Invalid username or password

هل ده يمنع Username Enumeration بالكامل؟
ولا لسه فيه طرق تانية؟ 😏


أولًا: يعني إيه Verbose Errors؟

Verbose Errors يعني رسائل خطأ تفصيلية زيادة عن اللزوم.

المطورين بيحطوها عشان:

  • تساعدهم في debugging

  • يعرفوا المشكلة فين

لكن لما تظهر للمستخدم العادي… تبقى مشكلة أمنية.


ليه خطيرة؟

لأنها ممكن تكشف معلومات حساسة زي:

1️⃣ Internal Paths

يعني مسار الملفات داخل السيرفر.

مثال رسالة خطأ:

Warning: include(/var/www/html/config/database.php) failed

هنا عرفنا إن السيرفر فيه:

/var/www/html/

ده بيساعد المهاجم يعمل:

  • Path Traversal

  • LFI


2️⃣ Database Details

أحيانًا الخطأ يكشف:

  • اسم الجدول

  • اسم الأعمدة

مثال:

SQL Error: Unknown column 'passwords' in 'users' table

المهاجم عرف إن فيه جدول اسمه:

users

وده مهم جدًا لو بيعمل SQL Injection.


3️⃣ User Information

ممكن الرسائل تكشف:

  • usernames

  • emails

وده يسهّل User Enumeration.


إزاي المهاجم يسبب Verbose Errors؟

1️⃣ Invalid Login Attempts

المهاجم يجرب login ببيانات مختلفة.

مثال:

email: test@test.com
password: 123

لو الرد:

Email does not exist

لكن لو:

Invalid password

يبقى الإيميل موجود.

ده بالضبط اللي حصل في lab بتاع TryHackMe.


المثال اللي في اللاب

لو دخلت:

random@email.com

الرد:

Email does not exist

لكن لو دخلت:

real@email.com

الرد:

Invalid password

الاستنتاج:

real@email.com = valid email

وده اسمه:

Email Enumeration


الأتمتة (Automation)

بدل ما تجرب يدويًا 1000 ايميل…

تستخدم script زي اللي في اللاب.

الفكرة ببساطة:

1️⃣ script يقرأ قائمة ايميلات
2️⃣ يبعث request للـ login
3️⃣ يشوف الرد
4️⃣ يحدد valid أو invalid

الكود يستخدم مكتبة:

requests

في Python.


فكرة الكود ببساطة

الخطوة 1

يبعت request:

response = requests.post(url, headers=headers, data=data)

يعني:

POST /login


الخطوة 2

يقرأ الرد:

response.json()

الرد بيكون JSON.

مثال:

{
"status": "error",
"message": "Email does not exist"
}


الخطوة 3

يقارن الرسالة:

if "Email does not exist"

لو موجودة:

INVALID

لو مش موجودة:

VALID


الناتج

مثلاً:

[INVALID] test@gmail.com
[INVALID] admin@gmail.com
[VALID] john@gmail.com

يبقى المهاجم عرف إن:

john@gmail.com

مستخدم حقيقي.


الأدوات اللي بتعمل ده تلقائي

في الـ Pentesting الحقيقي غالبًا تستخدم:

  • Burp Suite

  • ffuf

  • Hydra


العلاقة بين Enumeration و Brute Force

الـ attacker يعمل كده:

1️⃣ Enumeration

يجمع usernames

مثال:

admin
john
support


2️⃣ Brute Force

يجرب passwords عليهم.

بدل:

1000 username × 1000 password

يبقى:

3 username × 1000 password

الهجوم بقى أسرع بكتير.


سؤال TryHackMe الشهير في الجزء ده

غالبًا بيسأل:

Why are verbose errors dangerous?

الإجابة:

لأنها تكشف:

  • internal paths

  • database structure

  • valid usernames

  • application logic


أولًا: يعني إيه Password Reset Flow؟

Password Reset Flow هو السيناريو اللي يحصل لما المستخدم ينسى الباسورد.

الخطوات الطبيعية تكون كده:

1️⃣ المستخدم يدخل الإيميل
2️⃣ الموقع يبعث reset token أو link
3️⃣ المستخدم يفتح اللينك
4️⃣ يغير الباسورد

لو أي خطوة فيهم ضعيفة → المهاجم ممكن يسيطر على الحساب.


أشهر طرق Reset Password

1️⃣ Email-Based Reset

الموقع يبعث link زي:

https://site.com/reset?token=abc123

لو المهاجم حصل على التوكن → يقدر يغير الباسورد.

المشكلة هنا تعتمد على:

  • أمان الإيميل

  • قوة التوكن


2️⃣ Security Questions

زي:

  • What is your pet name?

  • What is your mother's maiden name?

المشكلة إن المعلومات دي أحيانًا موجودة على السوشيال ميديا 😅

مثلاً:

  • فيسبوك

  • لينكدإن

  • إنستجرام


3️⃣ SMS Reset

الموقع يبعت OTP على الموبايل.

المشكلة هنا:

هجوم اسمه SIM Swapping
المهاجم يقنع شركة الاتصالات ينقل الرقم لشريحة عنده.


المشاكل الأمنية في Password Reset

1️⃣ Predictable Tokens

دي أهم نقطة في اللاب.

المثال في الكود:

$token = mt_rand(100, 200);

ده معناه إن التوكن هيكون رقم بين:

100 → 200

يعني:

101 احتمالات فقط

ده سهل جدًا يتعمل له Brute Force.


السيناريو في اللاب

انت تدخل:

admin@admin.com

الموقع يقول:

Password reset link has been sent

الرابط يكون:

reset_password.php?token=123

المشكلة:

التوكن مجرد رقم صغير.


استغلال الثغرة

المهاجم يجرب كل التوكنات.

مثلاً:

token=100
token=101
token=102
...
token=200


استخدام Intruder في

Burp Suite

الخطوات:

1️⃣ تمسك request للـ reset page
2️⃣ تبعتها لـ Intruder
3️⃣ تحدد مكان التوكن

مثلاً:

token=§123§

4️⃣ تحط dictionary للتوكنات


توليد القائمة باستخدام

Crunch

الأمر في اللاب:

crunch 3 3 -o otp.txt -t %%% -s 100 -e 200

معناه:

الجزء معناه
3 3 الطول 3 أرقام
-s 100 البداية
-e 200 النهاية
-o otp.txt حفظ في ملف

الناتج:

100
101
102
...
200


كيف تعرف التوكن الصحيح؟

أثناء الهجوم هتشوف:

Response Size مختلف

مثلاً:

token response length
100 1200
101 1200
137 4500 ←

الرقم الكبير غالبًا هو:

valid token


بعدها تعمل Reset Password

وتدخل بالحساب.


ليه الثغرة دي خطيرة؟

لأنها تسمح للمهاجم:

  • اختراق الحساب

  • بدون معرفة الباسورد

  • فقط عبر reset mechanism


الحماية الصحيحة

المواقع المفروض تعمل:

1️⃣ Token قوي

مثال:

3f9a8e12d4c7b5

مش رقم بسيط.


2️⃣ Expiration سريع

مثلاً:

token expires in 5 minutes


3️⃣ Single Use

بعد الاستخدام:

token invalid


4️⃣ Rate Limiting

منع brute force.


حاجة مهمة جدًا في الامتحانات

غالبًا يسأل:

Why are predictable reset tokens dangerous?

الإجابة:

لأنها تسمح للمهاجم بعمل:

  • Brute Force

  • Account takeover


💡 نصيحة Pentester حقيقية:
كتير جدًا من الـ bug bounty reports في منصات زي HackerOne بتكون بسبب Password Reset Vulnerabilities.


أولًا: يعني إيه HTTP Basic Authentication؟

HTTP Basic Authentication هو طريقة بسيطة جدًا لحماية صفحة ويب.

بدل ما يكون فيه form login عادي، المتصفح يظهر popup يطلب:

  • Username

  • Password

زي اللي بيظهر لما تدخل على بعض الراوترات.

مثال أجهزة تستخدمه:

  • Routers

  • IP Cameras

  • Network appliances


ازاي Basic Auth بيشتغل؟

المتصفح يبعت request فيها Header اسمه:

Authorization: Basic

الـ credentials تكون:

username:password

لكن قبل الإرسال يتم تحويلها إلى Base64.

مثال:

admin:password123

لو عملنا لها Base64 تصبح:

YWRtaW46cGFzc3dvcmQxMjM=

فالـ request يكون:

Authorization: Basic YWRtaW46cGFzc3dvcmQxMjM=


مشكلة كبيرة هنا ⚠️

Base64 ليس Encryption

هو فقط Encoding.

أي حد يقدر يفكّه بسهولة.


مثال فك التشفير

لو عندك:

YWRtaW46MTIzNDU2

وفكيتها Base64 هتكون:

admin:123456


ليه Basic Auth خطر؟

لو الموقع يستخدم:

HTTP

بدل

HTTPS

أي شخص يعمل Packet Sniffing يقدر يشوف الباسورد.


الهجوم في اللاب

في اللاب بتاع
TryHackMe

انت بتعمل Brute Force على Basic Auth.


الخطوات

1️⃣ تسجيل request في

Burp Suite

المتصفح يبعت request زي:

GET /labs/basic_auth HTTP/1.1
Host: enum.thm
Authorization: Basic YWRtaW46MTIz


2️⃣ فك Base64

في Burp تعمل decode:

YWRtaW46MTIz

تصبح:

admin:123


3️⃣ إرسال request إلى Intruder

في Burp:

Right Click → Send to Intruder


4️⃣ تحديد مكان الـ Payload

تحدد:

admin:123

وتخليه:

§admin:123§


5️⃣ اختيار Wordlist

في اللاب يستخدم:

500-worst-passwords.txt

من repository:

SecLists

المسار في Kali:

/usr/share/wordlists/SecLists/


6️⃣ Payload Processing

هنا أهم خطوة.

لأن السيرفر يتوقع:

username:password

فنضيف Rule:

admin:

مثال:

admin:123456
admin:password
admin:qwerty


7️⃣ تحويلها Base64

Burp يعمل encode تلقائي.

مثال:

admin:123456

تصبح:

YWRtaW46MTIzNDU2


8️⃣ بدء الهجوم

تشغل:

Start Attack

وتراقب النتائج.


كيف تعرف الباسورد الصحيح؟

في النتائج هتلاقي:

Status Meaning
401 Unauthorized
200 Success

لو ظهر:

Status 200

يبقى لقيت الباسورد.


بعدها تعمل Decode للـ Base64

مثال:

YWRtaW46cGFzc3dvcmQ=

تصبح:

admin:password

وتستخدمها لتسجيل الدخول.


نقطة مهمة جدًا في الامتحانات

يسألوا:

Why is HTTP Basic Authentication insecure?

الإجابة:

1️⃣ يستخدم Base64 وليس Encryption
2️⃣ يمكن اعتراضه عبر Man-in-the-Middle لو بدون HTTPS
3️⃣ سهل عمل Brute Force


معلومة Pentester حقيقية

Basic Auth يظهر كثير في:

  • APIs القديمة

  • Routers

  • Admin Panels

وغالبًا يتم كسره باستخدام:

  • Hydra

  • Burp Suite


شكل الأمر الأساسي

لو عندك:

  • username = admin

  • wordlist = passwords.txt

  • target = http://enum.thm

الأمر يكون:

hydra -l admin -P passwords.txt enum.thm http-get /


شرح الأمر

الجزء معناه
hydra تشغيل الأداة
-l admin username واحد
-P passwords.txt wordlist للباسورد
enum.thm الهدف
http-get نوع الـ authentication
/ المسار

2️⃣ الأمر المناسب للـ Lab في TryHackMe

غالبًا يكون:

hydra -l admin -P /usr/share/wordlists/SecLists/Passwords/Common-Credentials/500-worst-passwords.txt enum.thm http-get /labs/basic_auth/

الـ wordlist من repository:

SecLists


3️⃣ مثال Output

Hydra هيبدأ يجرب passwords:

[80][http-get] host: enum.thm login: admin password: password123

ده معناه إن الباسورد الصحيح هو:

password123


4️⃣ لو فيه Username List

بدل:

admin

لو عندك wordlist usernames:

hydra -L users.txt -P passwords.txt enum.thm http-get /


5️⃣ تسريع الهجوم

Hydra سريع أصلاً لكن تقدر تزود السرعة:

hydra -t 30 -l admin -P passwords.txt enum.thm http-get /

الخيار معناه
-t 30 عدد threads

6️⃣ لو الموقع HTTPS

تضيف:

hydra -l admin -P passwords.txt https://enum.thm http-get /

أو:

hydra -l admin -P passwords.txt enum.thm https-get /


7️⃣ أهم نصيحة Pentester

قبل استخدام Hydra لازم تعرف:

1️⃣ نوع authentication
2️⃣ المسار الصحيح
3️⃣ هل فيه rate limiting
4️⃣ هل فيه account lockout

عشان كده غالبًا نستخدم:

  • Burp Suite للـ recon

  • Hydra للهجوم السريع


أولًا: Wayback URLs

الفكرة هنا إنك ترجع لنسخ قديمة من الموقع وتشوف كان فيه إيه زمان.

الموقع اللي بيعمل كده هو:

Internet Archive

ومن خلال خدمة اسمها:

Wayback Machine

الموقع ده بيحفظ snapshots للمواقع من سنين.


ليه ده مفيد في Pentesting؟

لأن النسخ القديمة ممكن تكشف:

  • صفحات محذوفة

  • APIs قديمة

  • ملفات backup

  • Admin panels

  • parameters

مثال:

ممكن تلاقي URL قديم زي:

example.com/admin_old

حتى لو الصفحة اختفت من الموقع الحالي…
ممكن لسه موجودة على السيرفر.


استخراج الروابط تلقائيًا

بدل ما تدور يدويًا، تستخدم tool اسمها:

waybackurls

الأداة دي تعمل:

domain → استخراج كل الروابط المؤرشفة


تثبيت الأداة

git clone https://github.com/tomnomnom/waybackurls
cd waybackurls
go build


الاستخدام

مثلاً:

./waybackurls tryhackme.com

الناتج يكون:

https://tryhackme.com/.well-known/security.txt
https://tryhackme.com/login
https://tryhackme.com/reset_password
https://tryhackme.com/admin

كل دي URLs كانت موجودة في وقت ما.


Pentester بيعمل إيه بعدها؟

يجرب:

  • فتح الروابط

  • يعمل عليها fuzzing

  • يبحث عن parameters

مثال:

page.php?id=1

ده ممكن يقود إلى:

  • SQL Injection

  • Cross-Site Scripting


ثانيًا: Google Dorks

دي طريقة OSINT قوية جدًا باستخدام Google.

الفكرة:

تستخدم أوامر خاصة في البحث للوصول لملفات مخفية.


مثال 1 — البحث عن admin panels

site:example.com inurl:admin

المعنى:

  • ابحث فقط داخل الموقع

  • عن أي رابط فيه كلمة admin


مثال 2 — البحث عن كلمات مرور

filetype:log "password" site:example.com

ده يبحث عن:

  • ملفات log

  • فيها كلمة password

أحيانًا يطلع:

admin password = 123456

حصلت كتير في Bug Bounty 😅


مثال 3 — backup folders

intitle:"index of" "backup" site:example.com

ده ممكن يطلع directory listing زي:

/backup/
/database/
/old_site/


أمثلة Google Dorks يستخدمها Pentesters

البحث عن config files

site:example.com ext:env


البحث عن database dumps

site:example.com ext:sql


البحث عن login pages

site:example.com inurl:login


ليه Google Dorks قوية؟

لأن Google يكون مؤرشف ملفات غصب عن الموقع.

يعني ممكن تلاقي:

backup.zip
database.sql
config.php

كلها متاحة للتحميل.


الأدوات المرتبطة بالموضوع

Pentesters غالبًا يستخدموا:

  • waybackurls

  • Burp Suite

  • ffuf

عشان يكتشفوا:

  • endpoints

  • parameters

  • hidden directories


ترتيب الخطوات الحقيقي في Web Recon

الـ Pentester يعمل كده:

1️⃣ Google Dorks
2️⃣ Wayback URLs
3️⃣ Directory fuzzing
4️⃣ Parameter discovery
5️⃣ Vulnerability testing


💡 نصيحة حقيقية من Bug Bounty:

أكتر من 30٪ من الثغرات بيتم اكتشافها من روابط قديمة في Wayback Machine.