
P³-Shellcode Loader هو أداة تحميل تنفّذ تقنية حقن كود تستفيد من بنية Process Parameters كموقع للتنفيذ والتخزين المرحلي لحقن الشيل كود في العمليات البعيدة، دون تفعيل آليات الكشف الشائعة.
المؤلفان: Max Hirschberger و Ogulcan Ugur
P³-Shellcode Loader هو أداة تحميل تنفّذ تقنية حقن كود تستفيد من بنية معاملات العملية (حقن مُعاملات العملية) كموقع تنفيذ ومرحلة تخزين لحقن كود الشل في العمليات البعيدة، دون تحفيز آليات الكشف الشائعة.
تم وصف مفهوم مشابه من قِبل الباحث الأمني modexp، الذي أظهر أن الوسائط الممرَّرة إلى واجهة CreateProcess-API يمكن استغلالها لهذا الغرض [1].
يريد المهاجمون جعل أنشطتهم تبدو أقل إثارة للشك. من خلال حقن العمليات، يستطيع المهاجمون تنفيذ أنشطتهم من عملية مختلفة تكون أكثر موثوقية أو يُتوقع منها القيام بالنشاط المحدد، مما يقلل الشك.
فيما يلي الخطوات النموذجية المطلوبة لحقن كود في عملية أخرى:
OpenProcess / NtOpenProcess أو CreateProcess / NtCreateProcess).VirtualAllocEx أو NtAllocateVirtualMemory).WriteProcessMemory / NtWriteVirtualMemory).VirtualProtectEx / NtProtectVirtualMemory).CreateRemoteThread أو NtCreateThreadEx).تشمل تقنيات الحقن الإضافية على سبيل المثال لا الحصر ما يلي:
NtSetContextThread)NtQueueApcThread)RtlCreateProcessReflection، التي تنفّذ تقسيم العمليات (process forking).
في اختباراتنا، لاحظنا أن معظم حلول EDR تركز على بيانات تتبع محددة لاكتشاف حقن العمليات. تراقب حلول EDR بشكل أساسي استخدام WriteProcessMemory و VirtualAllocEx، بالإضافة إلى استدعاءات نظام kernel الأساسية الخاصة بها NtWriteVirtualMemory و NtAllocateVirtualMemory و NtAllocateVirtualMemoryEx.توفر ويندوز دالة API CreateProcessW لإنشاء عمليات جديدة، كما هو موضح في Listing 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 حرفًا من أحرف Unicode، بما في ذلك مُنهي النهاية null الخاص بـ Unicode. بالنسبة للنسخة Unicode، من الضروري توفير سلسلة نصية يمكن للدالة الكتابة إليها. إذا تم توفير سلسلة نصية ثابتة، فإن أي محاولات كتابة تقوم بها دالة API تؤدي إلى انتهاك الوصول إلى الذاكرة. إذا كانت القيمة `NULL`، فسيتم أخذ سطر أوامر العملية من المعلمة `lpApplicationName`. إذا كانت `lpApplicationName` هي `NULL`، فيتعين توفيرها في حقل `lpCommandLine` وتكون محدودة بعدد `MAX_PATH` من الأحرف.
توفر المعلمة `lpEnvironment` قائمة بمتغيرات البيئة للعملية. إذا كانت القيمة `NULL`، فسيتم استخدام بيئة العملية المُنشِئة. تتكون قائمة متغيرات البيئة من سلاسل نصية متتالية تنتهي بـ null بالتنسيق `NAME=VALUE` مع مُنهي null إضافي في النهاية.
المعلمة `lpStartupInfo` هي بنية موضحة في القائمة 2 تحتوي على حقول مثل محطة النوافذ وسطح المكتب ومقابض الإدخال والإخراج القياسية بالإضافة إلى حقول تُهيئ النافذة الرئيسية للعملية الجديدة. وفقًا لتوثيق مايكروسوفت، فإن الحقل `lpReserved` محجوز للاستخدام الداخلي دون مزيد من التوثيق. من خلال التحليل باستخدام مصحح الأخطاء WinDbg، أمكن ربط هذه المعلمة بالمتغير `ShellInfo` من النوع `UNICODE_STRING` في العملية الجديدة.```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;
القائمة 2: تخطيط بنية بيانات STARTUPINFOW