
क्रिस्टल पैलेस PIC लिंकर और PICO मॉड्यूल सिस्टम का उपयोग करने वाला Adaptix C2 एजेंट
क्रिस्टल पैलेस — एक कस्टम PIC (पोज़िशन इंडिपेंडेंट कोड) लिंकर और PICO मॉड्यूल सिस्टम — के साथ निर्मित एक Adaptix C2 एजेंट। यह दर्शाता है कि मॉड्यूलर शेलकोड एजेंट कैसे बनाए जाते हैं, जहाँ प्रत्येक घटक (ट्रांसपोर्ट, टास्क, ऑब्सफसेशन) रनटाइम पर लोड किया जाने वाला एक अलग PICO ब्लॉब होता है।
यह एजेंट किसी भी एवेज़न तकनीक को शामिल नहीं करता है और इसे अभियानों में जैसा-का-तैसा उपयोग करने के लिए नहीं बनाया गया है। यह Crystal Palace और PICO मॉड्यूल सिस्टम के साथ एजेंट बनाने के लिए एक संदर्भ कार्यान्वयन है।
Crystal Palace एक PIC लिंकर है जो संकलित COFF ऑब्जेक्ट्स लेता है और पोज़िशन-इंडिपेंडेंट निष्पादनयोग्य उत्पन्न करता है। प्रमुख अवधारणाएँ:
make pic +gofirst) — मुख्य निष्पादनयोग्य शेलकोड। इसमें बूटस्ट्रैप कोड, DFR रिज़ॉल्वर, और सेक्शन मार्कर होते हैं जहाँ PICO मॉड्यूल लिंक किए जाते हैं। इसे लोडर द्वारा सीधे कॉल किया जाता है।make object) — स्व-निहित कोड ब्लॉब्स जिनके अपने कोड और डेटा सेक्शन होते हैं। इन्हें libtcg से PicoLoad() के माध्यम से रनटाइम पर लोड किया जाता है। प्रत्येक PICO में एक एंट्री पॉइंट (go()) होता है जिसे फंक्शन पॉइंटर के माध्यम से कॉल किया जा सकता है।MODULE$Function सिंटैक्स (जैसे KERNEL32$VirtualAlloc) को ROR13 हैशिंग का उपयोग करके resolve(mod_hash, func_hash) कॉल से बदल देता है। कोई इम्पोर्ट टेबल नहीं होती। सभी स्ट्रिंग तर्क (DLL नाम, फंक्शन नाम) बाइनरी में प्लेनटेक्स्ट से बचने के लिए स्टैक पर char arrays के रूप में बनाए जाते हैं।.spec फ़ाइल में link निर्देश के माध्यम से नामित सेक्शन (entry_module, transport_module, आदि) पर Core PIC में एम्बेड किया जाता है।{LoadLibraryA, GetProcAddress} PicoLoad() को पास किया जाता है ताकि PICO मॉड्यूल अपने स्वयं के DFR प्रतीकों को रिज़ॉल्व कर सकें।C source → mingw-gcc → COFF objects → Crystal Palace link → raw PIC shellcode → loader (Exe/Dll/Svc)
.spec फ़ाइल परिभाषित करती है कि Crystal Palace सब कुछ कैसे लिंक करता है:
x64:
load "Bin/obj/main.x64.o" # Core PIC
make pic +gofirst
foreach %LIBS: mergelib %_ # Merge libtcg
load "Bin/obj/entry.x64.o" # Entry PICO
make object
load "Bin/obj/crypto.x64.o" # merge crypto into entry
merge
load "Bin/obj/packer.x64.o" # merge packer into entry
merge
export
link "entry_module" # link at section marker
load "Bin/obj/transport.x64.o" # Transport PICO
make object
mergelib "lib/LibWinHttp/..."
export
link "transport_module"
... # task_module, obfuscation_module
dfr "resolve" "ror13" # resolve all DFR symbols
export
Core PIC (main.c)
│
├── resolve() DFR bridge → libtcg hash lookup
├── AllocateAndLoadModule() PicoLoad each PICO into shared RWX region
│
└── calls entry module go() with pointers to all other modules
│
├── Entry Module (entry.c)
│ MvState, checkin, transact (RC4 wire format), task loop
│
├── Transport Module (transport.c)
│ HTTP/HTTPS POST via LibWinHttp
│
├── Task Module (tasks.c)
│ Command dispatch: whoami (0x30), sleep (0x20), exit (0x10)
│
└── Obfuscation Module (obfuscation.c)
Ekko sleep — timer-queue ROP chain that encrypts module memory
with RC4 (SystemFunction033) during sleep, decrypts on wake
┌─────────────────────────────┐
│ Shared RWX Region │ VirtualAlloc(PAGE_EXECUTE_READWRITE)
│ ├── Entry code │ PicoLoad → code here
│ ├── Transport code │
│ ├── Task code │
│ └── Obfuscation code │
├─────────────────────────────┤
│ Entry data (RW) │ PicoLoad → data here (separate alloc)
│ Transport data (RW) │
│ Task data (RW) │
│ Obfuscation data (RW) │
├─────────────────────────────┤
│ Core PIC (freed after boot) │ Original shellcode, freed by entry module
└─────────────────────────────┘
साझा RWX क्षेत्र वही है जिसे Ekko स्लीप साइकिल के दौरान एन्क्रिप्ट/डिक्रिप्ट करता है।
सभी ट्रैफ़िक RC4 (स्ट्रीम साइफर, 16-बाइट की) से एन्क्रिप्ट किया जाता है।
Send: [36B agent_id][RC4(payload)][16B key (first checkin only)]
Receive: [36B agent_id][RC4(response)]
src_beacon/Source/
├── main.c Core PIC — DFR resolver, module loading, bootstrap
├── entry.c Entry PICO — agent state, checkin, task loop, transact
├── transport.c Transport PICO — HTTP POST via LibWinHttp
├── tasks.c Task PICO — whoami/sleep/exit dispatch
├── obfuscation.c Obfuscation PICO — Ekko sleep (timer-queue ROP + RC4)
├── crypto.c RC4 stream cipher (merged into entry PICO)
├── packer.c Binary packer BE / parser LE (merged into entry PICO)
└── includes/
├── config.h Build-time defines (UUID, sleep, callback host/port/uri/ssl)
├── crypto.h RC4 API
├── packer.h PackBuf / Parser API
├── tcg.h Crystal Palace libtcg (PicoLoad, findModuleByHash, etc.)
└── HTTP.h LibWinHttp API
| Command | ID | विवरण |
|---|---|---|
x86_64-w64-mingw32-gcc (MinGW क्रॉस-कंपाइलर)./setup.sh --ax ../AdaptixC2
whoami, sleep, exit कमांड का उपयोग करें
whoami |
| 0x30 |
COMPUTER\username लौटाता है |
sleep <seconds> | 0x20 | कॉलबैक अंतराल को अपडेट करता है |
exit thread|process | 0x10 | एजेंट को समाप्त करता है |