
syscalls indirectos para evasión de AV/EDR en ensamblador de Go
Acheron es una librería inspirada en SysWhisper3/FreshyCalls/RecycledGate, con la mayor parte de la funcionalidad implementada en ensamblador de Go.
El paquete acheron se puede usar para añadir capacidades de syscall indirecta a tus herramientas ofensivas en Golang, para eludir AV/EDR que utilizan hooks en modo usuario y instrumentation callbacks para detectar syscalls anómalas que no retornan a ntdll.dll cuando la transición de llamada regresa del kernel al espacio de usuario.
Se realizan los siguientes pasos al crear una nueva instancia de proxy de syscall:
Zw*syscall;ret limpios/sin hook en ntdll.dll, para usar como trampolinesIntegrar acheron en tus herramientas ofensivas es bastante fácil. Puedes instalar el paquete con:
go get -u github.com/f1zm0/acheron
Luego solo necesitas llamar a acheron.New() para crear una instancia de proxy de syscall y usar acheron.Syscall() para realizar una syscall indirecta para APIs Nt*.
Ejemplo mínimo:
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,
)
// ...
}
Los siguientes ejemplos están incluidos en el repositorio:
| Ejemplo | Descripción |
|---|---|
| sc_inject | PoC de inyección de procesos extremadamente simple, con soporte para syscalls directas e indirectas |
Otros proyectos que usan acheron:
¡Las contribuciones son bienvenidas! A continuación se presentan algunas de las cosas que sería bueno tener en el futuro:
Si tienes sugerencias o ideas, no dudes en abrir un issue o un PR.
El nombre es una referencia al río Aqueronte en la mitología griega, que es el río por donde las almas de los muertos son llevadas al inframundo.
Nota
Este proyecto usa versionado semántico. Las versiones menores y de parche no deberían romper la compatibilidad con versiones anteriores. Las versiones mayores solo se usarán para cambios importantes que rompan la compatibilidad.
Advertencia
Este proyecto ha sido creado solo con fines educativos. No lo uses en sistemas que no te pertenezcan. El desarrollador de este proyecto no es responsable de ningún daño causado por el uso inadecuado de la biblioteca.
Este proyecto está licenciado bajo la Licencia MIT - consulta el archivo LICENSE para más detalles.
| process_snapshot |
| Usando syscalls indirectas para tomar instantáneas de procesos con syscalls |
| custom_hashfunc | Ejemplo de función de codificación/hashing personalizada que se puede usar con acheron |