
Непрямые системные вызовы для обхода AV/EDR в ассемблере Go
Acheron — это библиотека, вдохновлённая SysWhisper3/FreshyCalls/RecycledGate, с большинством функциональности, реализованной на ассемблере Go.
Пакет acheron можно использовать для добавления возможностей косвенных системных вызовов в ваш инструментарий на Golang, чтобы обходить AV/EDR, которые используют хуки в пользовательском режиме и инструментационные обратные вызовы для обнаружения аномальных системных вызовов, которые не возвращаются в ntdll.dll при переходе от ядра к пользовательскому режиму.
При создании нового экземпляра прокси системных вызовов выполняются следующие шаги:
Zw*syscall;ret гаджеты в ntdll.dll для использования в качестве трамплиновИнтегрировать acheron в ваши инструменты для пентеста довольно просто. Вы можете установить пакет с помощью:
go get -u github.com/f1zm0/acheron
Затем просто вызовите acheron.New() для создания экземпляра прокси системных вызовов и используйте acheron.Syscall() для совершения косвенного системного вызова для Nt* API.
Минимальный пример:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// creates Acheron instance, resolves SSNs, collects clean trampolines in ntdll.dlll, etc.
ach, err := acheron.New()
if err != nil {
panic(err)
}
// indirect syscall for NtAllocateVirtualMemory
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // function name hash
hSelf, // arg1: _In_ HANDLE ProcessHandle,
uintptr(unsafe.Pointer(&baseAddr)), // arg2: _Inout_ PVOID *BaseAddress,
uintptr(unsafe.Pointer(nil)), // arg3: _In_ ULONG_PTR ZeroBits,
0x1000, // arg4: _Inout_ PSIZE_T RegionSize,
windows.MEM_COMMIT|windows.MEM_RESERVE, // arg5: _In_ ULONG AllocationType,
windows.PAGE_EXECUTE_READWRITE, // arg6: _In_ ULONG Protect
); err != nil {
panic(err)
}
fmt.Printf(
"allocated memory with NtAllocateVirtualMemory (status: 0x%x)\n",
retcode,
)
// ...
}
В репозиторий включены следующие примеры:
| Пример | Описание |
|---|---|
| sc_inject | Чрезвычайно простой PoC внедрения процессов с поддержкой как прямых, так и косвенных системных вызовов |
Другие проекты, использующие acheron:
Вклад приветствуется! Ниже перечислены некоторые вещи, которые было бы хорошо иметь в будущем:
Если у вас есть предложения или идеи, не стесняйтесь открывать issue или PR.
Название отсылает к реке Ахерон в греческой мифологии, по которой души умерших переносятся в подземный мир.
Note
Этот проект использует семантическое версионирование. Минорные и патч-релизы не должны нарушать совместимость с предыдущими версиями. Мажорные релизы будут использоваться только для крупных изменений, нарушающих совместимость с предыдущими версиями.
Warning
Этот проект создан исключительно в образовательных целях. Не используйте его на системах, которые вам не принадлежат. Разработчик этого проекта не несёт ответственности за любой ущерб, причинённый неправильным использованием библиотеки.
Этот проект лицензируется по лицензии MIT — см. файл LICENSE для подробностей.
| process_snapshot |
| Использование косвенных системных вызовов для создания снимков процессов |
| custom_hashfunc | Пример пользовательской функции кодирования/хеширования, которую можно использовать с acheron |