False Positives والتأكد اليدوي

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

01 / ملخص الدرس

False Positives والتأكد اليدوي

يعني إيه True Positive و False Positive، ليه الأدوات بتغلط، وإزاي تتأكد من الثغرة يدويًا باختبار بسيط من غير ما تأذي الهدف، وتصنّف النتايج بـ Python.

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

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

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

نفرّق بين حالتين: True Positive: الأداة قالت فيه ثَغْرة، وفعلًا فيه ثَغْرة. False Positive: الأداة قالت فيه ثَغْرة، وهي مش موجودة. لو كتبت False Positive في التقرير، بتضيّع وقت العميل وبتوجّع سمعتك.

ليه الأدوات بتغلط؟ أغلبها بيحكم من الـ banner، يعني رقم الإصدار بس. بس ممكن يكون الإصدار مترقّع، أو الميزة الوحشة مقفولة، أو الإعداد مش ضعيف. الأداة شافت الرقم بس، ما جرّبتش الثَغْرة فعلًا.

التأكد اليدوي، بس بأمان. اعمل أقل اختبار يثبت الثَغْرة، من غير ما تأذي الهدف. مثلًا في الـ path traversal: اقرا ملف غير مؤذي زي etc slash passwd، ما تمسحش حاجة. ما تعملش denial of service، وما تغيّرش أي data. وصوّر كل خطوة للتقرير. هنا تلات findings، الأداة قالت على كلهم vulnerable من الـ banner. إحنا رُحنا أكّدنا كل واحدة بإيدينا باختبار بسيط، والنتيجة متسجّلة في manual dash ok. دلوقتي بنطبع اللي الأداة قالته بس. نشغّل… تلاتة، كلهم الأداة قالت عليهم vulnerable.

main.py
# The scanner flagged these from the version banner only.
# We checked each one by hand with a harmless test (no damage to the target).
findings = [
    {"name": "Apache 2.4.49 Path Traversal", "banner_vuln": True, "manual_ok": True},
    {"name": "OpenSSH 8.9p1 old CVE", "banner_vuln": True, "manual_ok": False},
    {"name": "Samba 3.0.20 Command Injection", "banner_vuln": True, "manual_ok": True},
]

for f in findings:
    print(f["name"], "-> scanner says vulnerable:", f["banner_vuln"])

المخرجات

Apache 2.4.49 Path Traversal -> scanner says vulnerable: True
OpenSSH 8.9p1 old CVE -> scanner says vulnerable: True
Samba 3.0.20 Command Injection -> scanner says vulnerable: True

دورك: صنّف كل finding بعد التأكد اليدوي. لو manual dash ok بـ True، اطبعها True Positive. لو False، اطبعها False Positive. كده بنفصل الحقيقي عن الكاذب.

تمرين

جُوّه الـ loop: if f["manual_ok"]: label = "True Positive" else: label = "False Positive"

الحل: نشغّل… اتنين True Positive، وواحد طلع False.

main.py
# The scanner flagged these from the version banner only.
# We checked each one by hand with a harmless test (no damage to the target).
findings = [
    {"name": "Apache 2.4.49 Path Traversal", "banner_vuln": True, "manual_ok": True},
    {"name": "OpenSSH 8.9p1 old CVE", "banner_vuln": True, "manual_ok": False},
    {"name": "Samba 3.0.20 Command Injection", "banner_vuln": True, "manual_ok": True},
]

for f in findings:
    if f["manual_ok"]:
        label = "True Positive"
    else:
        label = "False Positive"
    print(f"{label:15} {f['name']}")

المخرجات

True Positive   Apache 2.4.49 Path Traversal
False Positive  OpenSSH 8.9p1 old CVE
True Positive   Samba 3.0.20 Command Injection

كده عندنا ثغرات متأكدين منها. بس ممكن يكونوا كتير، والعميل مش هيصلّح الكل مرة واحدة. الدرس الجاي: ترتيب الأولويات. يلا بينا.

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مراجعة شاملة