
Cobalt Strike Beacon में कंसोल बनाए बिना PE चलाने के लिए BOF
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 │ │
│ └────────────────────────────────────────────────────────┘ │
└──────────────────────────────────────────────────────────────┘
printf/WriteConsole हुक के माध्यम से कैप्चर किया जाता हैBOF का व्यवहार Additionals postex -> RunPe Config में संपादित किया जा सकता है

| विधि | विवरण |
|---|---|
None | सीधे API कॉल |
Draugr | स्टैक स्पूफ्ड API कॉल |
Regwait | RegisterWaitForSingleObject कॉलबैक |
Timer | Timer Queue कॉलबैक |
| विधि | विवरण |
|---|---|
Heap | Draugr के साथ RtlCreateHeap के माध्यम से निजी हीप |
VirtualAlloc | Draugr के साथ NtAllocateVirtualMemory |
Module stomping | वैध DLL .text सेक्शन को अधिलेखित करता है |
| विकल्प | विवरण |
|---|---|
AllocRWX | RWX के रूप में आवंटित करें (RW→RX संक्रमण के बजाय) |
UnhookNtdll | ntdll.dll .text को डिस्क से ताज़ा प्रति से बदलें |
Timeout | मिलीसेकंड में निष्पादन टाइमआउट (0 = अनंत) |
StompModule | मॉड्यूल स्टॉम्पिंग के लिए DLL पथ (जैसे, chakra.dll) |
| विकल्प | विवरण |
|---|---|
ModuleName | प्रारंभ पते के लिए वैध मॉड्यूल (जैसे, Kernel32.dll) |
ProcedureName | मॉड्यूल के भीतर फ़ंक्शन नाम (जैसे, BaseThreadInitThunk) |
Offset | फ़ंक्शन प्रारंभ से ऑफसेट |
सभी PE आउटपुट IAT हुक के माध्यम से beacon कंसोल पर पुनर्निर्देशित किया जाता है। कोई कंसोल विंडो या नामित पाइप निर्मित नहीं किया जाता।
| हुक किया गया फ़ंक्शन | लक्ष्य |
|---|---|
GetCommandLineA/W | स्पूफ्ड तर्क लौटाता है |
__getmainargs / __wgetmainargs | CRT तर्क आरंभीकरण |
printf / wprintf | BeaconPrintf पुनर्निर्देशन |
WriteConsoleA/W | BeaconPrintf पुनर्निर्देशन |
__stdio_common_vfprintf | UCRT प्रिंट फ़ंक्शन |
ExitProcess / exit | ExitThread में परिवर्तित |
| तकनीक | बायपास |
|---|---|
| अप्रत्यक्ष सिस्कॉल | यूज़रलैंड API हुक (EDR/AV) |
| Draugr स्टैक स्पूफिंग | कॉल स्टैक निरीक्षण |
| थ्रेड स्टार्ट स्पूफिंग | थ्रेड प्रारंभ पता विश्लेषण |
| मॉड्यूल स्टॉम्पिंग | अनबैक्ड मेमोरी डिटेक्शन |
| निजी हीप आवंटन | VirtualAlloc मॉनिटरिंग |
| Ntdll अनहुकिंग | मेमोरी में ntdll को डिस्क पर मौजूद Ntdll से अधिलेखित करना |
| IAT हुकिंग (कोई पाइप नहीं) | नामित पाइप मॉनिटरिंग |
NtGetContextThread / NtSetContextThread:
मेमोरी ऑपरेशन:
DONT_RESOLVE_DLL_REFERENCES के साथ DLL लोड किया गया (यदि मेमोरी आवंटक मॉड्यूल स्टॉम्पिंग है)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 द्वारा Pavel YosifovichWindows Internals, Part 1 द्वारा Pavel YosifovichWindows Internals, Part 2 द्वारा Andrea Allievi