
P³-Shellcode Loader एक लोडर है जो एक कोड इंजेक्शन तकनीक को लागू करता है जो प्रोसेस पैरामीटर्स संरचना का उपयोग शेलकोड इंजेक्शन के लिए निष्पादन और स्टेजिंग स्थान के रूप में करता है, बिना सामान्य डिटेक्शन तंत्र को ट्रिगर किए।
लेखक: मैक्स हिर्शबर्गर और ओगुलकैन उगुर
P³-शेलकोड लोडर एक लोडर है जो कोड इंजेक्शन तकनीक को लागू करता है जो प्रक्रिया मापदंडों की संरचना (प्रक्रिया पैरामीटर पॉइज़निंग) का उपयोग रिमोट प्रक्रियाओं में शेलकोड इंजेक्शन के लिए निष्पादन और स्टेजिंग स्थान के रूप में करता है, बिना सामान्य पहचान तंत्र को ट्रिगर किए।
एक समान अवधारणा सुरक्षा शोधकर्ता modexp द्वारा वर्णित की गई थी, जिन्होंने प्रदर्शित किया कि CreateProcess-API को पारित किए गए तर्कों का उपयोग इस उद्देश्य के लिए किया जा सकता है [1]।
हमलावर अपनी गतिविधियों को कम संदिग्ध दिखाना चाहते हैं। प्रक्रिया इंजेक्शन के साथ, हमलावर एक अलग प्रक्रिया से अपनी गतिविधियाँ करने में सक्षम होते हैं जो अधिक भरोसेमंद या विशिष्ट गतिविधि करने की अपेक्षा होती है, जिससे संदेह कम होता है।
किसी अन्य प्रक्रिया में कोड इंजेक्ट करने के लिए आवश्यक विशिष्ट चरण निम्नलिखित हैं:
OpenProcess / NtOpenProcess या CreateProcess / NtCreateProcess के माध्यम से)।VirtualAllocEx या NtAllocateVirtualMemory के माध्यम से)।WriteProcessMemory / NtWriteVirtualMemory के माध्यम से)।VirtualProtectEx / NtProtectVirtualMemory के माध्यम से)।CreateRemoteThread अथवा NtCreateThreadEx के माध्यम से)।अतिरिक्त इंजेक्शन तकनीकों में निम्नलिखित शामिल हैं लेकिन इन्हीं तक सीमित नहीं हैं:
NtSetContextThread के माध्यम से)NtQueueApcThread के माध्यम से)RtlCreateProcessReflection का दुरुपयोग करता है, जो प्रक्रिया फोर्किंग को लागू करता है।हमारे परीक्षण में, हमने देखा कि अधिकांश EDR प्रक्रिया इंजेक्शन का पता लगाने के लिए विशिष्ट टेलीमेट्री पर ध्यान केंद्रित करते हैं। EDR मुख्य रूप से WriteProcessMemory और VirtualAllocEx, साथ ही उनके अंतर्निहित कर्नेल सिस्टम कॉल NtWriteVirtualMemory, NtAllocateVirtualMemory और NtAllocateVirtualMemoryEx के उपयोग की निगरानी करते हैं।
विंडोज नई प्रक्रियाएँ बनाने के लिए API फ़ंक्शन CreateProcessW प्रदान करता है, जैसा कि लिस्टिंग 1 में दिखाया गया है। इसके पहले तीन पैरामीटर lpCommandLine, lpEnvironment और lpStartupInfo वर्णित इंजेक्शन तकनीक के लिए प्रासंगिक हैं, क्योंकि इनका उपयोग नई प्रक्रिया में डेटा स्थानांतरित करने के लिए किया जाता है।```c
BOOL CreateProcessW(
[in, optional] LPCWSTR lpApplicationName,
[in, out, optional] LPWSTR lpCommandLine,
[in, optional] LPSECURITY_ATTRIBUTES lpProcessAttributes,
[in, optional] LPSECURITY_ATTRIBUTES lpThreadAttributes,
[in] BOOL bInheritHandles,
[in] DWORD dwCreationFlags,
[in, optional] LPVOID lpEnvironment,
[in, optional] LPCWSTR lpCurrentDirectory,
[in] LPSTARTUPINFOW lpStartupInfo,
[out] LPPROCESS_INFORMATION lpProcessInformation
);
*सूची 1: CreateProcessW Windows API फ़ंक्शन की परिभाषा*
`lpCommandLine` पैरामीटर नई प्रक्रिया के लिए कमांड लाइन निर्दिष्ट करता है। यह यूनिकोड नल-टर्मिनेटर सहित अधिकतम 32,767 यूनिकोड वर्णों तक सीमित है। यूनिकोड वेरिएंट के लिए, एक स्ट्रिंग प्रदान करना आवश्यक है जिसमें फ़ंक्शन लिख सके। यदि एक स्थिर स्ट्रिंग प्रदान की जाती है, तो API फ़ंक्शन द्वारा किए गए किसी भी लिखने के प्रयास के परिणामस्वरूप मेमोरी एक्सेस उल्लंघन होता है। यदि मान `NULL` है, तो प्रक्रिया की कमांड लाइन `lpApplicationName` पैरामीटर से ली जाएगी। यदि `lpApplicationName` `NULL` है, तो इसे `lpCommandLine` फ़ील्ड में प्रदान किया जाना चाहिए और यह `MAX_PATH` वर्णों तक सीमित है।
`lpEnvironment` पैरामीटर प्रक्रिया को पर्यावरण चरों की एक सूची प्रदान करता है। यदि मान `NULL` है, तो बनाने वाली प्रक्रिया का पर्यावरण उपयोग किया जाएगा। पर्यावरण चरों की सूची `NAME=VALUE` प्रारूप के क्रमिक नल-टर्मिनेटेड स्ट्रिंग्स से बनी होती है, जिसके अंत में एक और नल-टर्मिनेटर होता है।
`lpStartupInfo` पैरामीटर एक संरचना है जो सूची 2 में दिखाई गई है, जिसमें विंडो स्टेशन, डेस्कटॉप, मानक इनपुट और आउटपुट हैंडल जैसे फ़ील्ड हैं, साथ ही ऐसे फ़ील्ड भी हैं जो नई प्रक्रिया की मुख्य विंडो को कॉन्फ़िगर करते हैं। माइक्रोसॉफ्ट दस्तावेज़ीकरण के अनुसार, फ़ील्ड `lpReserved` आंतरिक उपयोग के लिए आरक्षित है और इसका कोई आगे का दस्तावेज़ीकरण नहीं है। WinDbg डीबगर के साथ विश्लेषण के माध्यम से, इस पैरामीटर को नई प्रक्रिया में `UNICODE_STRING` प्रकार के `ShellInfo` चर से जोड़ना संभव था।```c
typedef struct _STARTUPINFOW {
DWORD cb;
LPWSTR lpReserved; // Copied to ShellInfo (UNICODE_STRING)
LPWSTR lpDesktop;
LPWSTR lpTitle;
DWORD dwX;
DWORD dwY;
DWORD dwXSize;
// (...) additional fields
WORD wShowWindow;
WORD cbReserved2;
LPBYTE lpReserved2;
HANDLE hStdInput;
// (...) additional fields
} STARTUPINFOW, *LPSTARTUPINFOW;
Listing 2: STARTUPINFOW डेटा संरचना का लेआउट