
appels système indirects pour l'évasion AV/EDR en assembleur Go
Acheron est une bibliothèque inspirée de SysWhisper3/FreshyCalls/RecycledGate, dont la plupart des fonctionnalités sont implémentées en assembleur Go.
Le package acheron peut être utilisé pour ajouter des capacités d'appels système indirects à votre arsenal Golang, afin de contourner les AV/EDR qui utilisent des hooks en mode utilisateur et des callbacks d'instrumentation pour détecter les appels système anormaux qui ne reviennent pas à ntdll.dll lors de la transition du noyau vers l'espace utilisateur.
Les étapes suivantes sont effectuées lors de la création d'une nouvelle instance proxy d'appel système :
Zw*syscall;ret non hookés/propres dans ntdll.dll, pour être utilisés comme trampolinesIntégrer acheron dans vos outils offsec est assez simple. Vous pouvez installer le package avec :
go get -u github.com/f1zm0/acheron
Ensuite, il suffit d'appeler acheron.New() pour créer une instance proxy d'appel système et utiliser acheron.Syscall() pour effectuer un appel système indirect pour les API Nt*.
Exemple minimal :
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// crée une instance Acheron, résout les SSN, collecte les trampolines propres dans ntdll.dll, etc.
ach, err := acheron.New()
if err != nil {
panic(err)
}
// appel système indirect pour NtAllocateVirtualMemory
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // hachage du nom de la fonction
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(
"mémoire allouée avec NtAllocateVirtualMemory (status : 0x%x)\n",
retcode,
)
// ...
}
Les exemples suivants sont inclus dans le dépôt :
| Exemple | Description |
|---|---|
| sc_inject | PoC d'injection de processus extrêmement simple, avec prise en charge des appels système directs et indirects |
Autres projets qui utilisent acheron :
Les contributions sont les bienvenues ! Voici quelques éléments qui seraient agréables à voir à l'avenir :
Si vous avez des suggestions ou des idées, n'hésitez pas à ouvrir une issue ou une PR.
Le nom fait référence au fleuve Acheron dans la mythologie grecque, le fleuve sur lequel les âmes des morts sont transportées vers les enfers.
Note
Ce projet utilise le versionnement sémantique. Les versions mineures et de correctif ne devraient pas casser la compatibilité avec les versions précédentes. Les versions majeures seront utilisées uniquement pour des changements importants qui cassent la compatibilité.
Avertissement
Ce projet a été créé à des fins éducatives uniquement. Ne l'utilisez pas sur des systèmes qui ne vous appartiennent pas. Le développeur de ce projet n'est pas responsable des dommages causés par une utilisation inappropriée de la bibliothèque.
Ce projet est sous licence MIT – voir le fichier LICENSE pour plus de détails.
| process_snapshot | Utilisation d'appels système indirects pour prendre des instantanés de processus |
| custom_hashfunc | Exemple de fonction de codage/hachage personnalisée utilisable avec acheron |