المختبر 10.1: الأنابيب المسماة في ويندوز
الأهداف التعليمية
في نهاية هذا المختبر، ستكون قادرًا على:
- فهم آلية الأنابيب المسماة في ويندوز
- إنشاء خادم وعميل للأنابيب باستخدام PowerShell
- تعداد الأنابيب الموجودة على النظام
- فهم مخاطر الانتحال عبر الأنابيب
- اكتشاف الهجمات باستخدام الأنابيب
المدة المقدرة
45 دقيقة
المتطلبات الأساسية
- جهاز افتراضي Windows 10/11
- معرفة أساسية بـ PowerShell
- حقوق المسؤول
السياق المهني
تُستخدم الأنابيب المسماة بواسطة:
- تطبيقات ويندوز للاتصال المحلي
- الخدمات لتلقي الأوامر
- البرمجيات الخبيثة للاتصال الخفي (Cobalt Strike، إلخ.)
- تقنيات تصعيد الامتيازات (هجمات Potato)
الجزء 1: تعداد الأنابيب المسماة
الخطوة 1.1: سرد الأنابيب النشطة
PowerShell:
# الطريقة 1: Get-ChildItem
Get-ChildItem \\.\pipe\ | Select-Object Name
# الطريقة 2: .NET
[System.IO.Directory]::GetFiles("\\.\pipe\")
أسئلة:
- كم عدد الأنابيب النشطة على نظامك؟
- هل تتعرف على بعض أسماء الأنابيب؟
الخطوة 1.2: تحديد الأنابيب النظامية
الأنابيب التالية طبيعية في ويندوز:
| الأنبوب | الخدمة |
|---|---|
| lsarpc | Local Security Authority |
| samr | Security Account Manager |
| netlogon | مصادقة النطاق |
| srvsvc | خدمة الخادم |
| wkssvc | خدمة محطة العمل |
| spoolss | خدمة الطباعة |
قارن قائمتك بهذه الأنابيب القياسية.
الخطوة 1.3: استخدام PipeList (Sysinternals)
إذا كان متاحًا:
pipelist.exe /accepteula
أسئلة: 3. هل يظهر PipeList معلومات أكثر من PowerShell؟ 4. هل يمكنك رؤية أي عملية تستخدم كل أنبوب؟
الجزء 2: إنشاء خادم أنبوب
الخطوة 2.1: فهم التدفق
[خادم الأنبوب] [عميل الأنبوب]
| |
|<-- 1. إنشاء الأنبوب -->|
| |
|<-- 2. انتظار الاتصال |
| |
|<-- 3. اتصال العميل |
| |
|<-- 4. تبادل البيانات -->|
| |
|<-- 5. الإغلاق |
الخطوة 2.2: سكربت الخادم
أنشئ ملف serveur_pipe.ps1:
# خادم الأنبوب المسماة
$pipeName = "TestLabPipe"
Write-Host "=== خادم الأنبوب المسماة ===" -ForegroundColor Cyan
Write-Host "إنشاء الأنبوب: \\.\pipe\$pipeName" -ForegroundColor Yellow
# إنشاء الأنبوب الخادم
Add-Type -AssemblyName System.Core
$pipe = New-Object System.IO.Pipes.NamedPipeServerStream(
$pipeName,
[System.IO.Pipes.PipeDirection]::InOut
)
Write-Host "في انتظار اتصال العميل..." -ForegroundColor Yellow
$pipe.WaitForConnection()
Write-Host "تم الاتصال بالعميل!" -ForegroundColor Green
# إنشاء تدفقات القراءة/الكتابة
$reader = New-Object System.IO.StreamReader($pipe)
$writer = New-Object System.IO.StreamWriter($pipe)
$writer.AutoFlush = $true
# حلقة الاتصال
Write-Host "جاهز لاستقبال الرسائل (اكتب 'exit' للخروج)" -ForegroundColor Yellow
Write-Host ""
while ($true) {
# قراءة رسالة العميل
$message = $reader.ReadLine()
if ($message -eq "exit" -or $message -eq $null) {
Write-Host "إغلاق الاتصال..." -ForegroundColor Red
break
}
Write-Host "تم الاستلام: $message" -ForegroundColor White
# إرسال رد
$response = "Echo: $message"
$writer.WriteLine($response)
Write-Host "تم الإرسال: $response" -ForegroundColor Gray
}
# التنظيف
$reader.Close()
$writer.Close()
$pipe.Close()
Write-Host "تم إغلاق الأنبوب." -ForegroundColor Red
الخطوة 2.3: تشغيل الخادم
.\serveur_pipe.ps1
الخادم الآن في انتظار اتصال.
الجزء 3: إنشاء عميل أنبوب
الخطوة 3.1: سكربت العميل
أنشئ ملف client_pipe.ps1:
# عميل الأنبوب المسماة
$pipeName = "TestLabPipe"
$serverName = "." # محلي
Write-Host "=== عميل الأنبوب المسماة ===" -ForegroundColor Cyan
Write-Host "الاتصال بـ: \\$serverName\pipe\$pipeName" -ForegroundColor Yellow
# إنشاء الأنبوب العميل
Add-Type -AssemblyName System.Core
$pipe = New-Object System.IO.Pipes.NamedPipeClientStream(
$serverName,
$pipeName,
[System.IO.Pipes.PipeDirection]::InOut
)
try {
# الاتصال مع مهلة 5 ثواني
$pipe.Connect(5000)
Write-Host "تم الاتصال بالخادم!" -ForegroundColor Green
# إنشاء التدفقات
$reader = New-Object System.IO.StreamReader($pipe)
$writer = New-Object System.IO.StreamWriter($pipe)
$writer.AutoFlush = $true
# حلقة الإرسال
Write-Host "اكتب رسائلك (اكتب 'exit' للخروج):" -ForegroundColor Yellow
Write-Host ""
while ($true) {
$message = Read-Host ">"
if ($message -eq "exit") {
$writer.WriteLine("exit")
break
}
# إرسال الرسالة
$writer.WriteLine($message)
# قراءة الرد
$response = $reader.ReadLine()
Write-Host "الرد: $response" -ForegroundColor Gray
}
# التنظيف
$reader.Close()
$writer.Close()
$pipe.Close()
} catch {
Write-Host "خطأ: $_" -ForegroundColor Red
}
Write-Host "تم إغلاق الاتصال." -ForegroundColor Red
الخطوة 3.2: اختبار الاتصال
-
الطرفية 1: شغل الخادم
.\serveur_pipe.ps1 -
الطرفية 2: شغل العميل
.\client_pipe.ps1 -
أرسل رسائل من العميل
أسئلة: 5. هل يعمل الاتصال؟ 6. تحقق من ظهور الأنبوب في القائمة أثناء نشاطه
الجزء 4: تحليل الأمان
الخطوة 4.1: الأذونات على الأنابيب
بشكل افتراضي، ترث الأنابيب الأذونات من العملية المنشئة.
تحقق من الأذونات (يتطلب accesschk من Sysinternals):
accesschk.exe -accepteula \\.\pipe\TestLabPipe
الخطوة 4.2: خطر الانتحال
المفهوم: يمكن لخادم الأنبوب "انتحال" العميل الذي يتصل به، أي استخدام رمزه الأمني.
لماذا هو خطير:
- إذا اتصل مستخدم ذو امتيازات بأنبوب خبيث
- يمكن للخادم سرقة رمزه
- وتنفيذ الأوامر بامتيازاته
الخطوة 4.3: عرض الانتحال (للقراءة فقط)
# هذا الكود يوضح كيف يمكن لخادم أن ينتحل عميل
# لا تستخدم في الإنتاج - لأغراض تعليمية
# في الخادم، بعد WaitForConnection():
# $pipe.RunAsClient({
# whoami # سيظهر هوية العميل
# })
أسئلة: 7. لماذا الانتحال خطير؟ 8. كيف يمكن لمهاجم استغلال ذلك؟
الجزء 5: الكشف والدفاع
الخطوة 5.1: اكتشاف الأنابيب المشبوهة
# سكربت لاكتشاف الأنابيب غير المعتادة
$knownPipes = @(
"lsarpc", "samr", "netlogon", "srvsvc", "wkssvc",
"spoolss", "browser", "eventlog", "ntsvcs"
)
$currentPipes = Get-ChildItem \\.\pipe\ | Select-Object -ExpandProperty Name
$suspiciousPipes = $currentPipes | Where-Object {
$pipe = $_
-not ($knownPipes | Where-Object { $pipe -like "*$_*" })
}
if ($suspiciousPipes) {
Write-Host "أنابيب مشبوهة محتملة:" -ForegroundColor Yellow
$suspiciousPipes | ForEach-Object {
Write-Host " - $_" -ForegroundColor Red
}
} else {
Write-Host "لم يتم اكتشاف أي أنابيب مشبوهة." -ForegroundColor Green
}
الخطوة 5.2: المراقبة باستخدام Sysmon
إذا كان Sysmon مثبتًا:
- Event ID 17: Pipe Created
- Event ID 18: Pipe Connected
# عرض الأحداث الأخيرة للأنابيب
Get-WinEvent -FilterHashtable @{
LogName = 'Microsoft-Windows-Sysmon/Operational'
ID = 17, 18
} -MaxEvents 20 | Format-Table TimeCreated, Message -Wrap
أسئلة: 9. هل تم تسجيل أنبوب الاختبار الخاص بك؟ 10. ما المعلومات التي يلتقطها Sysmon؟
التسليمات
-
لقطات شاشة:
- قائمة الأنابيب على نظامك
- الخادم والعميل في حالة اتصال
- سكربت الكشف قيد التنفيذ
-
الإجابات على الأسئلة العشرة
-
تحليل: (صفحة واحدة)
- اشرح كيف تعمل الأنابيب المسماة
- صف مخاطر الأمان المرتبطة
- اقترح تدابير للكشف
معايير التقييم
| المعيار | النقاط |
|---|---|
| تعداد الأنابيب | 20% |
| خادم/عميل وظيفي | 30% |
| تحليل الأمان | 25% |
| سكربت الكشف | 25% |
أوامر مرجعية
# التعداد
Get-ChildItem \\.\pipe\
[System.IO.Directory]::GetFiles("\\.\pipe\")
# Sysinternals
pipelist.exe /accepteula
accesschk.exe \\.\pipe\NomPipe
# Sysmon
Get-WinEvent -FilterHashtable @{LogName='Microsoft-Windows-Sysmon/Operational';ID=17,18}
استكشاف الأخطاء وإصلاحها
الأنبوب لا يتم إنشاؤه
- تحقق من أن الاسم فريد
- شغل كمسؤول
العميل لا يمكنه الاتصال
- تحقق من أن الخادم قد تم تشغيله أولاً
- تحقق من اسم الأنبوب (حساس لحالة الأحرف)
- تحقق من الجدار الناري
مهلة الاتصال
- يجب أن يكون الخادم في حالة انتظار قبل أن يتصل العميل
- زد المهلة إذا لزم الأمر
مختبر مطور في إطار دورة نظم التشغيل - الوحدة 10