Acheron は、SysWhisper3 / FreshyCalls / RecycledGate に着想を得たライブラリで、ほとんどの機能が Go アセンブリで実装されています。
acheron パッケージを使用すると、Golang のトレードクラフトに間接システムコール機能を追加し、ユーザーモードフックや インストルメンテーションコールバック を利用して、ntdll.dll に戻らない異常なシステムコールを検出する AV/EDR をバイパスできます。
新しいシステムコールプロキシインスタンスを作成する際、以下の手順が実行されます。
Zw* 関数のシステムサービス番号を計算syscall;ret ガジェットを列挙(トランポリンとして使用)acheron をオフセックツールに統合するのは非常に簡単です。以下のコマンドでパッケージをインストールできます。
go get -u github.com/f1zm0/acheron
その後、acheron.New() を呼び出してシステムコールプロキシインスタンスを作成し、acheron.Syscall() を使用して Nt* API の間接システムコールを実行するだけです。
最小限の例:
package main
import (
"fmt"
"unsafe"
"github.com/f1zm0/acheron"
)
func main() {
var (
baseAddr uintptr
hSelf = uintptr(0xffffffffffffffff)
)
// Acheron インスタンスを作成、SSN を解決、ntdll.dll 内のクリーンなトランポリンを収集など
ach, err := acheron.New()
if err != nil {
panic(err)
}
// NtAllocateVirtualMemory の間接システムコール
s1 := ach.HashString("NtAllocateVirtualMemory")
if retcode, err := ach.Syscall(
s1, // 関数名のハッシュ
hSelf, // 引数1: _In_ HANDLE ProcessHandle,
uintptr(unsafe.Pointer(&baseAddr)), // 引数2: _Inout_ PVOID *BaseAddress,
uintptr(unsafe.Pointer(nil)), // 引数3: _In_ ULONG_PTR ZeroBits,
0x1000, // 引数4: _Inout_ PSIZE_T RegionSize,
windows.MEM_COMMIT|windows.MEM_RESERVE, // 引数5: _In_ ULONG AllocationType,
windows.PAGE_EXECUTE_READWRITE, // 引数6: _In_ ULONG Protect
); err != nil {
panic(err)
}
fmt.Printf(
"NtAllocateVirtualMemory でメモリを割り当てました (status: 0x%x)\n",
retcode,
)
// ...
}
リポジトリには以下の例が含まれています。
| 例 | 説明 |
|---|---|
| sc_inject | 非常にシンプルなプロセスインジェクション PoC。直接・間接両方のシステムコールをサポート |
| process_snapshot | 間接システムコールを使用してシステムコールでプロセススナップショットを取得 |
acheron を使用しているその他のプロジェクト:
貢献を歓迎します!以下は将来実装したい機能の一部です。
提案やアイデアがあれば、Issue または PR を遠慮なく開いてください。
この名前はギリシャ神話に登場する Acheron 川に由来しています。この川は死者の魂が冥界に運ばれる川です。
Note
このプロジェクトは セマンティックバージョニング に従っています。マイナーリリースおよびパッチリリースでは、以前のバージョンとの互換性が損なわれないようにしています。メジャーリリースは、互換性を損なう大きな変更があった場合のみ使用されます。
Warning
このプロジェクトは教育目的のみで作成されています。所有していないシステムで使用しないでください。このプロジェクトの開発者は、ライブラリの不適切な使用によって生じたいかなる損害についても責任を負いません。
このプロジェクトは MIT ライセンスの下でライセンスされています。詳細は LICENSE ファイルを参照してください。
| custom_hashfunc |
| acheron で使用可能なカスタムエンコーディング/ハッシュ関数の例 |