CVSS: الخطورة برقم
يعني إيه CVSS، ومعنى كل جزء في الـ Vector زي AV و AC و PR، وإزاي الرقم بيتحسب ويتحوّل لـ Low و Medium و High و Critical.
نص شرح المعلم والكود الذي كتبه ونتيجة تشغيله، بنفس ترتيب الدرس.
أهلاً بيك. إنت تقول الثَّغْرة دي خطيرة، وزميلك يقول متوسطة. مين صح؟ علشان كده العالم اتفق على مقياس واحد اسمه CVSS.
الـ CVSS بيدّي كل ثَغْرة رقم من صفر لعشرة. من صفر فاصل واحد لتلاتة فاصل تسعة: Low. من أربعة لستة فاصل تسعة: Medium. من سبعة لتمانية فاصل تسعة: High. ومن تسعة لعشرة: Critical.
الرقم ده بيطلع من حاجة اسمها Vector، وكل جزء فيه سؤال: AV: المهاجم لازم يبقى فين؟ من الإنترنت ولا جنب الجهاز؟ AC: الهجوم سهل ولا صعب؟ PR: محتاج يبقى عامل login قبلها؟ UI: محتاج الضحية تدوس على حاجة؟
وباقي الـ Vector عن الـ Impact: S: الهجوم بيعدّي لسيستم تاني ولا لأ؟ وبعدين C و I و A، نفس الـ CIA Triad، وكل واحد High أو Low أو None. نكتب الحسبة نفسها بـ Python، زي الـ standard بالزبط، للحالة اللي S فيها Unchanged. وده Vector لـ SQL Injection من الإنترنت، من غير login، وبياخد كل حاجة. نشغّل… تسعة فاصل تمانية، Critical.
import math
W = {
"AV": {"N": 0.85, "A": 0.62, "L": 0.55, "P": 0.2},
"AC": {"L": 0.77, "H": 0.44},
"PR": {"N": 0.85, "L": 0.62, "H": 0.27},
"UI": {"N": 0.85, "R": 0.62},
"CIA": {"H": 0.56, "L": 0.22, "N": 0},
}
def roundup(x):
i = round(x * 100000)
return i / 100000 if i % 10000 == 0 else (math.floor(i / 10000) + 1) / 10
def cvss(vector):
m = dict(p.split(":") for p in vector.split("/"))
iss = 1 - (1 - W["CIA"][m["C"]]) * (1 - W["CIA"][m["I"]]) * (1 - W["CIA"][m["A"]])
impact = 6.42 * iss
expl = 8.22 * W["AV"][m["AV"]] * W["AC"][m["AC"]] * W["PR"][m["PR"]] * W["UI"][m["UI"]]
return 0 if impact <= 0 else roundup(min(impact + expl, 10))
def severity(score):
if score == 0: return "None"
if score < 4: return "Low"
if score < 7: return "Medium"
if score < 9: return "High"
return "Critical"
v = "AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H"
s = cvss(v)
print(v, "->", s, severity(s))المخرجات
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H -> 9.8 Critical
في الشغل الحقيقي هتستخدم الـ calculator الرسمي على موقع FIRST. بس المهم إنك فاهم كل جزء، علشان تدافع عن الرقم لو العميل سألك. وفيه نسخة جديدة اسمها CVSS أربعة، والفكرة نفسها. دورك: احسب Vector تاني لـ XSS: المهاجم محتاج login عادي، والضحية لازم تدوس على link، والـ Impact قليل على C و I.
اطبع الاتنين: الـ Vector الأولاني و AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:L/A:N.
الحل: نشغّل… أربعة فاصل ستة، Medium.
import math
W = {
"AV": {"N": 0.85, "A": 0.62, "L": 0.55, "P": 0.2},
"AC": {"L": 0.77, "H": 0.44},
"PR": {"N": 0.85, "L": 0.62, "H": 0.27},
"UI": {"N": 0.85, "R": 0.62},
"CIA": {"H": 0.56, "L": 0.22, "N": 0},
}
def roundup(x):
i = round(x * 100000)
return i / 100000 if i % 10000 == 0 else (math.floor(i / 10000) + 1) / 10
def cvss(vector):
m = dict(p.split(":") for p in vector.split("/"))
iss = 1 - (1 - W["CIA"][m["C"]]) * (1 - W["CIA"][m["I"]]) * (1 - W["CIA"][m["A"]])
impact = 6.42 * iss
expl = 8.22 * W["AV"][m["AV"]] * W["AC"][m["AC"]] * W["PR"][m["PR"]] * W["UI"][m["UI"]]
return 0 if impact <= 0 else roundup(min(impact + expl, 10))
def severity(score):
if score == 0: return "None"
if score < 4: return "Low"
if score < 7: return "Medium"
if score < 9: return "High"
return "Critical"
for v in ["AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H", "AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:L/A:N"]:
s = cvss(v)
print(v, "->", s, severity(s))المخرجات
AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H -> 9.8 Critical AV:N/AC:L/PR:L/UI:R/S:U/C:L/I:L/A:N -> 4.6 Medium
الدرس الجاي: CVSS بيقيس الثَّغْرة نفسها… بس مش بيعرف البيزنس بتاعك. نشوف الـ Risk Matrix. يلا بينا.
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 للتقرير