أتمتة الفحص بـ Python
إزاي تجمع كل اللي اتعلمناه في pipeline صغير بـ Python: تشغّل الأدوات وتطلّع النتايج JSON، وتوحّد شكلها، وتشيل التكرار، وترتّبها بالأولوية، علشان توفّر وقت في كل فحص.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
في كل فحص بتعمل نفس الخطوات: تشغّل الأدوات، تجمّع، تشيل التكرار، ترتّب. بدل ما تعملها بإيدك كل مرة، نكتبها مرة واحدة بـ Python. وده الـ automation.
الـ pipeline بيمشي في خطوات: تشغيل: Python بيشغّل الأدوات بـ subprocess. تجميع: كل أداة تطلّع JSON، وإنت تقراه. توحيد: كل finding في نفس الشكل. تنظيف: شيل التكرار. ترتيب: بالأولوية. كل خطوة function لوحدها.
أغلب الأدوات بتطلّع JSON لو طلبت منها، وده بيسهّل القراية من Python. Nuclei: dash jsonl. Nmap: dash oX بيطلّع XML. ومن Python بتشغّلها بـ subprocess dot run.
تحذير مهم: الأتمتة بتسرّع الشغل، بس ما بتلغيش عقلك. لسه لازم تأكّد الثغرات بإيدك. لسه لازم إذن مكتوب قبل أي فحص. والـ script ما يفحصش أي IP بره الـ scope. حط الـ scope في أول الـ script وتأكّد منه. هنا pipeline صغير. نتايج الأدوات في list اسمها raw، وفيه function اسمها dedupe بتشيل التكرار، زي اللي كتبناها قبل كده. بنطبع النتيجة النضيفة. نشغّل… تلات findings، من غير تكرار، بس مش مترتّبين.
# A tiny pipeline: raw findings from the tools -> normalize -> dedupe -> prioritize.
raw = [
{"tool": "nuclei", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5, "kev": True},
{"tool": "openvas", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5, "kev": True},
{"tool": "nmap", "host": "10.10.10.5", "name": "Samba 3.0.20 Command Injection", "cvss": 10.0, "kev": False},
{"tool": "nikto", "host": "10.10.10.7", "name": "Missing X-Frame-Options Header", "cvss": 2.6, "kev": False},
]
def dedupe(findings):
seen, out = set(), []
for f in findings:
key = (f["host"], f["name"])
if key in seen:
continue
seen.add(key)
out.append(f)
return out
clean = dedupe(raw)
for f in clean:
print(f"{f['cvss']:4} {f['host']:11} {f['name']}")
print("total:", len(clean))المخرجات
7.5 10.10.10.5 Apache 2.4.49 Path Traversal 10.0 10.10.10.5 Samba 3.0.20 Command Injection 2.6 10.10.10.7 Missing X-Frame-Options Header total: 3
دورك: ضيف خطوة الترتيب. اكتب function اسمها score بترجّع الـ KEV والـ CVSS كـ tuple، ورتّب بيها القايمة من الأكبر للأصغر، علشان اللي في KEV والأعلى CVSS يطلعوا الأول.
def score(f): return (f["kev"], f["cvss"]) وبعدين clean.sort(key=score, reverse=True)
الحل: نشغّل… دلوقتي مترتّبين: اللي في KEV الأول، وبعدين بالـ CVSS.
# A tiny pipeline: raw findings from the tools -> normalize -> dedupe -> prioritize.
raw = [
{"tool": "nuclei", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5, "kev": True},
{"tool": "openvas", "host": "10.10.10.5", "name": "Apache 2.4.49 Path Traversal", "cvss": 7.5, "kev": True},
{"tool": "nmap", "host": "10.10.10.5", "name": "Samba 3.0.20 Command Injection", "cvss": 10.0, "kev": False},
{"tool": "nikto", "host": "10.10.10.7", "name": "Missing X-Frame-Options Header", "cvss": 2.6, "kev": False},
]
def dedupe(findings):
seen, out = set(), []
for f in findings:
key = (f["host"], f["name"])
if key in seen:
continue
seen.add(key)
out.append(f)
return out
def score(f):
return (f["kev"], f["cvss"])
clean = dedupe(raw)
clean.sort(key=score, reverse=True)
for f in clean:
flag = "KEV" if f["kev"] else " "
print(f"{f['cvss']:4} {flag} {f['host']:11} {f['name']}")
print("total:", len(clean))المخرجات
7.5 KEV 10.10.10.5 Apache 2.4.49 Path Traversal 10.0 10.10.10.5 Samba 3.0.20 Command Injection 2.6 10.10.10.7 Missing X-Frame-Options Header total: 3
كده عندك هيكل script تقدر تبني عليه في أي فحص. الدرس الأخير: مراجعة شاملة للكورس كله من أوله لآخره. يلا بينا.
03 / دروس المسار (16)
- 01يعني إيه ثغرة؟ ومن الـ Recon للـ Vulnerabilities
- 02CVE و CWE: أسماء الثغرات
- 03الخطورة: CVSS و EPSS و KEV
- 04البحث في NVD
- 05Exploit-DB و searchsploit
- 06GitHub و Metasploit
- 07الفحص بـ Nmap NSE
- 08الفحص بـ Nuclei
- 09الفحص بـ Nikto
- 10الفحص بـ OpenVAS
- 11فحص بصلاحيات ومن غيرها
- 12تجميع وتنظيم النتايج
- 13False Positives والتأكد اليدوي
- 14ترتيب الأولويات
- 15أتمتة الفحص بـ Pythonانت هنا
- 16مراجعة شاملة