BOF_RunPE
BOF RunPE Cobalt Strike के लिए एक Beacon Object File है जो PE फ़ाइलों को beacon प्रक्रिया के भीतर पूरी तरह से मेमोरी में निष्पादित करता है। पारंपरिक fork&run के विपरीत, कोई चाइल्ड प्रोसेस नहीं बनाई जाती, कोई कंसोल निर्मित नहीं होता, और कोई पाइप उपयोग नहीं किया जाता - सभी आउटपुट IAT हुकिंग के माध्यम से कैप्चर होता है और beacon कंसोल पर पुनर्निर्देशित किया जाता है।
आर्किटेक्चर: केवल 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 beacon प्रक्रिया के भीतर चलता है
- कोई कंसोल/पाइप नहीं: आउटपुट
printf/WriteConsole हुक के माध्यम से कैप्चर किया जाता है
- एकाधिक आवंटन विधियाँ: Heap, VirtualAlloc, Module Stomping
- प्रॉक्सी लोडिंग: Timer Queue, RegisterWait, या सीधे कॉल
- Ntdll अनहुकिंग: डिस्क से वैकल्पिक ताज़ा प्रति
- RWX : वैकल्पिक रूप से RWX में मेमोरी आवंटित करें
- थ्रेड स्टार्ट स्पूफिंग: RIP अपहरण के साथ वैध प्रारंभ पता
कॉन्फ़िगरेशन विकल्प
BOF का व्यवहार Additionals postex -> RunPe Config में संपादित किया जा सकता है

प्रॉक्सी विधियाँ
| विधि | विवरण |
|---|
None | सीधे API कॉल |
Draugr | स्टैक स्पूफ्ड API कॉल |
Regwait | RegisterWaitForSingleObject कॉलबैक |
आवंटन विधियाँ
| विधि | विवरण |
|---|
Heap | Draugr के साथ RtlCreateHeap के माध्यम से निजी हीप |
VirtualAlloc | Draugr के साथ NtAllocateVirtualMemory |
Module stomping | वैध DLL .text सेक्शन को अधिलेखित करता है |
सामान्य विकल्प
थ्रेड स्पूफिंग
| विकल्प | विवरण |
|---|
ModuleName | प्रारंभ पते के लिए वैध मॉड्यूल (जैसे, Kernel32.dll) |
ProcedureName | मॉड्यूल के भीतर फ़ंक्शन नाम (जैसे, ) |
आउटपुट कैप्चर
सभी PE आउटपुट IAT हुक के माध्यम से beacon कंसोल पर पुनर्निर्देशित किया जाता है। कोई कंसोल विंडो या नामित पाइप निर्मित नहीं किया जाता।
एवेज़न तकनीकें
डिटेक्शन वेक्टर
कर्नेल टेलीमेट्री (ETW-TI)
NtGetContextThread / NtSetContextThread:
- सस्पेंडेड थ्रेड्स पर थ्रेड कॉन्टेक्स्ट हेरफेर फिर उसे रिज़्यूम करना
मेमोरी ऑपरेशन:
- NtAllocateMemory आवंटन, RWX में हो सकता है (कॉन्फ़िग पर निर्भर)
- NtProtectVirtualMemory संक्रमण (RW → RX)
- हीप क्षेत्रों में निष्पादन योग्य मेमोरी संदिग्ध है (कॉन्फ़िग पर निर्भर)
- मॉड्यूल स्टॉम्पिंग सेक्शन हैश बेमेल के माध्यम से पता लगाने योग्य है (कॉन्फ़िग पर निर्भर)
व्यवहारिक संकेतक
- सस्पेंडेड थ्रेड बनाया गया, कॉन्टेक्स्ट लिया गया फिर RIP का मान बदला गया
- हीप मेमोरी निष्पादन योग्य के रूप में चिह्नित (यदि मेमोरी आवंटक हीप है)
DONT_RESOLVE_DLL_REFERENCES के साथ DLL लोड किया गया (यदि मेमोरी आवंटक मॉड्यूल स्टॉम्पिंग है)
- Ntdll .text सेक्शन संशोधित (यदि अनहुकिंग सक्षम है)
उपयोग
स्क्रिप्ट लोड करना
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 द्वारा Pavel Yosifovich
Windows Internals, Part 1 द्वारा Pavel Yosifovich
Windows Internals, Part 2 द्वारा Andrea Allievi