
BOF لتشغيل PE في Cobalt Strike Beacon بدون إنشاء وحدة تحكم
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 │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
printf/WriteConsoleيمكن تعديل سلوك BOF في Additionals postex -> RunPe Config

| الطريقة | الوصف |
|---|---|
None | استدعاءات API مباشرة |
Draugr | استدعاءات API مزيفة المكدس |
Regwait | رد اتصال RegisterWaitForSingleObject |
Timer | رد اتصال Timer Queue |
| الطريقة | الوصف |
|---|---|
Heap | كومة خاصة عبر RtlCreateHeap مع Draugr |
VirtualAlloc | NtAllocateVirtualMemory مع Draugr |
Module stomping | استبدال قسم .text الخاص بـ DLL شرعي |
| الخيار | الوصف |
|---|---|
AllocRWX | التخصيص كـ RWX (مقابل انتقال RW→RX) |
UnhookNtdll | استبدال قسم .text من ntdll.dll بنسخة جديدة من القرص |
Timeout | مهلة التنفيذ بالمللي ثانية (0 = غير محدود) |
StompModule | مسار DLL للـ module stomping (مثال: chakra.dll) |
| الخيار | الوصف |
|---|---|
ModuleName | وحدة شرعية لعنوان البداية (مثال: Kernel32.dll) |
ProcedureName | اسم الدالة داخل الوحدة (مثال: BaseThreadInitThunk) |
Offset | الإزاحة من بداية الدالة |
يتم إعادة توجيه جميع مخرجات PE إلى وحدة تحكم المنارة عبر ربط IAT. لا يتم إنشاء نافذة وحدة تحكم أو أنبوب مسمى.
| الدالة المربوطة | الهدف |
|---|---|
GetCommandLineA/W | إرجاع وسائط مزيفة |
__getmainargs / __wgetmainargs | تهيئة وسائط CRT |
printf / wprintf | إعادة توجيه BeaconPrintf |
WriteConsoleA/W | إعادة توجيه BeaconPrintf |
__stdio_common_vfprintf | دوال الطباعة في UCRT |
ExitProcess / exit | تحويل إلى ExitThread |
| التقنية | ما تتجاوزه |
|---|---|
| الاستدعاءات غير المباشرة (Indirect Syscalls) | خطافات API في وضع المستخدم (EDR/AV) |
| تزييف مكدس Draugr | فحص مكدس الاستدعاءات |
| تزييف بداية الخيط | تحليل عنوان بداية الخيط |
| Module Stomping | كشف الذاكرة غير المدعومة |
| تخصيص الكومة الخاصة | مراقبة VirtualAlloc |
| إلغاء ربط Ntdll | استبدال ntdll في الذاكرة بـ Ntdll من القرص |
| ربط IAT (بدون أنابيب) | مراقبة الأنابيب المسماة |
NtGetContextThread / NtSetContextThread:
عمليات الذاكرة:
DONT_RESOLVE_DLL_REFERENCES (إذا كان مخصص الذاكرة هو module stomping)Cobalt Strike → Script Manager → Load → BOF_RunPe.cna
beacon> runpe /path/to/binary.exe --arg1 value1

beacon> help runpe

يتطلب 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 فقط | لا يدعم x86/WoW64 |
| رؤية النواة | إنشاء الخيط مرئي لاستدعاءات النواة |
| .NET | الملفات التنفيذية المُدارة غير مدعومة |
Windows Native API Programming by Pavel YosifovichWindows Internals, Part 1 by Pavel YosifovichWindows Internals, Part 2 by Andrea Allievi