SysWhispers3

Post-Exploitation не обновлялся >2 лет

Генератор заголовочных и ассемблерных файлов для прямых системных вызовов Windows, применяется для обхода перехватов AV/EDR на уровне user-mode API.


Установка
git clone https://github.com/klezVirus/SysWhispers3.git
cd SysWhispers3
python .\syswhispers.py --help
показать оригинал переведено ИИ

SysWhispers3

SysWhispers помогает обойти обнаружение, генерируя заголовочные/ASM-файлы, которые импланты могут использовать для прямого вызова системных вызовов.

Официальный Discord-канал

Заходите в Discord!

Inceptor Server

Почему чёрт возьми я не создал PR для SysWhispers2?

Причин, по которым SysWhispers3 стал отдельным проектом, много, но самые важные из них:

  • SysWhispers3 — это де-факто «форк», используемый Inceptor, и реализует некоторые утилиты, которые не актуальны для оригинальной версии инструмента.
  • SysWhispers2 переходит на поддержку компиляции с помощью NASM (для gcc/mingw), тогда как эта версия специально разработана и протестирована для поддержки MSVC (поскольку Inceptor останется фреймворком только для Windows в обозримом будущем).
  • SysWhispers3 содержит частично реализованные функции (например, поиск по «яйцам»), которые нецелесообразно включать в оригинальную версию инструмента.

Отличия от SysWhispers2

Использование похоже на SysWhispers2, за исключением следующего:

  • Поддерживается x86/WoW64
  • Поддерживается замена инструкции syscall на EGG (для динамической замены)
  • Поддерживаются прямые переходы к системным вызовам в режимах x86/x64 (в WoW64 это почти стандарт)
  • Поддерживаются прямые переходы к случайным системным вызовам (идея заимствована у @ElephantSeal)

Лучшее объяснение этих функций приведено в статье блога SysWhispers мёртв, да здравствует SysWhispers!

Введение

Продукты безопасности, такие как антивирусы и EDR, обычно устанавливают хуки в пользовательские API-функции, чтобы анализировать поток выполнения программы и выявлять потенциально вредоносную активность.

SysWhispers2 — это инструмент, предназначенный для генерации пар заголовочных/ASM-файлов для любых системных вызовов в основном образе ядра (ntoskrnl.exe), которые затем можно интегрировать и вызывать напрямую из кода на C/C++, обходя хуки в пользовательском режиме.

Однако инструмент генерирует некоторые шаблоны, которые могут быть включены в сигнатуры, или поведение, которое может быть обнаружено во время выполнения.

SysWhispers3 разработан на базе SysWhispers2 и включает некоторые полезные функции для обхода таких методов обнаружения.

Установка

C:\> git clone https://github.com/klezVirus/SysWhispers3.git
C:\> cd SysWhispers3
C:\> python .\syswhispers.py --help

Использование и примеры

Справка показывает все доступные команды и функции инструмента:

C:\>python syswhispers.py -h

usage: syswhispers.py [-h] [-p PRESET] [-a {x86,x64}] [-m {embedded,egg_hunter,jumper,jumper_randomized}] [-f FUNCTIONS] -o OUT_FILE [--int2eh] [--wow64] [-v] [-d]

SysWhispers3 - SysWhispers on steroids

optional arguments:
  -h, --help            show this help message and exit
  -p PRESET, --preset PRESET
                        Preset ("all", "common")
  -a {x86,x64}, --arch {x86,x64}
                        Architecture
  -c {msvc,mingw,all}, --compiler {msvc,mingw,all}
                        Compiler
  -m {embedded,egg_hunter,jumper,jumper_randomized}, --method {embedded,egg_hunter,jumper,jumper_randomized}
                        Syscall recovery method
  -f FUNCTIONS, --functions FUNCTIONS
                        Comma-separated functions
  -o OUT_FILE, --out-file OUT_FILE
                        Output basename (w/o extension)
  --int2eh              Use the old `int 2eh` instruction in place of `syscall`
  --wow64               Use Wow64 to run x86 on x64 (only usable with x86 architecture)
  -v, --verbose         Enable debug output
  -d, --debug           Enable syscall debug (insert software breakpoint)

Примеры команд

Стандартный SysWhispers, встроенные системные вызовы (x64)

# 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 (see below for list).
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

Примеры, уникальные для SysWhispers3

# Normal SysWhispers, 32-bits mode
py .\syswhispers.py --preset all -o syscalls_all -m jumper --arch x86

# Normal SysWhispers, using WOW64 in 32-bits mode (only specific functions)
py .\syswhispers.py --functions NtProtectVirtualMemory,NtWriteVirtualMemory -o syscalls_mem --arch x86 --wow64

# Egg-Hunting SysWhispers, to bypass the "mark of the sycall" (common function)
py .\syswhispers.py --preset common -o syscalls_common -m egg_hunter

# Jumping/Jumping Randomized SysWhispers, to bypass dynamic RIP validation (all functions) using MinGW as the compiler
py .\syswhispers.py --preset all -o syscalls_all -m jumper -c mingw


