
indirekte Syscalls für AV/EDR-Umgehung in Go-Assembly
Acheron ist eine Bibliothek, inspiriert von SysWhisper3/FreshyCalls/RecycledGate, wobei der Großteil der Funktionalität in Go-Assembly implementiert ist.
Das acheron-Paket kann verwendet werden, um Ihren Golang-Werkzeugen indirekte Syscall-Fähigkeiten hinzuzufügen und so AV/EDRs zu umgehen, die Usermode-Hooks und Instrumentation Callbacks nutzen, um anomale Syscalls zu erkennen, die nicht nach ntdll.dll zurückkehren, wenn der Aufruf von Kernel zurück zu Userland wechselt.
Die folgenden Schritte werden beim Erstellen einer neuen Syscall-Proxy-Instanz ausgeführt:
Zw*-Funktionsyscall;ret-Gadgets in ntdll.dll, die als Trampoline verwendet werdenDie Integration von acheron in Ihre Offsec-Tools ist recht einfach. Sie können das Paket mit folgendem Befehl installieren:
go get -u github.com/f1zm0/acheron
Anschließend müssen Sie nur acheron.New() aufrufen, um eine Syscall-Proxy-Instanz zu erstellen, und acheron.Syscall() verwenden, um einen indirekten Syscall für Nt*-APIs durchzuführen.
Minimalbeispiel:
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,
)
// ...
}
Die folgenden Beispiele sind im Repository enthalten:
| Beispiel | Beschreibung |
|---|---|
| sc_inject | Extrem einfaches Process-Injection-PoC, mit Unterstützung für sowohl direkte als auch indirekte Syscalls |
Andere Projekte, die acheron verwenden:
Beiträge sind willkommen! Im Folgenden sind einige Dinge aufgeführt, die in Zukunft schön wären:
Wenn Sie Vorschläge oder Ideen haben, können Sie gerne ein Issue oder einen PR eröffnen.
Der Name ist eine Anlehnung an den Fluss Acheron in der griechischen Mythologie, den Fluss, auf dem die Seelen der Toten in die Unterwelt getragen werden.
Hinweis
Dieses Projekt verwendet Semantic Versioning. Minor- und Patch-Releases sollten die Kompatibilität mit früheren Versionen nicht beeinträchtigen. Major Releases werden nur für größere Änderungen verwendet, die die Kompatibilität mit früheren Versionen brechen.
Warnung
Dieses Projekt wurde nur zu Bildungszwecken erstellt. Verwenden Sie es nicht auf Systemen, die Ihnen nicht gehören. Der Entwickler dieses Projekts übernimmt keine Verantwortung für Schäden, die durch die unsachgemäße Verwendung der Bibliothek entstehen.
Dieses Projekt ist unter der MIT-Lizenz lizenziert – siehe LICENSE-Datei für Details.
| process_snapshot | Verwendung indirekter Syscalls zum Erstellen von Prozess-Snapshots mit Syscalls |
| custom_hashfunc | Beispiel einer benutzerdefinierten Kodierungs-/Hash-Funktion, die mit acheron verwendet werden kann |