المختبر 8.2: AMSI وكشف PowerShell
الأهداف التعليمية
في نهاية هذا المختبر، ستكون قادرًا على:
- فهم كيفية عمل AMSI (واجهة فحص البرمجيات الضارة)
- تحديد كيفية اكتشاف السكربتات الضارة
- معرفة تقنيات التجاوز (لأغراض دفاعية)
- تنفيذ كشف فعال
المدة المقدرة
45 دقيقة
المتطلبات الأساسية
- جهاز افتراضي Windows 10/11
- Windows Defender نشط
- PowerShell 5.1+
- حقوق المسؤول
السياق المهني
AMSI هو واجهة حاسمة لـ:
- كشف السكربتات الضارة
- الحماية من البرمجيات الضارة بدون ملفات
- تكامل برامج مكافحة الفيروسات مع PowerShell
- أمان بيئات الشركات
تحذير
يشرح هذا المختبر المفاهيم لأغراض دفاعية.
- يتم تقديم تقنيات التجاوز لفهم التهديدات
- لا تستخدم هذه التقنيات بشكل ضار
- نفذ فقط على أجهزة افتراضية معزولة للاختبار
الجزء 1: فهم AMSI
الخطوة 1.1: ما هو AMSI؟
AMSI (واجهة فحص البرمجيات الضارة) هو واجهة Windows تتيح لبرامج مكافحة الفيروسات فحص محتوى السكربتات قبل تنفيذها.
تدفق التنفيذ:
سكربت PowerShell --> AMSI --> برنامج مكافحة الفيروسات --> السماح/الحظر
التطبيقات التي تدعم AMSI:
- PowerShell
- Windows Script Host (wscript, cscript)
- JavaScript
- VBScript
- وحدات VBA في Office
- تجميعات .NET
الخطوة 1.2: التحقق من أن AMSI نشط
# AMSI نشط إذا كان Windows Defender نشطًا
Get-MpComputerStatus | Select-Object AMServiceEnabled, AntivirusEnabled, RealTimeProtectionEnabled
الخطوة 1.3: اختبار AMSI
يكتشف Windows Defender سلسلة اختبار AMSI القياسية:
# يجب أن يتم حظر هذا الأمر بواسطة AMSI
# يحتوي على سلسلة الاختبار الرسمية
# جرب هذا (سيتم حظره):
"AM" + "SI" + "Test"
ملاحظة: مجرد ذكر بعض المصطلحات يؤدي إلى تشغيل AMSI.
السؤال 1: هل تم اكتشاف اختبار AMSI؟
الجزء 2: كيف يكتشف AMSI التهديدات
الخطوة 2.1: الكشف عن طريق التوقيع
يقوم AMSI بفحص الأنماط المعروفة:
# أمثلة على الأنماط المكتشفة (لا تنفذ):
# - "Invoke-Mimikatz"
# - "Invoke-Empire"
# - بعض الأوامر المشفرة بـ Base64
# - أنماط shellcode
الخطوة 2.2: السكربتات المشفرة
غالبًا ما يستخدم المهاجمون التشفير Base64:
# أمر بسيط
$cmd = "whoami"
# مشفر بـ Base64
$bytes = [System.Text.Encoding]::Unicode.GetBytes($cmd)
$encoded = [Convert]::ToBase64String($bytes)
Write-Host "الأمر المشفر: $encoded"
# فك التشفير
$decoded = [System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($encoded))
Write-Host "تم فك التشفير: $decoded"
يقوم AMSI بتحليل المحتوى بعد فك التشفير، لذا فإن التشفير وحده لا يكفي.
الخطوة 2.3: مراقبة AMSI أثناء العمل
# هذا السكربت يوضح كيف يعترض AMSI الأوامر
# التنفيذ مع تسجيل الدخول
# تفعيل تسجيل PowerShell (يتطلب المسؤول)
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Name "EnableScriptBlockLogging" -Value 1 -ErrorAction SilentlyContinue
# التحقق
Get-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
الجزء 3: تقنيات التجاوز (المعرفة الدفاعية)
الخطوة 3.1: لماذا معرفة التجاوز؟
بصفتك مدافعًا، يجب أن تعرف تقنيات المهاجمين لـ:
- تحسين الكشف
- اختبار دفاعاتك
- فهم التنبيهات الأمنية
- تدريب فرق SOC
الخطوة 3.2: فئات التجاوز
| التقنية | الوصف | الكشف |
|---|---|---|
| Memory Patching | تعديل AMSI في الذاكرة | Event ID 4104، سلوك مشبوه |
| Reflection | استخدام .NET reflection | Script Block Logging |
| Obfuscation | إخفاء الكود | التحليل السلوكي |
| COM Hijacking | اختطاف واجهة COM | مراقبة السجل |
الخطوة 3.3: كشف محاولات التجاوز
# سكربت لكشف محاولات تجاوز AMSI
# البحث في سجلات PowerShell
Write-Host "=== كشف تجاوز AMSI ===" -ForegroundColor Cyan
# البحث عن المصطلحات المشبوهة في السجلات
$suspectTerms = @(
"amsi",
"AmsiInitFailed",
"AmsiContext",
"amsiSession",
"SetValue.*amsi"
)
$events = Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 100 -ErrorAction SilentlyContinue
$suspicious = @()
foreach ($event in $events) {
foreach ($term in $suspectTerms) {
if ($event.Message -match $term) {
$suspicious += [PSCustomObject]@{
Time = $event.TimeCreated
EventId = $event.Id
Match = $term
Message = $event.Message.Substring(0, [Math]::Min(200, $event.Message.Length))
}
}
}
}
if ($suspicious.Count -gt 0) {
Write-Host "`n[تنبيه] نشاط مشبوه تم اكتشافه:" -ForegroundColor Red
$suspicious | Format-Table -AutoSize
} else {
Write-Host "`n[حسنًا] لم يتم اكتشاف أي محاولة تجاوز" -ForegroundColor Green
}
السؤال 2: هل تم اكتشاف محاولات تجاوز؟
الجزء 4: تعزيز الحماية
الخطوة 4.1: تفعيل Script Block Logging
# تكوين التسجيل الكامل (يتطلب المسؤول)
# إنشاء المفاتيح إذا لزم الأمر
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell" -Force -ErrorAction SilentlyContinue | Out-Null
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -Force -ErrorAction SilentlyContinue | Out-Null
# تفعيل التسجيل
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
-Name "EnableScriptBlockLogging" -Value 1 -Type DWord
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" `
-Name "EnableScriptBlockInvocationLogging" -Value 1 -Type DWord
Write-Host "تم تفعيل Script Block Logging" -ForegroundColor Green
الخطوة 4.2: تفعيل Module Logging
# تفعيل تسجيل الوحدات
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -Force -ErrorAction SilentlyContinue | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" `
-Name "EnableModuleLogging" -Value 1 -Type DWord
# تسجيل جميع الوحدات
New-Item -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames" -Force -ErrorAction SilentlyContinue | Out-Null
Set-ItemProperty -Path "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging\ModuleNames" `
-Name "*" -Value "*" -Type String
Write-Host "تم تفعيل Module Logging" -ForegroundColor Green
الخطوة 4.3: تكوين Constrained Language Mode
# التحقق من وضع اللغة الحالي
$ExecutionContext.SessionState.LanguageMode
# لفرض الوضع المقيد (عبر GPO أو):
# [Environment]::SetEnvironmentVariable('__PSLockdownPolicy', '4', 'Machine')
# يتطلب إعادة تشغيل
# ملاحظة: الوضع المقيد يحد من ميزات PowerShell
# يجب استخدامه بحذر في الإنتاج
الخطوة 4.4: التحقق من التكوين
# سكربت للتحقق من تكوين أمان PowerShell
Write-Host "=== تكوين أمان PowerShell ===" -ForegroundColor Cyan
# AMSI
Write-Host "`n[AMSI]" -ForegroundColor Yellow
$defender = Get-MpComputerStatus -ErrorAction SilentlyContinue
if ($defender) {
Write-Host " خدمة AMSI: $($defender.AMServiceEnabled)"
Write-Host " الحماية في الوقت الحقيقي: $($defender.RealTimeProtectionEnabled)"
}
# وضع اللغة
Write-Host "`n[وضع اللغة]" -ForegroundColor Yellow
Write-Host " الوضع الحالي: $($ExecutionContext.SessionState.LanguageMode)"
# سياسة التنفيذ
Write-Host "`n[سياسة التنفيذ]" -ForegroundColor Yellow
Get-ExecutionPolicy -List | Format-Table
# Script Block Logging
Write-Host "[Script Block Logging]" -ForegroundColor Yellow
$sbl = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
if ($sbl.EnableScriptBlockLogging -eq 1) {
Write-Host " الحالة: نشط" -ForegroundColor Green
} else {
Write-Host " الحالة: غير نشط" -ForegroundColor Red
}
# Module Logging
Write-Host "`n[Module Logging]" -ForegroundColor Yellow
$ml = Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ModuleLogging" -ErrorAction SilentlyContinue
if ($ml.EnableModuleLogging -eq 1) {
Write-Host " الحالة: نشط" -ForegroundColor Green
} else {
Write-Host " الحالة: غير نشط" -ForegroundColor Red
}
الجزء 5: المراقبة والتنبيهات
الخطوة 5.1: الأحداث الرئيسية التي يجب مراقبتها
| معرف الحدث | السجل | الوصف |
|---|---|---|
| 4103 | PowerShell/Operational | تسجيل الوحدات |
| 4104 | PowerShell/Operational | تسجيل كتلة السكربت |
| 1116 | Microsoft-Windows-Windows Defender | اكتشاف البرمجيات الضارة |
| 1117 | Microsoft-Windows-Windows Defender | إجراء على البرمجيات الضارة |
الخطوة 5.2: سكربت المراقبة
# مراقبة الأحداث المشبوهة في PowerShell
Write-Host "=== مراقبة PowerShell ===" -ForegroundColor Cyan
$suspectKeywords = @(
"bypass",
"encoded",
"downloadstring",
"invoke-expression",
"iex",
"reflection",
"assembly",
"shellcode",
"mimikatz"
)
# سجلات كتلة السكربت (4104)
$events = Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-PowerShell/Operational'
ID = 4104
} -MaxEvents 50 -ErrorAction SilentlyContinue
Write-Host "`nتحليل آخر 50 سجل كتلة سكربت..." -ForegroundColor Yellow
$alerts = @()
foreach ($event in $events) {
foreach ($keyword in $suspectKeywords) {
if ($event.Message -match $keyword) {
$alerts += [PSCustomObject]@{
Time = $event.TimeCreated
Keyword = $keyword
Preview = $event.Message.Substring(0, [Math]::Min(100, $event.Message.Length))
}
break
}
}
}
if ($alerts.Count -gt 0) {
Write-Host "`n[تنبيهات] تم اكتشاف محتوى مشبوه:" -ForegroundColor Red
$alerts | Format-Table -AutoSize
} else {
Write-Host "`n[حسنًا] لم يتم اكتشاف أي نشاط مشبوه" -ForegroundColor Green
}
التسليمات
-
الإجابات على السؤالين
-
لقطات الشاشة:
- اختبار AMSI (الكشف)
- تكوين الأمان
- تنفيذ سكربت المراقبة
-
تقرير (1-2 صفحات):
- شرح كيفية عمل AMSI
- أهمية تسجيل PowerShell
- توصيات لبيئتك
معايير التقييم
| المعيار | النقاط |
|---|---|
| فهم AMSI | 25% |
| تكوين التسجيل | 30% |
| سكربت الكشف | 25% |
| التقرير والتحليل | 20% |
الموارد
تم تطوير المختبر في إطار دورة نظم التشغيل - الوحدة 8