
chamadas de sistema indiretas para evasão de AV/EDR em assembly Go
Acheron é uma biblioteca inspirada em SysWhisper3/FreshyCalls/RecycledGate, com a maior parte da funcionalidade implementada em assembly Go.
O pacote acheron pode ser usado para adicionar capacidades de syscall indireta às suas ferramentas em Golang, para contornar AVs/EDRs que utilizam hooks em modo de usuário e instrumentation callbacks para detectar syscalls anômalas que não retornam à ntdll.dll quando a transição de kernel para userland ocorre.
Os seguintes passos são executados ao criar uma nova instância de proxy de syscall:
Zw*syscall;ret limpos (sem hooks) na ntdll.dll, para serem usados como trampolinsIntegrar o acheron nas suas ferramentas offsec é bastante fácil. Pode instalar o pacote com:
go get -u github.com/f1zm0/acheron
Depois, basta chamar acheron.New() para criar uma instância de proxy de syscall e usar acheron.Syscall() para fazer uma syscall indireta para APIs Nt*.
Exemplo mínimo:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// cria instância Acheron, resolve SSNs, coleta trampolins limpos na ntdll.dll, etc.
ach, err := acheron.New()
if err != nil {
panic(err)
}
// syscall indireta para NtAllocateVirtualMemory
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // hash do nome da função
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(
"memória alocada com NtAllocateVirtualMemory (status: 0x%x)\n",
retcode,
)
// ...
}
Os seguintes exemplos estão incluídos no repositório:
| Exemplo | Descrição |
|---|---|
| sc_inject | Prova de conceito extremamente simples de injeção de processo, com suporte a syscalls diretas e indiretas |
Outros projetos que usam acheron:
Contribuições são bem-vindas! Abaixo estão algumas das coisas que seria bom ter no futuro:
Se tiver sugestões ou ideias, sinta-se à vontade para abrir uma issue ou um PR.
O nome é uma referência ao rio Acheron na mitologia grega, que é o rio onde as almas dos mortos são levadas para o submundo.
Nota
Este projeto utiliza versionamento semântico. Lançamentos menores e de patch não devem quebrar a compatibilidade com versões anteriores. Lançamentos principais serão usados apenas para mudanças significativas que quebrem a compatibilidade com versões anteriores.
Aviso
Este projeto foi criado apenas para fins educacionais. Não o utilize em sistemas que não lhe pertencem. O desenvolvedor deste projeto não é responsável por qualquer dano causado pelo uso inadequado da biblioteca.
Este projeto está licenciado sob a Licença MIT - veja o arquivo LICENSE para mais detalhes.
| process_snapshot | Utilização de syscalls indiretas para tirar snapshots de processo com syscalls. |
| custom_hashfunc | Exemplo de função personalizada de codificação/hashing que pode ser usada com acheron. |