
ShellcodeFluctuation PoC ported to Nim
मूल रेपो का Nim पोर्ट: https://github.com/mgeeky/ShellcodeFluctuation सभी टिप्पणियाँ मूल रेपो से ज्यों की त्यों कॉपी पेस्ट की गईं, क्योंकि उन्होंने वास्तव में मुझे इस तकनीक को समझने में मदद की। तकनीक के बारे में अधिक जानकारी के लिए मैं दृढ़ता से मूल रेपो की README पढ़ने की सलाह देता हूँ!
निर्भरताएँ इंस्टॉल करें:
nimble install winim ptr_math
मैं इस तथ्य से पूरी तरह अवगत हूँ कि यह मेमोरी एन्क्रिप्शन तकनीक OpSec के मामले में सर्वोत्तम नहीं है। यह केवल उन्हीं क्षेत्रों को एन्क्रिप्ट करेगी जो इसके लिए परिभाषित किए गए हैं। इसलिए उदाहरण के लिए, C2-Implant में, Sleep पर सभी नए निष्पादित मॉड्यूल मेमोरी पते एन्क्रिप्ट नहीं होंगे। Heap-आधारित डिटेक्शन (जैसे Cobalt-Strike कॉन्फ़िग के लिए) के लिए आपको यहाँ Heap एन्क्रिप्शन जोड़ने की आवश्यकता होगी।
फिर भी, यह मेमोरी एन्क्रिप्शन तकनीक Sleep पर मुख्य C2-Implant के लिए स्वचालित मेमोरी स्कैनर डिटेक्शन से बचने के लिए पूरी तरह से उपयोग की जा सकती है। मैंने Covenant और एक कस्टमाइज़्ड स्टेजलेस Payload के साथ PoC का सफलतापूर्वक परीक्षण किया है इस तरह।
इस पोर्ट में एन्क्रिप्शन/डिक्रिप्शन कुंजी, Shellcode पता और सुरक्षा (RW) जैसे अधिक मानों को मैन्युअल रूप से परिभाषित करना होता है। मूल रेपो में Shellcode कॉलर-पता स्वचालित रूप से प्राप्त किया गया था।
Example.nim फ़ाइल में आरंभ करने के लिए आवश्यक सब कुछ मौजूद है। बेशक, C2-Shellcode का उपयोग करते समय आपको स्वयं Sleep को कॉल करने की आवश्यकता नहीं है (यह केवल PoC के लिए सब कुछ ट्रिगर करने हेतु है), यह आपके C2 द्वारा ही किया जाना चाहिए। फिलहाल यह केवल उन C2-फ्रेमवर्क के साथ संगत है जो Win32 Sleep फ़ंक्शन का उपयोग करते हैं, लेकिन यदि आप किसी अन्य फ़ंक्शन के लिए Hook संशोधित करते हैं तो यह उसी तरह काम करेगा।
import winim
import Fluctuation
echo "Trying to hook Sleep"
if (hookSleep()):
echo "Hooked Sleep successfully!"
type
PocArray = array[12, byte]
let names: PocArray = [byte 0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA]
g_fluctuationData.shellcodeAddr = unsafeAddr names[0]
echo "Shellcode address:"
echo repr(g_fluctuationData.shellcodeAddr)
g_fluctuationData.shellcodeSize = size_t(len(names))
echo "Shellcode Size:"
echo repr(g_fluctuationData.shellcodeSize)
when defined(amd64):
g_fluctuationData.encodeKey = 0xDEADB33f
when defined(i386):
g_fluctuationData.encodeKey = 0xDEAD
g_fluctuationData.currentlyEncrypted = false
g_fluctuationData.protect = PAGE_READWRITE
g_fluctuate = FluctuateToRW
echo "Calling Sleep"
Sleep(2500)
echo "Everything went fine and as expected"
else:
echo "Failed to hook Sleep"
quit(1)
एन्क्रिप्शन PoC का परीक्षण उदाहरण के लिए इस प्रकार किया जा सकता है:
nim c --debuginfo --linedir:on Example.nim
डीबगर के साथ शुरू करें:
gdb Example.exe
Sleep से पहले और बाद में ब्रेकपॉइंट सेट करें:
# Before encryption
break Example.nim:31
# After encryption
break Fluctuation.nim:98
# Original value restored
break Example.nim:33
उसके बाद प्रत्येक ब्रेकपॉइंट के लिए Shellcode-पते का मान इस प्रकार जाँचें:

NA पर Fluctuation अभी तक काम नहीं करता, क्योंकि मेरे परीक्षण में Vectored Exception Handler कभी ट्रिगर नहीं हुआ, बल्कि एप्लिकेशन क्रैश हो गया। भविष्य में कुछ और परीक्षण/समस्या निवारण करना होगा। बेझिझक स्वयं परीक्षण करें! :-)