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

المختبر 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: لماذا معرفة التجاوز؟​

بصفتك مدافعًا، يجب أن تعرف تقنيات المهاجمين لـ:

  1. تحسين الكشف
  2. اختبار دفاعاتك
  3. فهم التنبيهات الأمنية
  4. تدريب فرق SOC

الخطوة 3.2: فئات التجاوز​

التقنيةالوصفالكشف
Memory Patchingتعديل AMSI في الذاكرةEvent ID 4104، سلوك مشبوه
Reflectionاستخدام .NET reflectionScript 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: الأحداث الرئيسية التي يجب مراقبتها​

معرف الحدثالسجلالوصف
4103PowerShell/Operationalتسجيل الوحدات
4104PowerShell/Operationalتسجيل كتلة السكربت
1116Microsoft-Windows-Windows Defenderاكتشاف البرمجيات الضارة
1117Microsoft-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
}

التسليمات​

  1. الإجابات على السؤالين

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

    • اختبار AMSI (الكشف)
    • تكوين الأمان
    • تنفيذ سكربت المراقبة
  3. تقرير (1-2 صفحات):

    • شرح كيفية عمل AMSI
    • أهمية تسجيل PowerShell
    • توصيات لبيئتك

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

المعيارالنقاط
فهم AMSI25%
تكوين التسجيل30%
سكربت الكشف25%
التقرير والتحليل20%

الموارد​


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