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

المختبر 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. هل تتعرف على بعض أسماء الأنابيب؟

الخطوة 1.2: تحديد الأنابيب النظامية​

الأنابيب التالية طبيعية في ويندوز:

الأنبوبالخدمة
lsarpcLocal Security Authority
samrSecurity 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. الطرفية 1: شغل الخادم

    .\serveur_pipe.ps1
  2. الطرفية 2: شغل العميل

    .\client_pipe.ps1
  3. أرسل رسائل من العميل

أسئلة: 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؟


التسليمات​

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

    • قائمة الأنابيب على نظامك
    • الخادم والعميل في حالة اتصال
    • سكربت الكشف قيد التنفيذ
  2. الإجابات على الأسئلة العشرة

  3. تحليل: (صفحة واحدة)

    • اشرح كيف تعمل الأنابيب المسماة
    • صف مخاطر الأمان المرتبطة
    • اقترح تدابير للكشف

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

المعيارالنقاط
تعداد الأنابيب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