
chiamate di sistema indirette per elusione di AV/EDR in assembly Go
Acheron è una libreria ispirata a SysWhisper3/FreshyCalls/RecycledGate, con la maggior parte delle funzionalità implementate in assembly Go.
Il pacchetto acheron può essere utilizzato per aggiungere capacità di syscall indirette alla tua tradecraft in Golang, per bypassare AV/EDR che fanno uso di hook in modalità utente e callback di strumentazione per rilevare syscall anomale che non tornano a ntdll.dll, quando la chiamata ritorna dal kernel allo userland.
I seguenti passaggi vengono eseguiti quando si crea una nuova istanza del proxy di syscall:
Zw*syscall;ret puliti/non hookati in ntdll.dll, da usare come trampoliniIntegrare acheron nei tuoi strumenti offsec è molto semplice. Puoi installare il pacchetto con:
go get -u github.com/f1zm0/acheron
Poi basta chiamare acheron.New() per creare un'istanza del proxy di syscall e usare acheron.Syscall() per effettuare una syscall indiretta per le API Nt*.
Esempio minimale:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// crea un'istanza di Acheron, risolve i SSN, raccoglie trampolini puliti in ntdll.dll, ecc.
ach, err := acheron.New()
if err != nil {
panic(err)
}
// syscall indiretta per NtAllocateVirtualMemory
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // hash del nome della funzione
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(
"memoria allocata con NtAllocateVirtualMemory (stato: 0x%x)\n",
retcode,
)
// ...
}
I seguenti esempi sono inclusi nel repository:
| Esempio | Descrizione |
|---|---|
| sc_inject | PoC di iniezione di processo estremamente semplice, con supporto per syscall sia dirette che indirette |
Altri progetti che usano acheron:
I contributi sono benvenuti! Di seguito alcune cose che sarebbe bello avere in futuro:
Se hai suggerimenti o idee, non esitare ad aprire un issue o una PR.
Il nome è un riferimento al fiume Acheron nella mitologia greca, che è il fiume dove le anime dei morti vengono trasportate negli inferi.
Nota
Questo progetto utilizza il versionamento semantico. Le release minori e di patch non dovrebbero rompere la compatibilità con le versioni precedenti. Le release maggiori verranno utilizzate solo per modifiche importanti che rompono la compatibilità con le versioni precedenti.
Avvertenza
Questo progetto è stato creato solo a scopo educativo. Non usarlo su sistemi che non possiedi. Lo sviluppatore di questo progetto non è responsabile per eventuali danni causati dall'uso improprio della libreria.
Questo progetto è concesso in licenza MIT - vedi il file LICENSE per i dettagli.
| process_snapshot | Utilizzo di syscall indirette per acquisire snapshot di processo con syscall |
| custom_hashfunc | Esempio di funzione di codifica/hashing personalizzata che può essere usata con acheron |