انتقل إلى المحتوى الرئيسي

المختبر 7.1: تعداد خدمات ويندوز

الأهداف التعليمية​

في نهاية هذا المختبر، ستكون قادرًا على:

  • تعداد جميع خدمات نظام ويندوز
  • تحديد الخدمات الضعيفة
  • فهم مخاطر الأمان المتعلقة بالخدمات
  • إنشاء تقارير تدقيق للخدمات

المدة المقدرة​

40 دقيقة

المتطلبات الأساسية​

  • جهاز افتراضي Windows 10/11
  • حقوق المسؤول
  • معرفة أساسية بـ PowerShell

السياق المهني​

تعداد الخدمات ضروري لـ:

  • تدقيقات الأمان
  • اكتشاف البرمجيات الخبيثة المستمرة
  • تحسين الأداء
  • الامتثال التنظيمي

الجزء 1: التعداد الأساسي​

الخطوة 1.1: استخدام services.msc​

  1. افتح services.msc
  2. راقب قائمة الخدمات
  3. قم بالفرز حسب "الحالة" لرؤية الخدمات النشطة

السؤال 1: كم عدد الخدمات التي تعمل حاليًا؟

الخطوة 1.2: تعداد PowerShell​

# جميع الخدمات
Get-Service | Measure-Object

# الخدمات التي تعمل
Get-Service | Where-Object {$_.Status -eq "Running"} | Measure-Object

# الخدمات المتوقفة
Get-Service | Where-Object {$_.Status -eq "Stopped"} | Measure-Object

السؤال 2: كم عدد الخدمات المتوقفة؟

الخطوة 1.3: تفاصيل الخدمات​

# عرض التفاصيل
Get-Service | Select-Object Name, DisplayName, Status, StartType |
Sort-Object Status -Descending |
Format-Table -AutoSize

الجزء 2: التعداد المتقدم باستخدام WMI​

الخطوة 2.1: معلومات مفصلة​

يوفر WMI معلومات أكثر من Get-Service:

Get-WmiObject Win32_Service | Select-Object `
Name,
DisplayName,
State,
StartMode,
@{N='Account';E={$_.StartName}},
PathName |
Format-Table -AutoSize

الخطوة 2.2: الخدمات حسب حساب التشغيل​

# التجميع حسب الحساب
Get-WmiObject Win32_Service |
Group-Object StartName |
Select-Object Count, Name |
Sort-Object Count -Descending

السؤال 3: أي حساب يشغل أكبر عدد من الخدمات؟

الخطوة 2.3: خدمات LocalSystem (ذات الامتياز العالي)​

# الخدمات التي تعمل كـ LocalSystem
Get-WmiObject Win32_Service |
Where-Object {$_.StartName -eq "LocalSystem"} |
Select-Object Name, DisplayName, State, PathName |
Format-Table -AutoSize

السؤال 4: كم عدد الخدمات التي تعمل كـ LocalSystem؟


الجزء 3: اكتشاف الثغرات​

الخطوة 3.1: المسارات غير المقتبسة (Unquoted Service Paths)​

المسارات التي تحتوي على مسافات بدون علامات اقتباس تكون عرضة للخطر:

# اكتشاف المسارات غير المقتبسة
Get-WmiObject Win32_Service | Where-Object {
$_.PathName -notmatch '^"' -and
$_.PathName -match ' ' -and
$_.PathName -notmatch '^[A-Za-z]:\\Windows'
} | Select-Object Name, PathName

توضيح: إذا كان لدى خدمة المسار C:\Program Files\App\service.exe، سيبحث ويندوز بالترتيب:

  1. C:\Program.exe
  2. C:\Program Files\App\service.exe

يمكن للمهاجم وضع C:\Program.exe لتحويل التنفيذ.

الخطوة 3.2: الأذونات على الملفات التنفيذية​

# التحقق من أذونات الملفات التنفيذية للخدمة
Get-WmiObject Win32_Service | ForEach-Object {
$serviceName = $_.Name
$path = $_.PathName

# استخراج مسار الملف التنفيذي
if ($path -match '^"([^"]+)"') {
$exePath = $matches[1]
} elseif ($path -match '^(\S+)') {
$exePath = $matches[1]
} else {
$exePath = $path
}

if (Test-Path $exePath -ErrorAction SilentlyContinue) {
$acl = Get-Acl $exePath -ErrorAction SilentlyContinue

# التحقق مما إذا كان لدى المستخدمين غير المسؤولين حق الكتابة
$vulnerable = $acl.Access | Where-Object {
($_.IdentityReference -match "Users|Everyone|Authenticated") -and
($_.FileSystemRights -match "Write|Modify|FullControl")
}

if ($vulnerable) {
[PSCustomObject]@{
Service = $serviceName
Path = $exePath
VulnerableACL = $true
}
}
}
} | Format-Table -AutoSize

الخطوة 3.3: الخدمات ذات المسارات المشبوهة​

# الخدمات في مسارات غير معتادة
Get-WmiObject Win32_Service | Where-Object {
$_.PathName -match "\\Temp\\" -or
$_.PathName -match "\\AppData\\" -or
$_.PathName -match "\\Downloads\\" -or
$_.PathName -match "\\Desktop\\"
} | Select-Object Name, DisplayName, PathName

السؤال 5: هل هناك خدمات في مسارات مشبوهة؟


الجزء 4: تحليل التبعيات​

الخطوة 4.1: الخدمات الحرجة​

# الخدمات التي تعتمد عليها خدمات أخرى
Get-Service | ForEach-Object {
$service = $_
$dependents = Get-Service -DependentServices $service.Name -ErrorAction SilentlyContinue

if ($dependents.Count -gt 0) {
[PSCustomObject]@{
Service = $service.DisplayName
DependentCount = $dependents.Count
Dependents = ($dependents.DisplayName -join ", ")
}
}
} | Where-Object {$_.DependentCount -gt 0} |
Sort-Object DependentCount -Descending |
Select-Object -First 10

الخطوة 4.2: سلسلة التبعيات​

# عرض التبعيات لخدمة محددة
$serviceName = "Dnscache"

Write-Host "=== $serviceName ===" -ForegroundColor Cyan
Write-Host "`nالخدمات المطلوبة:" -ForegroundColor Yellow
Get-Service $serviceName -RequiredServices | Select-Object DisplayName, Status

