
Fritter v1.3
EXE, DLL, .NET, VBScript और JScript के इन-मेमोरी निष्पादन हेतु पॉलीमॉर्फिक शेलकोड जनरेटर, जिसमें एवेशन (evasion) और सिग्नेचर प्रतिरोध के लिए प्रति-आउटपुट और प्रति-बिल्ड रैंडमाइज़ेशन शामिल है।
Fritter
Donut का चकमा देने वाला चचेरा भाई।
Fritter, TheWover और Odzhan के Donut शेलकोड जनरेटर का बड़े पैमाने पर संशोधित फोर्क है। यह VBScript, JScript, EXE, DLL और .NET असेंबली के इन-मेमोरी निष्पादन के लिए पोज़ीशन-इंडिपेंडेंट शेलकोड उत्पन्न करता है, जिसमें चकमा और सिग्नेचर प्रतिरोध पर विशेष ध्यान दिया गया है। कोडबेस केवल x64 है।
क्या अलग है
बहुत कुछ। Fritter उन सुविधाओं को हटा देता है जिनकी आमतौर पर आवश्यकता नहीं होती और उन आंतरिक घटकों को बदल देता है जो वर्षों में अच्छी तरह से सिग्नेचर्ड हो चुके हैं। क्रिप्टो, कम्प्रेशन, हैशिंग और API रिज़ॉल्यूशन परतों सहित कई अन्य क्षेत्रों को पुनः तैयार किया गया है।
पॉलीमॉर्फिज़्म और चकमा ही डिज़ाइन लक्ष्य है। हर आउटपुट अद्वितीय होता है, और टूल का हर बिल्ड भी स्वयं अद्वितीय होता है। दो अलग-अलग परतें हैं:
प्रति-आउटपुट रैंडमाइज़ेशन: हर बार fritter इनवोक करने पर लागू होता है। एंट्री स्टब, पॉलीमॉर्फिक डिकोडर, एन्क्रिप्शन कुंजियाँ, और उत्पन्न शेलकोड के भीतर कई संरचनात्मक तत्व हर PIC बिल्ड पर नई एन्ट्रॉपी से पुनः उत्पन्न किए जाते हैं।
प्रति-बिल्ड रैंडमाइज़ेशन: हर बार fritter स्वयं संकलित होने पर लागू होता है। साइफर और हैश रोटेशन कॉन्स्टेंट, API रिज़ॉल्यूशन टेबल लेआउट, शिम-साइड स्ट्रिंग स्क्रैम्बलिंग, PEB-वॉक दिशाएँ, पोस्ट-एग्ज़ीक्यूशन वाइप पैटर्न, और लोडर और शिम के भीतर कई संरचनात्मक अक्ष कंपाइल समय पर बेक किए जाते हैं।
रनटाइम पर, Fritter लोडर के एक्ज़ीक्यूटेबल फुटप्रिंट को न्यूनतम करता है। लोडर को अलग-अलग एन्क्रिप्टेड फ़ंक्शनों में विभाजित किया जाता है, जिनमें से प्रत्येक का अपना PE सेक्शन, XOR कुंजी और डिस्पैचर होता है। किसी भी क्षण केवल एक फ़ंक्शन के बाइट्स प्लेनटेक्स्ट में होते हैं। पहले का VEH स्लाइडिंग-विंडो मॉडल इस डिस्पैच मॉडल के पक्ष में हटा दिया गया है।
!! सोर्स से बिल्ड करना अत्यधिक अनुशंसित है !!
यह मायने रखता है। releases में परीक्षण के लिए उपलब्ध प्री-बिल्ट बाइनरीज़ अपने प्रति-बिल्ड कॉन्स्टेंट को बाइनरी के सभी उपयोगकर्ताओं के साथ साझा करती हैं।
अपनी खुद की कॉपी बनाएं। प्रति-बिल्ड अक्ष हर make इनवोकेशन पर पुनः-रैंडमाइज़ होते हैं:
# Linux, static-musl ELF, no runtime libc dependency
# Requires: build-essential, mingw-w64, musl-tools
make -f Makefile.linux release
# Windows (MSVC), recommended on Windows
nmake -f Makefile.msvc
Windows पर, MSVC अनुशंसित टूलचेन है। यह प्रत्येक लोडर फ़ंक्शन को उसके अपने पेज-एलाइन्ड PE सेक्शन में रखता है, जिसकी N>1 प्रति-फ़ंक्शन डिस्पैच मॉडल को आवश्यकता होती है। mingw वर्तमान में सब कुछ एक ही .text में एमिट करता है और इसलिए पूरे लोडर को एक XOR कुंजी के साथ कवर करने वाली एक एंट्री चलाता है (कार्यात्मक रूप से MSVC आउटपुट के समान, लेकिन कई के बजाय केवल एक पॉलीमॉर्फिज़्म डिस्पैचर के साथ)। यदि आपके पास Visual Studio नहीं है, तो Makefile.linux के साथ WSL के अंतर्गत बिल्ड करें; यह mingw-w64 के माध्यम से Windows लोडर को क्रॉस-कंपाइल करता है।
प्रत्येक make ताज़ा प्रति-बिल्ड कॉन्स्टेंट उत्सर्जित करने के लिए tools/gen_poly और API रिज़ॉल्यूशन टेबल को क्रमचयित करने के लिए tools/gen_api_shuffle चलाता है। परिणामी fritter बाइनरी स्वयं अद्वितीय होती है - अलग साइफर कॉन्स्टेंट, अलग हैश कॉन्स्टेंट, अलग API टेबल लेआउट, अलग शिम-साइड स्ट्रिंग स्क्रैम्बलिंग, इत्यादि। उस बाइनरी द्वारा उत्पन्न हर शेलकोड तब उन प्रति-बिल्ड कॉन्स्टेंट को साझा करेगा लेकिन प्रति-आउटपुट अक्षों पर भिन्न होगा।
उपयोग
Fritter का परीक्षण करने के लिए calc.exe और inject_local64.exe के साथ एक /test फ़ोल्डर शामिल है। टेस्ट होस्ट को स्वयं पुनर्निर्माण करने के लिए: nmake -f Makefile.msvc harness, या WSL के अंतर्गत make -f Makefile.linux harness चलाएं।
fritter [options] -i <EXE/DLL/VBS/JS>
INPUT
-i, --input <path> Input file to execute in-memory
-p, --args <args> Parameters / command line for target
-c, --class <name> Class name (required for .NET DLL)
-m, --method <name> Method or function for DLL
-r, --runtime <ver> CLR runtime version
-w, --unicode Pass command line as UNICODE
-t, --thread Run unmanaged EXE entrypoint as thread
OUTPUT
-o, --output <path> Output file (default: loader.bin)
-f, --format <1-8> 1=Bin 2=B64 3=C 4=Ruby 5=Py 6=PS 7=C# 8=Hex
-x, --exit <1-3> 1=Thread (default) 2=Process 3=Block
-y, --fork <offset> Fork thread, continue at RVA offset
LOADER
-e, --entropy <1-3> 1=None 2=Random names 3=Names+Crypto (default)
-k, --headers <1-2> 1=Overwrite (default) 2=Keep all
-g, --chunked <0-1> (deprecated; dispatch shim is always used)
-d, --domain <name> AppDomain name for .NET
-j, --decoy <path> Decoy module for Module Overloading
STAGING
-n, --modname <name> Module name for HTTP staging
-s, --server <url> Server URL (supports basic auth)
उदाहरण
fritter -i payload.exe
fritter -i implant.dll -m RunMain -p "arg1 arg2"
fritter -i payload.exe -g 0 -k 2 -o out.bin
आर्किटेक्चर (कई इम्प्लीमेंटेशन यहाँ सूचीबद्ध नहीं हैं)
एक Fritter शेलकोड पेलोड नेस्टेड परतों के रूप में संरचित होता है, जिनमें से प्रत्येक अगली परत को डिक्रिप्ट या स्टेज करती है:
-
एंट्री स्टब। परिवर्तनीय लंबाई का एक रैंडमाइज़्ड जंक प्रीफ़िक्स, प्रति-आउटपुट उत्पन्न एक RSP-एलाइनमेंट रूटीन, और एक जनरेटिव ट्रैम्पोलिन। शिकाटा गा नाई की विधा पर आधारित।
-
पॉलीमॉर्फिक XOR डिकोडर। टू-पास-असेंबल्ड। रजिस्टर आवंटन Fisher-Yates शफल द्वारा एक पूल से किया जाता है। कुंजी की लंबाई प्रति-आउटपुट चुनी जाती है। हर वास्तविक इंस्ट्रक्शन के बीच जंक डाला जाता है। हॉट लूप के मूवेबल इंस्ट्रक्शन समूहों को सहीता बाधाओं के भीतर पुनः क्रमबद्ध किया जाता है।
-
डिस्पैच शिम। पहले के VEH स्लाइडिंग-विंडो शिम को प्रतिस्थापित करता है। लोडर क्षेत्र को RW->RWX में फ्लिप करता है, फिर नियंत्रण लोडर एंट्री को सौंप देता है। N>1 डिस्पैच के अंतर्गत, प्रत्येक कॉल एक प्रति-फ़ंक्शन थंक के माध्यम से एक प्रति-फ़ंक्शन डिस्पैचर में रूट की जाती है जो डिक्रिप्ट करता है, चलाता है, और वापसी पर वाइप करता है। हर डिस्पैचर का ओपकोड लेआउट प्रति-बिल्ड भिन्न होता है (CHANGELOG v1.3 देखें)।
-
लोडर। PE इन-मेमोरी मैपर। हैश द्वारा API रिज़ॉल्व करता है, सेक्शन API के माध्यम से एम्बेडेड PE को मैप करता है, इम्पोर्ट्स / रिलोकेशन / TLS कॉलबैक लागू करता है, एंट्रीपॉइंट इनवोक करता है, फिर वाइप करता है। PEB वॉक दिशा, पोस्ट-एग्ज़ीक्यूशन वाइप बाइट, MainProc में संरचनात्मक सॉल्ट साइट्स - सभी प्रति-बिल्ड रैंडमाइज़ होते हैं।
-
क्लीनअप। लोडर पेजों को प्रति-बिल्ड बाइट पैटर्न से वाइप करता है, इंस्टेंस को मिटा देता है, और
-xके अनुसार थ्रेड या प्रोसेस समाप्ति के माध्यम से बाहर निकलता है। साफ करने के लिए कोई VEH हैंडलर या कॉन्टेक्स्ट स्ट्रक्चर नहीं है।
निष्पादन के बाद अवशिष्ट फुटप्रिंट एक छोटा RWX पेज होता है जहाँ डिस्पैच शिम चला था। थ्रेड मोड में मैप किया गया PE सेक्शन जानबूझकर बरकरार छोड़ा जाता है ताकि CRT कॉलबैक के पास निरंतरता रहे।
श्रेय
Fritter, TheWover और Odzhan के काम पर आधारित है, जिनके मूल Donut प्रोजेक्ट ने पोज़ीशन-इंडिपेंडेंट शेलकोड जनरेशन को सुलभ और व्यावहारिक बनाया। उनका आर्किटेक्चर, लोडर डिज़ाइन और PIC फ्रेमवर्क वह नींव है जिस पर यह सब कुछ निर्मित है। PE मैपिंग, .NET होस्टिंग और स्क्रिप्ट निष्पादन पथ काफी हद तक उन्हीं का काम है, जिसे बरकरार रखा गया है और सम्मानित किया गया है।
लाइसेंस
BSD 3-Clause। LICENSE देखें।