
クロスプラットフォームのシステムコール駆動型インプラント&C2 — ダイレクトシステムコール(Win)、rawシステムコール(Linux)、HTTPS/DNS/ICMPチャネル。winapiレイヤーなし。
English | 简体中文 | 조선어 | Русский
WinAPI を一切使わない。すべての NT プリミティブは実行時にメモリ上の ntdll から解決され、
SYSCALL 命令は Plan9 アセンブリのスタブを介して直接発行される。インポートテーブルはなく、
ntdll のユーザーモードフックにも一切触れない。C2 は HTTPS / DNS / ICMP 経由、メッセージごとに
AES-256-GCM。Windows ネイティブ。Linux ビルド。macOS ビルド。
これは syscall ラッパーライブラリではない。コードのインジェクションからファイルの読み取り、
レジストリへの永続化に至るまで、あらゆる操作が起動時に現在の ntdll エクスポートテーブルから
解決された生の Nt* syscall を通じて行われる、完全なインプラントフレームワークである。
バイナリ内に WinAPI 呼び出しは存在しない。EDR がユーザーモードでフックできるものは何もない。
B8 xx xx 00 00 0F 05(直接)または
4C 8B D1 B8 xx xx 00 00 0F 05(Hells Gate)のプロローグスキャン。すべての関数名は
コンパイル時にハッシュ化される — バイナリ内に平文文字列は存在しない。asm_amd64.s)が SSN を EAX にロードし、
7 つの引数を手動で設定して SYSCALL を実行する。RAX/RDX 経由で戻る。0F 05 C3 ガジェット(syscall;ret)を特定し、
それを介して呼び出す。CPU トラップは ntdll 内で発生する — コールスタックには
インプラントのフレームではなく ntdll のフレームが表示される。ユーザーモードフックは生き残れない。.text を RWX にロックし、ディスクマップされた ntdll から元のバイト列を
コピーし、保護を復元し、icache をフラッシュし、SSN キャッシュを破棄する。
あらゆる EDR が仕掛けたユーザーモードフックはすべて消える。エージェントはインジェクション手法を自動的にローテーションする。各呼び出しは 異なる手法を使用する — フォレンジック上、2 つのインジェクションが同じに見えることはない。
| 手法 | 仕組み | ステルス性の理由 |
|---|---|---|
| セクションマッピング | NtCreateSection → NtMapViewOfSection(リモート) → NtCreateThreadEx | VAD に RWX 割り当てが存在しない。セクションはファイルバッキングされる。メモリスキャナには PAGE_EXECUTE_READ が見え、PAGE_EXECUTE_READWRITE は見えない。 |
| プロセスホロウ | NtCreateUserProcess(サスペンド状態) → NtSuspendProcess → イメージベースをゼロ化 → シェルコードを割り当てて書き込み → NtSetContextThread(RIP = シェルコード) → NtResumeProcess | プロセスはタスクマネージャ上で正規の svchost.exe として表示される。異なるのはメモリ内容のみ。 |
| APC キューイング | NtQuerySystemInformation でスレッドを列挙 → NtOpenThread → NtQueueApcThread | 新しいスレッドは作成されない。新しい TEB もない。新しいスタック割り当てもない。スレッドがアラータブル待機に入ったときに発火する。 |
| モジュールスタンピング | ターゲット内に割り当て → 最小限の PE ヘッダ + シェルコードを書き込み → エントリポイントで NtCreateThreadEx | モジュールリストにはもっともらしい DLL 名が表示される。PE ヘッダはモジュール列挙を欺くのに十分な妥当性を持つ。 |
すべてのチェックを実行し、スコア付きの脅威レポートを返す。Critical 時には自動破棄。
| チェック | 手法 |
|---|---|
| VM検出 | CPUIDリーフ0x40000000のハイパーバイザ署名スキャン(VMware、VirtualBox、Hyper-V、KVM、Xen、QEMU、Parallels)+ リーフ0x40000001のフォールバック |
| サンドボックス検出 | CPU数、レジストリアーティファクト(VMware Tools、VBox Guest Additions、VMware/VBoxサービス)、サンドボックスプロセススキャン(30以上の既知の名前:wireshark、procmon、x64dbg、idaなど) |
| デバッガ検出 | PEB.BeingDebugged、PEB.NtGlobalFlag、ヒープデバッグフラグ、ProcessDebugPort、ProcessDebugObjectHandle、ProcessDebugFlags、ハードウェアブレークポイントDR0-7、タイミングによるシングルステップチェック |
| タイミング異常 | RDTSCベース:NtQuerySystemInformationレイテンシの50サンプル、平均/標準偏差、サンプルの10%超が3σ分散を超えた場合にフラグ。計測オーバーヘッドを捕捉。 |
| PEB回避 | BeingDebugged、NtGlobalFlag、ProcessHeapフラグ、DebugPort、ThreadHideFromDebuggerをパッチ — すべてGSセグメント読み取り + NtWriteVirtualMemory経由。API呼び出しなし。 |
すべてNt*システムコール経由、WinAPIなし。
EnablePrivilege(index) — LUIDで任意の特権を設定EnableAllTokenPrivileges() — 一度に20の特権(Debug、Impersonate、TCB、Backup、Restoreなど)GetProcessTokenIntegrityLevel() — 強制整合性レベルを照会StealProcessToken(pid) — 別プロセスのトークンを開いて複製ImpersonateThread() / RevertToSelf()EnumVirtualMemory() — NtQueryVirtualMemory経由ですべての仮想領域を走査FindWritableExecRegions() — PAGE_EXECUTE_READWRITEでコミットされた領域を検索HideRegion() — PAGE_NOACCESSを設定してスキャナからメモリを隠すUnhideRegion() — 元の保護を復元NtCreateFile → NtReadFile / NtWriteFile → NtClose。CreateFileA、
ReadFile、WriteFile、DeleteFileWの呼び出しはゼロ。ReadFileContents()、
WriteFileContents()、DeleteFileNt()、FileExists()。
NtCreateKey → NtSetValueKey。AddRunKeyPersistence()、RemoveRunKeyPersistence()。
RegCreateKeyEx、RegSetValueEx、その他Advapi32呼び出しは一切なし。
EnumerateSystemHandles() — NtQuerySystemInformation(SystemHandleInformation)経由で
システム内のすべてのオープンハンドルを取得FindEDRHandles() — 所有者PIDを30以上の既知のEDRプロセス名
(MsSense、CrowdStrike、Sentinel、Cylance、Carbon Blackなど)と照合CloseEDRHandles() — EDRがあなたのプロセスに配置した監視ハンドルを
閉じるIsProcessMonitored() — ブール値チェック:監視されているか?NtFreeVirtualMemoryの前に3パスワイプ(ランダム → ゼロ → 1 → ゼロ)。PatchAMSI() — AmsiScanBuffer → MOV EAX, 0; RETPatchETW() — EtwEventWrite → RETPatchNtTraceEvent() — NtTraceEvent → RETPatchDbgUiRemoteBreakin() — スレッドブレークイン → RETPatchInstrumentationCallbacks() — ThreadHideFromDebugger| チャネル | ワイヤフォーマット | 前提条件 |
|---|---|---|
| HTTPS | バイナリPOST、カスタムフレーミング、ランダム化されたUA/パス | TLS証明書 |
| DNS | <idx>-<total>-<base32>サブドメイン、TXTレスポンス | DNS解決 |
| ICMPv4 | エコーリクエスト/リプライのID+seqにペイロード | rawソケット(root/Admin) |
すべてのチャネルはChannelインターフェースを実装。NTP、DoH、TURNの追加は
インターフェースを実装するだけで、エージェントの変更はゼロ。
メッセージごとのAEADとしてAES-256-GCM。メッセージごとに一意の12バイトナンス。インプラントごとの キーリング。パスフレーズベースの鍵導出が利用可能。3つのテスト、すべて合格。
voidsyscall/
syscallwin/ Direct/indirect NT syscalls + evasion
asm_amd64.s Syscall/IndirectSyscall/ReadGSBase/SetGSBase/asm_cpuid/asm_rdtsc
resolve.go PEB→LDR→ntdll walk, PE export parse, SSN cache, prologue scan
stubs.go ~25 Nt* wrappers, DirectSyscall, IndirectSyscallByHash
hash.go djb2 hash (string + UTF-16 pointer)
constants.go MEM_*, PAGE_*, THREAD_*, TOKEN_*, OBJ_*, REG_*, FILE_*, STATUS_*
unhook.go UnhookNtdll, SelfDel
peb.go PEB patching (BeingDebugged, NtGlobalFlag, Heap, DebugPort)
token.go Privilege escalation, token theft, impersonation
vad.go VAD enumeration, hide/unhide regions
files.go File I/O via Nt* syscalls
registry.go Registry persistence via Nt* syscalls
fingerprint.go SSN dump, build fingerprint, hex export/import
inject_advanced.go 4 injection methods: section mapping, hollow, APC, module stomp
antianalysis.go VM/sandbox/debug/timing detection, scored threat report
handles.go System handle enumeration, EDR handle killer
memcrypt.go Vault (re-keying XOR), SecureDelete, StackEncrypt, WipeMemory
syscallnix/ Linux/darwin raw syscalls
patches/ AMSI, ETW, NtTraceEvent, DbgUiRemoteBreakin, InstrumentationCallbacks
loader/ CreateThread/APC/module-stomp injection
channels/ HTTP, DNS (TXT), ICMP — Channel interface
crypto/ AES-256-GCM, envelope, passphrase variant (3 tests)
server/ SessionManager, Task Queue, interactive REPL
agent/ Config, beacon loop, 10 task handlers
cmd/server/main.go CLI with REPL
cmd/agent/main.go Windows-only entrypoint