Write-Host "`nالخدمات التابعة:" -ForegroundColor Yellow
Get-Service $serviceName -DependentServices | Select-Object DisplayName, Status

الجزء 5: تقرير التدقيق​

الخطوة 5.1: سكربت تدقيق كامل​

# سكربت تدقيق الخدمات
$reportPath = "$env:USERPROFILE\Desktop\audit_services.txt"

$report = @"
================================================================================
تقرير تدقيق خدمات ويندوز
$(Get-Date -Format "yyyy-MM-dd HH:mm:ss")
================================================================================

الملخص
------
"@

# الإحصائيات
$allServices = Get-WmiObject Win32_Service
$running = ($allServices | Where-Object {$_.State -eq "Running"}).Count
$stopped = ($allServices | Where-Object {$_.State -eq "Stopped"}).Count
$auto = ($allServices | Where-Object {$_.StartMode -eq "Auto"}).Count

$report += @"

إجمالي الخدمات: $($allServices.Count)
قيد التشغيل: $running
متوقفة: $stopped
تشغيل تلقائي: $auto

الخدمات حسب حساب التشغيل
-------------------------------
"@

$byAccount = $allServices | Group-Object StartName | Sort-Object Count -Descending
foreach ($group in $byAccount) {
$report += "`n$($group.Name): $($group.Count)"
}

# المسارات غير المقتبسة
$unquoted = $allServices | Where-Object {
$_.PathName -notmatch '^"' -and
$_.PathName -match ' ' -and
$_.PathName -notmatch '^[A-Za-z]:\\Windows'
}

$report += @"

الثغرات المحتملة
---------------------------
المسارات غير المقتبسة: $($unquoted.Count)
"@

if ($unquoted) {
foreach ($svc in $unquoted) {
$report += "`n - $($svc.Name): $($svc.PathName)"
}
}

# المسارات المشبوهة
$suspect = $allServices | Where-Object {
$_.PathName -match "\\(Temp|AppData|Downloads|Desktop)\\"
}

$report += "`n`nالخدمات في مسارات مشبوهة: $($suspect.Count)"
if ($suspect) {
foreach ($svc in $suspect) {
$report += "`n - $($svc.Name): $($svc.PathName)"
}
}

$report += @"

================================================================================
نهاية التقرير
================================================================================
"@

# حفظ
$report | Out-File $reportPath -Encoding UTF8
Write-Host "تم حفظ التقرير: $reportPath" -ForegroundColor Green

# عرض
$report

الخطوة 5.2: تنفيذ التدقيق​

# تنفيذ السكربت
.\audit_services.ps1

التسليمات​

  1. الإجابات على الأسئلة الخمسة

  2. تقرير التدقيق الذي تم إنشاؤه بواسطة السكربت

  3. لقطات شاشة:

    • services.msc
    • نتيجة تعداد PowerShell
    • الخدمات المحتملة الضعيفة
  4. تحليل (صفحة واحدة):

    • الملاحظات الرئيسية
    • المخاطر المحددة
    • التوصيات

معايير التقييم​

المعيارالنقاط
التعداد الأساسي20%
تعداد WMI20%
اكتشاف الثغرات30%
تقرير التدقيق30%

أوامر مرجعية​

# الخدمات
Get-Service
Get-WmiObject Win32_Service

# التصفية
Where-Object {$_.Status -eq "Running"}

# التحديد
Select-Object Name, DisplayName, Status

# التجميع
Group-Object StartName

# ACL
Get-Acl chemin

تم تطوير المختبر في إطار دورة أنظمة التشغيل - الوحدة 7