خلّي Python يكتب التقرير
نحوّل الـ Findings من بيانات لتقرير Markdown كامل بجدول وتفاصيل، ونعرف أدوات زي Pandoc و SysReptor اللي بتطلّع منه PDF.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
أهلاً بيك. نسخ ولزق عشرين Finding في Word، وتنسيق كل جدول بإيدك… ده ساعات. وكل مرة بتنسخ، فيه احتمال تغلط.
الحل: خزّن الـ Findings كبيانات، list من dictionaries، أو ملف JSON. خلّي الـ code يطلّع منها Markdown. وبعدين أداة زي Pandoc تحوّل الـ Markdown لـ PDF أو Word بالشكل اللي إنت عايزه. نكتب generator بسيط: بيعمل جدول Findings Summary، وبعدين جزء لكل Finding، ويحفَظ الكل في ملف report dot md. نشغّل… ده تقرير Markdown كامل، طلع في ثانْيَة.
findings = [
{"id": "F-01", "title": "SQL Injection in login form", "severity": "Critical", "cvss": 9.8,
"fix": "Use prepared statements."},
{"id": "F-02", "title": "Default admin password", "severity": "Critical", "cvss": 9.1,
"fix": "Set a long random password and enable MFA."},
{"id": "F-03", "title": "Missing security headers", "severity": "Medium", "cvss": 5.3,
"fix": "Add CSP and X-Frame-Options headers."},
]
lines = ["# Penetration Test Report", "", "## Findings Summary", "",
"| ID | Title | Severity | CVSS |", "|----|-------|----------|------|"]
for f in findings:
lines.append(f"| {f['id']} | {f['title']} | {f['severity']} | {f['cvss']} |")
lines += ["", "## Technical Findings"]
for f in findings:
lines += ["", f"### {f['id']}: {f['title']}", f"**Severity:** {f['severity']} ({f['cvss']})",
f"**Remediation:** {f['fix']}"]
report = "\n".join(lines)
open("report.md", "w").write(report)
print(report)المخرجات
# Penetration Test Report ## Findings Summary | ID | Title | Severity | CVSS | |----|-------|----------|------| | F-01 | SQL Injection in login form | Critical | 9.8 | | F-02 | Default admin password | Critical | 9.1 | | F-03 | Missing security headers | Medium | 5.3 | ## Technical Findings ### F-01: SQL Injection in login form **Severity:** Critical (9.8) **Remediation:** Use prepared statements. ### F-02: Default admin password **Severity:** Critical (9.1) **Remediation:** Set a long random password and enable MFA. ### F-03: Missing security headers **Severity:** Medium (5.3) **Remediation:** Add CSP and X-Frame-Options headers.
ولو مش عايز تكتب الـ generator بنفسك، فيه أدوات جاهزة: SysReptor، و Ghostwriter، و Dradis. بتخزّن الـ Findings، وعندها مكتبة Findings جاهزة تعيد استخدامها، وتطلّع PDF احترافي. بس خد بالك: الأتمتة بتوفّر وقت التنسيق، مش التفكير. كل Finding لازم تقراه وتعدّله على حسب العميل ده بالزبط. دورك: ضيف سطر تحت العنوان، فيه عدد الـ Findings كلها، وكام واحد منهم Critical.
احسب crit بـ sum وضيف سطر Total findings تحت العنوان.
الحل: نشغّل…
findings = [
{"id": "F-01", "title": "SQL Injection in login form", "severity": "Critical", "cvss": 9.8,
"fix": "Use prepared statements."},
{"id": "F-02", "title": "Default admin password", "severity": "Critical", "cvss": 9.1,
"fix": "Set a long random password and enable MFA."},
{"id": "F-03", "title": "Missing security headers", "severity": "Medium", "cvss": 5.3,
"fix": "Add CSP and X-Frame-Options headers."},
]
crit = sum(f["severity"] == "Critical" for f in findings)
lines = ["# Penetration Test Report", "", f"Total findings: {len(findings)} ({crit} critical)", "", "## Findings Summary", "",
"| ID | Title | Severity | CVSS |", "|----|-------|----------|------|"]
for f in findings:
lines.append(f"| {f['id']} | {f['title']} | {f['severity']} | {f['cvss']} |")
lines += ["", "## Technical Findings"]
for f in findings:
lines += ["", f"### {f['id']}: {f['title']}", f"**Severity:** {f['severity']} ({f['cvss']})",
f"**Remediation:** {f['fix']}"]
report = "\n".join(lines)
open("report.md", "w").write(report)
print(report)المخرجات
# Penetration Test Report Total findings: 3 (2 critical) ## Findings Summary | ID | Title | Severity | CVSS | |----|-------|----------|------| | F-01 | SQL Injection in login form | Critical | 9.8 | | F-02 | Default admin password | Critical | 9.1 | | F-03 | Missing security headers | Medium | 5.3 | ## Technical Findings ### F-01: SQL Injection in login form **Severity:** Critical (9.8) **Remediation:** Use prepared statements. ### F-02: Default admin password **Severity:** Critical (9.1) **Remediation:** Set a long random password and enable MFA. ### F-03: Missing security headers **Severity:** Medium (5.3) **Remediation:** Add CSP and X-Frame-Options headers.
الدرس الجاي: التقرير خلص… بس قبل ما تبعته، لازم يتراجع. وبعد الإصلاح، فيه Retest. يلا بينا.
03 / دروس المسار (21)
- 01ليه التقرير أهم حاجة في الـ Pentest
- 02مين بيقرا التقرير؟
- 03نظام Notes من أول دقيقة
- 04Activity Log: كل حاجة بالوقت
- 05خلّي الـ Terminal يسجّل لوحده
- 06الأدلة: إيه اللي يعتبر دليل؟
- 07سلامة الأدلة: Hash و Chain of Custody
- 08إخفاء البيانات الحساسة (Redaction)
- 09خطوات إعادة التنفيد (Steps to Reproduce)
- 10الـ Impact: الخطر الحقيقي على البيزنس
- 11CVSS: الخطورة برقم
- 12الـ Risk Matrix: الاحتمال في الـ Impact
- 13ترتيب الأولويات والـ Quick Wins
- 14هيكل تقرير اختبار الاختراق
- 15الـ Executive Summary: صفحة للإدارة
- 16كتابة الـ Finding التقني
- 17توصيات الإصلاح اللي تتنفّد فعلاً
- 18خلّي Python يكتب التقريرانت هنا
- 19المراجعة قبل التسليم والـ Retest
- 20تقرير امتحان OSCP
- 21المراجعة النهائية: من الـ Note للتقرير