Вывод скрипта

PS C:\Projects\SysWhispers2> py .\syswhispers.py --preset common --out-file temp\syscalls_common -v 

                  .                         ,--.
,-. . . ,-. . , , |-. o ,-. ,-. ,-. ,-. ,-.  __/
`-. | | `-. |/|/  | | | `-. | | |-' |   `-. .  \
`-' `-| `-' ' '   ' ' ' `-' |-' `-' '   `-'  '''
     /|                     |  @Jackson_T
    `-'                     '  @modexpblog, 2021

                      Edits by @klezVirus,  2022
SysWhispers3: Why call the kernel when you can whisper?


Common functions selected.

Complete! Files written to:
        temp\syscalls_common.h
        temp\syscalls_common.c
        temp\syscalls_common_.asm
Press a key to continue...

Импорт в Visual Studio

  1. Скопируйте сгенерированные H/C/ASM-файлы в папку проекта.
  2. В Visual Studio перейдите в Проект → Настройка сборки... и включите MASM.
  3. В Обозревателе решений добавьте файлы .h и .c/.asm в проект как заголовочные и исходные файлы соответственно.
  4. Перейдите в свойства ASM-файла и установите Тип элемента на Microsoft Macro Assembler.

Компиляция вне Visual Studio

Windows

Makefile для 64 бит:

Makefile.msvc

OPTIONS = -Zp8 -c -nologo -Gy -Os -O1 -GR- -EHa -Oi -GS-
LIBS = libvcruntime.lib libcmt.lib ucrt.lib kernel32.lib

program:
  ML64 /c syscalls-asm.x64.asm /link /NODEFAULTLIB /RELEASE /MACHINE:X64
  cl.exe $(OPTIONS) syscalls.c  program.c
  link.exe /OUT:program.x64.exe -nologo $(LIBS) /MACHINE:X64 -subsystem:console -nodefaultlib syscalls-asm.x64.obj syscalls.obj program.obj

Makefile для 32 бит:

Makefile.msvc

OPTIONS = -Zp8 -c -nologo -Gy -Os -O1 -GR- -EHa -Oi -GS-
LIBS = libvcruntime.lib libcmt.lib ucrt.lib kernel32.lib

program:
  ML /c syscalls-asm.x86.asm /link /NODEFAULTLIB /RELEASE /MACHINE:X86
  cl.exe $(OPTIONS) syscalls.c  program.c
  link.exe /OUT:program.x86.exe -nologo $(LIBS) /MACHINE:X86 -subsystem:console -nodefaultlib syscalls-asm.x86.obj syscalls.obj program.obj

Компиляция с помощью nmake:

nmake -f Makefile.msvc

Linux

Makefile для 64 и 32 бит:

Makefile.mingw

CC_x64 := x86_64-w64-mingw32-gcc
CC_x86 := i686-w64-mingw32-gcc
OPTIONS := -masm=intel -Wall

program:
  $(CC_x64) syscalls.c program.c -o program.x64.exe $(OPTIONS)
  $(CC_x86) syscalls.c program.c -o program.x86.exe $(OPTIONS)

Компиляция с помощью make:

make -f Makefile.mingw

Ограничения и особенности

  • Функциональность Egg-Hunter не реализована в этом инструменте, она находится в Inceptor.
  • Системные вызовы из графической подсистемы (win32k.sys) не поддерживаются.
  • Тестировалось на Visual Studio 2019/2022 с Windows 10 SDK.
  • Поддержка NASM не гарантируется.
  • Поддержка GCC и MinGW не гарантируется.

Устранение неполадок

Из SysWhispers2

  • Ошибки переопределения типов: проект может не скомпилироваться, если typedef в syscalls.h уже определены.
    • Убедитесь, что включены только необходимые функции (например, --preset all редко требуется).
    • Если typedef уже определён в другом заголовочном файле, его можно удалить из syscalls.h.

Новые

  • С помощью --verbose можно включить вывод отладочной информации во время генерации кода.
  • С помощью --debug инструмент вставит программную точку останова в заглушку syscall, чтобы упростить отладку в WinDbg.
  • Если во время компиляции возникает ошибка error A2084:constant value too large, перегенерируйте заглушки.

Благодарности

SysWhispers2

Разработан @Jackson_T и @modexpblog, но основан на работе многих других:


  • @FoxHex0ne за каталогизацию множества прототипов функций и определений типов в машиночитаемом формате.
  • @PetrBenes, команда NTInternals.net и MSDN за дополнительные прототипы и определения типов.
  • @Cn33liz за первоначальную реализацию POC Dumpert.

SysWhispers2 (x86/WOW64)

  • @rooster за создание совместимого форка для x86/WOW64.

Прочие

  • @ElephantSe4l за идею рандомизации переходов к системным вызовам.
  • @S4ntiagoP за потрясающую работу над nanodump, которая дала мне массу идей.

Лицензия

Как и оригинал, этот проект также распространяется под лицензией Apache License 2.0.

Войдите, чтобы оставить комментарий