BOF_RunPE
BOF RunPE هو ملف كائن منارة (Beacon Object File) لـ Cobalt Strike يقوم بتشغيل ملفات PE بالكامل في الذاكرة داخل عملية المنارة. على عكس fork&run التقليدي، لا يتم إنشاء عملية فرعية، ولا يتم إنشاء وحدة تحكم، ولا يتم استخدام أنبوب - يتم التقاط جميع المخرجات عبر ربط IAT وإعادة توجيهها إلى وحدة تحكم المنارة.
الهندسة: x64 فقط
نظرة عامة
┌──────────────────────────────────────────────────────────────┐
│ Cobalt Strike Beacon │
│ (Current Process) │
└────────────────────────┬─────────────────────────────────────┘
│
│ beacon_inline_execute()
│
▼
┌──────────────────────────────────────────────────────────────┐
│ BOF RunPE │
│ ┌────────────────────────────────────────────────────────┐ │
│ │ VxTable + Draugr Initialization │ │
│ │ (Syscall Resolution + Stack Spoofing) │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼─────────────────────────────────┐ │
│ │ PE Mapping │ │
│ │ - Section Copy - IAT Patching (with hooks) │ │
│ │ - Relocations - Memory Protection │ │
│ └──────────────────────┬─────────────────────────────────┘ │
│ │ │
│ ┌──────────────────────▼─────────────────────────────────┐ │
│ │ Thread Execution │ │
│ │ - Spoofed Start Address │ │
│ │ - RIP Hijacking to Entry Point │ │
│ │ - Output Redirection via Hooks │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
الميزات الرئيسية
- لا إنشاء عملية: يتم تشغيل PE داخل عملية المنارة
- لا وحدة تحكم/أنبوب: يتم التقاط المخرجات عبر خطافات
printf/WriteConsole
- طرق تخصيص متعددة: Heap, VirtualAlloc, Module Stomping
- تحميل وكيل: Timer Queue, RegisterWait، أو استدعاءات مباشرة
- إلغاء ربط Ntdll: نسخة جديدة اختيارية من القرص
- RWX: تخصيص ذاكرة في RWX بشكل اختياري
- تزييف بداية الخيط: عنوان بداية شرعي مع اختطاف RIP
خيارات التكوين
يمكن تعديل سلوك BOF في Additionals postex -> RunPe Config

طرق الوكيل
| الطريقة | الوصف |
|---|
None | استدعاءات API مباشرة |
Draugr | استدعاءات API مزيفة المكدس |
Regwait |
طرق التخصيص
| الطريقة | الوصف |
|---|
Heap | كومة خاصة عبر RtlCreateHeap مع Draugr |
VirtualAlloc | NtAllocateVirtualMemory مع Draugr |
Module stomping | استبدال قسم .text الخاص بـ DLL شرعي |
الخيارات العامة
تزييف الخيط
| الخيار | الوصف |
|---|
ModuleName | وحدة شرعية لعنوان البداية (مثال: Kernel32.dll) |
ProcedureName | اسم الدالة داخل الوحدة (مثال: BaseThreadInitThunk) |
التقاط المخرجات
يتم إعادة توجيه جميع مخرجات PE إلى وحدة تحكم المنارة عبر ربط IAT. لا يتم إنشاء نافذة وحدة تحكم أو أنبوب مسمى.
تقنيات التهرب
ناقلات الكشف
تتبع النواة (ETW-TI)
NtGetContextThread / NtSetContextThread:
- معالجة سياق الخيط على الخيوط المعلقة ثم استئنافها
عمليات الذاكرة:
- تخصيص NtAllocateMemory، يمكن أن يكون في RWX (اعتمادًا على التكوين)
- انتقالات NtProtectVirtualMemory (RW → RX)
- الذاكرة القابلة للتنفيذ في مناطق الكومة تعتبر مشبوهة (اعتمادًا على التكوين)
- Module stomping يمكن كشفه عبر عدم تطابق تجزئة القسم (اعتمادًا على التكوين)
المؤشرات السلوكية
- يتم إنشاء خيط معلق، أخذ السياق ثم تغيير قيمة RIP
- ذاكرة الكومة المميزة كقابلة للتنفيذ (إذا كان مخصص الذاكرة هو الكومة)
- تحميل DLL مع
DONT_RESOLVE_DLL_REFERENCES (إذا كان مخصص الذاكرة هو module stomping)
- تعديل قسم .text من Ntdll (إذا تم تمكين إلغاء الربط)
الاستخدام
تحميل السكريبت
Cobalt Strike → Script Manager → Load → BOF_RunPe.cna
أوامر Aggressor
beacon> runpe /path/to/binary.exe --arg1 value1


التجميع
يتطلب GCC 13 (mingw-w64). استخدم Dockerfile المقدم:
sudo docker build -t ubuntu-gcc-13 .
sudo docker run --rm -it -v "$PWD":/work -w /work ubuntu-gcc-13:latest make
المخرجات: Bin/runpe.o
القيود
| القيد | الوصف |
|---|
| CET | تقنية تطبيق تدفق التحكم (Control-flow Enforcement Technology) قد تمنع الأطر المكدسة الاصطناعية |
| x64 فقط |
الإسناد / المصادر المستخدمة للتطوير
المستودعات / المقالات
الكتب
Windows Native API Programming by Pavel Yosifovich
Windows Internals, Part 1 by Pavel Yosifovich
Windows Internals, Part 2 by Andrea Allievi