المختبر 7.2: آليات استمرارية ويندوز
الأهداف التعليمية
في نهاية هذا المختبر، ستكون قادرًا على:
- فهم آليات استمرارية ويندوز
- إنشاء وحذف خدمات الاختبار
- إدارة المهام المجدولة
- اكتشاف الاستمرارية الضارة
المدة المقدرة
50 دقيقة
المتطلبات المسبقة
- إكمال المختبر 7.1
- جهاز افتراضي ويندوز 10/11
- حقوق المسؤول
السياق المهني
الاستمرارية هي تقنية تُستخدم لـ:
- بشكل شرعي: بدء الخدمات تلقائيًا
- بشكل ضار: الحفاظ على الوصول بعد إعادة التشغيل
فهم هذه الآليات ضروري للدفاع.
تحذير
هذا المختبر يعلم تقنيات الاستمرارية لأغراض دفاعية.
- قم بالتنفيذ فقط على الأجهزة الافتراضية للاختبار
- نظف جميع الإنشاءات في نهاية المختبر
الجزء 1: الاستمرارية عبر الخدمات
الخطوة 1.1: إنشاء خدمة اختبار
# إنشاء سكربت الخدمة
$scriptContent = @'
# خدمة اختبار - لا تفعل شيئًا
# هذا السكربت يحاكي خدمة للمختبر
Write-Output "خدمة الاختبار بدأت" | Out-File C:\Temp\service_log.txt -Append
while ($true) {
Start-Sleep -Seconds 60
}
'@
# حفظ السكربت
New-Item -Path "C:\Temp" -ItemType Directory -Force | Out-Null
$scriptContent | Out-File "C:\Temp\test_service.ps1" -Encoding UTF8
Write-Host "تم إنشاء السكربت: C:\Temp\test_service.ps1" -ForegroundColor Green
الخطوة 1.2: تسجيل الخدمة
# إنشاء الخدمة باستخدام NSSM أو sc.exe
# لهذا المختبر، نستخدم sc.exe مع cmd.exe
# الطريقة 1: خدمة بسيطة مع cmd.exe (للعرض)
sc.exe create "LabTestService" `
binPath= "cmd.exe /k echo خدمة الاختبار" `
DisplayName= "خدمة اختبار المختبر" `
start= manual
# التحقق
Get-Service "LabTestService"
sc.exe qc "LabTestService"
الخطوة 1.3: تعديل الخدمة
# تغيير نوع البدء
sc.exe config "LabTestService" start= auto
# إضافة وصف
sc.exe description "LabTestService" "خدمة تم إنشاؤها للمختبر 7.2"
# التحقق من التغييرات
Get-Service "LabTestService" | Select-Object *
الخطوة 1.4: اكتشاف خدمتنا
# يجب أن تظهر خدمتنا كمشتبه بها
Get-WmiObject Win32_Service | Where-Object {
$_.Name -eq "LabTestService"
} | Select-Object Name, DisplayName, PathName, StartMode, State
السؤال 1: لماذا يمكن اعتبار هذه الخدمة مشبوهة؟
الخطوة 1.5: حذف الخدمة
# إيقاف وحذف
Stop-Service "LabTestService" -Force -ErrorAction SilentlyContinue
sc.exe delete "LabTestService"
# التحقق من الحذف
Get-Service "LabTestService" -ErrorAction SilentlyContinue
الجزء 2: الاستمرارية عبر المهام المجدولة
الخطوة 2.1: إنشاء مهمة بسيطة
# إنشاء مهمة تُنفذ عند بدء التشغيل
$action = New-ScheduledTaskAction `
-Execute "cmd.exe" `
-Argument "/c echo مهمة اختبار > C:\Temp\task_log.txt"
$trigger = New-ScheduledTaskTrigger -AtStartup
$principal = New-ScheduledTaskPrincipal `
-UserId "SYSTEM" `
-RunLevel Highest
Register-ScheduledTask `
-TaskName "LabTestTask" `
-Action $action `
-Trigger $trigger `
-Principal $principal `
-Description "مهمة تم إنشاؤها للمختبر 7.2"
Write-Host "تم إنشاء المهمة: LabTestTask" -ForegroundColor Green
الخطوة 2.2: التحقق من المهمة
# عرض المهمة
Get-ScheduledTask -TaskName "LabTestTask"
# تفاصيل كاملة
Get-ScheduledTask -TaskName "LabTestTask" |
Select-Object TaskName, State, @{N='Trigger';E={$_.Triggers.AtStartup}},
@{N='Action';E={$_.Actions.Execute}}
# معلومات التنفيذ
Get-ScheduledTaskInfo -TaskName "LabTestTask"
الخطوة 2.3: إنشاء مهمة أكثر واقعية
# مهمة تحاكي خدمة شرعية (للعرض للكشف)
$action = New-ScheduledTaskAction `
-Execute "powershell.exe" `
-Argument "-WindowStyle Hidden -Command Start-Sleep 3600"
$trigger = New-ScheduledTaskTrigger -AtLogOn
Register-ScheduledTask `
-TaskName "WindowsUpdateHelper" `
-Action $action `
-Trigger $trigger `
-Description "تحديث ويندوز (وهمي - مختبر)"
Write-Host "تم إنشاء مهمة مشبوهة للعرض" -ForegroundColor Yellow
الخطوة 2.4: تنفيذ الكشف
# سكربت كشف المهام المشبوهة
$suspectTasks = @()
Get-ScheduledTask | Where-Object {
$_.TaskPath -notlike "\Microsoft\*"
} | ForEach-Object {
$task = $_
foreach ($action in $task.Actions) {
$isSuspect = $false
$reasons = @()
# PowerShell مخفي
if ($action.Arguments -match "-WindowStyle\s+Hidden") {
$isSuspect = $true
$reasons += "PowerShell مخفي"
}
# أوامر مشفرة
if ($action.Arguments -match "-[Ee]ncoded") {
$isSuspect = $true
$reasons += "أمر مشفر"
}
# مهام الاختبار الخاصة بنا
if ($task.TaskName -match "^Lab" -or $task.TaskName -eq "WindowsUpdateHelper") {
$isSuspect = $true
$reasons += "مهمة اختبار/مشبوهة"
}
if ($isSuspect) {
$suspectTasks += [PSCustomObject]@{
TaskName = $task.TaskName
Execute = $action.Execute
Arguments = $action.Arguments
Reasons = ($reasons -join ", ")
}
}
}
}
Write-Host "`n=== المهام المشبوهة المكتشفة ===" -ForegroundColor Cyan
$suspectTasks | Format-Table -AutoSize
السؤال 2: ما هي المهام التي تم اكتشافها كمشبوهة؟
الخطوة 2.5: حذف المهام
# حذف مهام الاختبار الخاصة بنا
Unregister-ScheduledTask -TaskName "LabTestTask" -Confirm:$false
Unregister-ScheduledTask -TaskName "WindowsUpdateHelper" -Confirm:$false
Write-Host "تم حذف المهام" -ForegroundColor Green
الجزء 3: الاستمرارية عبر السجل
الخطوة 3.1: مفاتيح Run (التشغيل التلقائي)
مفاتيح Run تقوم بتنفيذ البرامج عند تسجيل الدخول:
# عرض مفاتيح Run الحالية
Write-Host "=== HKCU Run ===" -ForegroundColor Cyan
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue
Write-Host "`n=== HKLM Run ===" -ForegroundColor Cyan
Get-ItemProperty "HKLM:\Software\Microsoft\Windows\CurrentVersion\Run" -ErrorAction SilentlyContinue
الخطوة 3.2: إضافة إدخال اختبار
# إضافة إدخال Run (للمستخدم الحالي)
Set-ItemProperty `
-Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" `
-Name "LabTestRun" `
-Value "cmd.exe /c echo Test > C:\Temp\run_test.txt"
Write-Host "تم إضافة إدخال Run" -ForegroundColor Green
# التحقق
Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" |
Select-Object LabTestRun
الخطوة 3.3: اكتشاف الإدخالات المشبوهة
# سكربت كشف مفاتيح Run المشبوهة
$runKeys = @(
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
"HKCU:\Software\Microsoft\Windows\CurrentVersion\RunOnce",
"HKLM:\Software\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\Software\Microsoft\Windows\CurrentVersion\RunOnce"
)
Write-Host "=== تحليل مفاتيح Run ===" -ForegroundColor Cyan
foreach ($key in $runKeys) {
if (Test-Path $key) {
Write-Host "`n$key" -ForegroundColor Yellow
$props = Get-ItemProperty $key -ErrorAction SilentlyContinue
$props.PSObject.Properties | Where-Object {
$_.Name -notmatch "^PS"
} | ForEach-Object {
$value = $_.Value
# اكتشاف المشبوهين
$suspect = $false
if ($value -match "\\Temp\\" -or
$value -match "\\AppData\\Local\\" -or
$value -match "-[Ee]ncoded" -or
$_.Name -match "^Lab") {
$suspect = $true
}
if ($suspect) {
Write-Host " [مشتبه] $($_.Name): $value" -ForegroundColor Red
} else {
Write-Host " [موافق] $($_.Name): $value" -ForegroundColor Green
}
}
}
}
الخطوة 3.4: حذف إدخال الاختبار
Remove-ItemProperty `
-Path "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" `
-Name "LabTestRun"
Write-Host "تم حذف إدخال Run" -ForegroundColor Green
الجزء 4: سكربت الكشف الشامل
الخطوة 4.1: فحص كامل للاستمرارية
# سكربت كشف الاستمرارية الشامل
Write-Host @"
================================================================================
فاحص استمرارية ويندوز
================================================================================
"@ -ForegroundColor Cyan
$findings = @()
# 1. الخدمات المشبوهة
Write-Host "`n[1/3] تحليل الخدمات..." -ForegroundColor Yellow
Get-WmiObject Win32_Service | Where-Object {
$_.PathName -match "\\(Temp|AppData|Downloads)\\" -or
$_.Name -match "^(Lab|Test)"
} | ForEach-Object {
$findings += [PSCustomObject]@{
Type = "Service"
Name = $_.Name
Details = $_.PathName
Risk = "متوسط"
}
}
# 2. المهام المجدولة المشبوهة
Write-Host "[2/3] تحليل المهام المجدولة..." -ForegroundColor Yellow
Get-ScheduledTask | Where-Object {
$_.TaskPath -notlike "\Microsoft\*"
} | ForEach-Object {
$task = $_
$action = $task.Actions | Select-Object -First 1
if ($action.Arguments -match "-Hidden|-[Ee]ncoded" -or
$task.TaskName -match "^(Lab|Test|WindowsUpdate[A-Z])") {
$findings += [PSCustomObject]@{
Type = "ScheduledTask"
Name = $task.TaskName
Details = "$($action.Execute) $($action.Arguments)"
Risk = "مرتفع"
}
}
}
# 3. مفاتيح Run
Write-Host "[3/3] تحليل مفاتيح Run..." -ForegroundColor Yellow
$runKeys = @(
"HKCU:\Software\Microsoft\Windows\CurrentVersion\Run",
"HKLM:\Software\Microsoft\Windows\CurrentVersion\Run"
)
foreach ($key in $runKeys) {
if (Test-Path $key) {
$props = Get-ItemProperty $key -ErrorAction SilentlyContinue
$props.PSObject.Properties | Where-Object {
$_.Name -notmatch "^PS" -and
($_.Value -match "\\Temp\\" -or $_.Name -match "^Lab")
} | ForEach-Object {
$findings += [PSCustomObject]@{
Type = "RunKey"
Name = $_.Name
Details = $_.Value
Risk = "مرتفع"
}
}
}
}
# تقرير
Write-Host "`n================================================================================`n" -ForegroundColor Cyan
if ($findings.Count -eq 0) {
Write-Host "[موافق] لم يتم اكتشاف أي استمرارية مشبوهة" -ForegroundColor Green
} else {
Write-Host "[!] تم اكتشاف $($findings.Count) استمرارية مشبوهة:" -ForegroundColor Red
$findings | Format-Table -AutoSize
}
Write-Host "================================================================================" -ForegroundColor Cyan
الجزء 5: التنظيف
الخطوة 5.1: التحقق والتنظيف النهائي
# التحقق من عدم بقاء أي شيء
Write-Host "=== التحقق من التنظيف ===" -ForegroundColor Cyan
# الخدمات
$testService = Get-Service "LabTestService" -ErrorAction SilentlyContinue
if ($testService) {
Write-Host "الخدمة LabTestService لا تزال موجودة - الحذف..." -ForegroundColor Yellow
sc.exe delete "LabTestService"
}
# المهام
$testTasks = Get-ScheduledTask | Where-Object {$_.TaskName -match "^Lab|WindowsUpdateHelper"}
foreach ($task in $testTasks) {
Write-Host "المهمة $($task.TaskName) لا تزال موجودة - الحذف..." -ForegroundColor Yellow
Unregister-ScheduledTask -TaskName $task.TaskName -Confirm:$false
}
# مفاتيح Run
$runKey = Get-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "LabTestRun" -ErrorAction SilentlyContinue
if ($runKey) {
Write-Host "مفتاح Run LabTestRun لا يزال موجودًا - الحذف..." -ForegroundColor Yellow
Remove-ItemProperty "HKCU:\Software\Microsoft\Windows\CurrentVersion\Run" -Name "LabTestRun"
}
# الملفات
if (Test-Path "C:\Temp\test_service.ps1") {
Remove-Item "C:\Temp\test_service.ps1" -Force
}
Write-Host "`nتم الانتهاء من التنظيف!" -ForegroundColor Green
التسليمات
-
الإجابات على السؤالين
-
لقطات شاشة:
- الخدمة التي تم إنشاؤها
- المهمة المجدولة التي تم إنشاؤها
- نتيجة فاحص الاستمرارية
-
تقرير (1-2 صفحات):
- آليات الاستمرارية التي تم اختبارها
- كيفية اكتشافها
- توصيات الدفاع
معايير التقييم
| المعيار | النقاط |
|---|---|
| الاستمرارية عبر الخدمة | 25% |
| الاستمرارية عبر المهام | 30% |
| الاستمرارية عبر السجل | 20% |
| سكربت الكشف | 25% |
تم تطوير المختبر كجزء من دورة أنظمة التشغيل - الوحدة 7