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.