تجميع وتنظيم النتايج

جارٍ التحميل…

01 / ملخص الدرس

تجميع وتنظيم النتايج

إزاي تجمّع نتايج كل الأدوات في مكان واحد، وتشيل التكرار لما أكتر من أداة تلاقي نفس الثغرة، وتنظّم كل finding بالجهاز والـ port والاسم والخطورة والمصدر، وتعمل كده بـ Python.

02 / شرح الدرس مكتوبًا

نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.

شغّلنا Nmap و Nuclei و Nikto و OpenVAS. دلوقتي عندك أربع تقارير، كل واحد بشكل مختلف، وفيهم تكرار كتير. أول خطوة في التحليل: تجمّعهم وتنظّمهم في مكان واحد.

ليه ده مهم؟ أكتر من أداة بتلاقي نفس الثَغْرة، فعندك تكرار. كل أداة بتسمّي الحاجة باسم مختلف. ومن غير تنظيم، هتكتب نفس المشكلة كذا مرة في التقرير. الحل: شكل موحّد لكل finding.

الشكل الموحّد اللي هنستعمله لكل finding: الجهاز، يعني الـ host. الـ port. اسم الثَغْرة. الخطورة، يعني الـ CVSS. والمصدر: الأداة اللي لقتها. كل finding بيبقى dict بالـ keys دي، وكلهم في list واحدة.

أهم حاجة في التنظيم: إزالة التكرار. نفس الثَغْرة على نفس الجهاز، حتى لو لقتها أداتين، لازم تتكتب مرة واحدة في التقرير. بنعمل key يميّز كل ثَغْرة، زي الجهاز زائد الاسم. ولو شفنا الـ key قبل كده، نعدّيه. هنا جمّعنا نتايج الأدوات في list واحدة من dicts. خد بالك: أول اتنين نفس الثَغْرة على نفس الجهاز، بس من أداتين مختلفين. دلوقتي بنطبعهم كلهم من غير أي تنظيف. نشغّل… أربع سطور، وفيهم التكرار واضح.

main.py
# Findings merged from several tools into one list of dicts.
findings = [
    {"tool": "nuclei",  "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5},
    {"tool": "openvas", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5},
    {"tool": "nmap",    "host": "10.10.10.5", "name": "Samba 3.0.20 Command Injection", "cvss": 10.0},
    {"tool": "nikto",   "host": "10.10.10.7", "name": "Missing X-Frame-Options Header", "cvss": 2.6},
]

for f in findings:
    print(f"{f['cvss']:4}  {f['host']:11} {f['name']}  [{f['tool']}]")

المخرجات

7.5  10.10.10.5  Apache 2.4.49 Path Traversal  [nuclei]
 7.5  10.10.10.5  Apache 2.4.49 Path Traversal  [openvas]
10.0  10.10.10.5  Samba 3.0.20 Command Injection  [nmap]
 2.6  10.10.10.7  Missing X-Frame-Options Header  [nikto]

دورك: شيل التكرار. اعمل key من الجهاز والاسم لكل finding. لو الـ key اتشاف قبل كده، عدّيه بـ continue. غير كده، ضيفه للـ unique واطبع الليستة النضيفة.

تمرين

key = (f["host"], f["name"]) وبعدين: if key in seen: continue وإلا seen.add(key) و unique.append(f)

الحل: نشغّل… تلات findings بس، والتكرار اختفى.

main.py
# Findings merged from several tools into one list of dicts.
findings = [
    {"tool": "nuclei",  "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5},
    {"tool": "openvas", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5},
    {"tool": "nmap",    "host": "10.10.10.5", "name": "Samba 3.0.20 Command Injection", "cvss": 10.0},
    {"tool": "nikto",   "host": "10.10.10.7", "name": "Missing X-Frame-Options Header", "cvss": 2.6},
]

seen = set()
unique = []
for f in findings:
    key = (f["host"], f["name"])
    if key in seen:
        continue
    seen.add(key)
    unique.append(f)

for f in unique:
    print(f"{f['cvss']:4}  {f['host']:11} {f['name']}  [{f['tool']}]")

المخرجات

7.5  10.10.10.5  Apache 2.4.49 Path Traversal  [nuclei]
10.0  10.10.10.5  Samba 3.0.20 Command Injection  [nmap]
 2.6  10.10.10.7  Missing X-Frame-Options Header  [nikto]

دلوقتي القايمة نضيفة ومنظّمة. بس الأداة لما تقول vulnerable، ده مش معناه إنها صح دايمًا. الدرس الجاي: الـ False Positives والتأكد اليدوي. يلا بينا.

03 / دروس المسار (16)
  1. 01يعني إيه ثغرة؟ ومن الـ Recon للـ Vulnerabilities
  2. 02CVE و CWE: أسماء الثغرات
  3. 03الخطورة: CVSS و EPSS و KEV
  4. 04البحث في NVD
  5. 05Exploit-DB و searchsploit
  6. 06GitHub و Metasploit
  7. 07الفحص بـ Nmap NSE
  8. 08الفحص بـ Nuclei
  9. 09الفحص بـ Nikto
  10. 10الفحص بـ OpenVAS
  11. 11فحص بصلاحيات ومن غيرها
  12. 12تجميع وتنظيم النتايجانت هنا
  13. 13False Positives والتأكد اليدوي
  14. 14ترتيب الأولويات
  15. 15أتمتة الفحص بـ Python
  16. 16مراجعة شاملة