kube-node-health and PyPI kube-health deploying a Go chisel WebSocket RAT that silently proxies and intercepts LLM API traffic. Zero AV detections across 60+ engines at campaign time. Attacker deleted distribution infrastructure within 24 hours of public disclosure.n4k8x2m6| File | addon.node |
| SHA256 | 5d58ce3119c37f2bd552f4d883a4f4896dfcb8fb04875f844f999497e4ca846d |
| Type | ELF 64-bit shared object, NAPI C++ Node.js addon |
| Origin | npm kube-node-health |
| VT Detections | 0 / 64 |
| Entry point | napi_register_module_v1 |
| XOR key | n4k8x2m6 (8-byte repeating) |
| Blob size | 874 bytes encrypted |
| File | kube_health.so |
| SHA256 | b3405b8456f4e82f192cdff6fdd5b290a58fafda01fbc08174105b922bd7b3cf |
| Type | ELF 64-bit shared object, CPython 3.11 Cython extension |
| Origin | PyPI kube-health |
| VT Detections | 0 / 63 |
| Entry point | PyInit_kube_health |
| Decompressor | __Pyx_DecompressString (zlib) |
| Config key | KH_CFG (plain string) |
On import kube_health, the Cython init function decompresses an embedded payload blob using the Cython runtime __Pyx_DecompressString (zlib). The decompressed script reads KH_CFG and executes the same dropper logic as S2, ultimately downloading and running S4 from GitHub.
No XOR obfuscation — uses zlib compression instead. The KH_CFG config variable name is visible as a plain string, which is the primary YARA anchor for this variant.
| File | kube-diag-linux-amd64-packed |
| SHA256 | a2eea8d8fe270bae16b1fcfff6b778549a18146604ce7a355e706cbc1de442b0 |
| Type | ELF 64-bit, Go 1.21, garble-obfuscated |
| VT Detections | 3 / 65 |
| Obfuscation | garble (randomised package/func names) |
| Garble pkg 1 | _RndZzhTd |
| Garble pkg 2 | oor2y7Hoz9 |
| Garble pkg 3 | wIXGgavYUm |
| File | kube-diag-full-linux-amd64 |
| SHA256 | 000da22223cf9dd6f8b0fe2644b5f8b604f646b863b95ec88872044af9e6a337 |
| Type | ELF 64-bit, Go 1.21, full symbol table |
| VT Detections | 3 / 65 |
| Key symbol | *proxy.GPTProxy |
| Key symbol | *proxy.toolCallState |
| C2 string | wss://sync.geeker.indevs.in:443 |
| Fallback | pairconnect.ngrok-agent.com |
| Retry | Retrying in 100ms |
Critical finding: Initial execution of S4 without configuration produced an immediate exit (code 1) with no network activity, suggesting a hard gate. Disassembly of the S2 init function at offset 0x11f0 revealed the full flow: the XOR-decrypted 874-byte blob is a shell script with a placeholder for KH_CFG. The script's delivery method is a stdin pipe, not an environment variable.
| Command | echo 'BASE64_KH_CFG' | ./s4_binary |
| Log line 1 | client: TLS verification disabled |
| Log line 2 | client: Connecting to wss://sync.geeker.indevs.in:443 |
| Connections | 20+ parallel WebSocket connections within 2s |
| Retry interval | 100ms on INetSim connection reset |
| Process | Remains resident — no auto-exit |
| Capture file | dynamic/pcap_s4_c2_capture.pcap |
| Size | 121 MB (~8 min capture) |
| DNS query | sync.geeker.indevs.in → INetSim 192.168.0.2 |
| TLS SNI | sync.geeker.indevs.in (all 20+ connections) |
| ngrok | Not triggered (primary C2 reachable) |
| Registered | 2025-12-07 (Stackryze free subdomain) |
| VT last modified | 2026-04-23 (post-disclosure check) |
| VT detections | 0 / 94 |
| VT reputation | −1 (not yet flagged) |
| DNS A | 104.21.64.60, 172.67.176.169 |
| DNS AAAA | 2606:4700:3036::ac43:b0a9, 2606:4700:3035::6815:403c |
| Subdomains | 1 total (sync.geeker.indevs.in only) |
| Protocol | WSS (chisel) on port 443 |
S4 contains the hard-coded string pairconnect.ngrok-agent.com — ngrok's agent pairing infrastructure. The binary can establish a ngrok reverse tunnel as fallback if the primary chisel C2 is unreachable.
The specific ngrok URL is dynamically assigned (not visible in the binary). Monitor for outbound connections to *.ngrok-agent.com from any developer or CI host.
| String | pairconnect.ngrok-agent.com |
| VT lookup | 404 — no record (legitimate ngrok infra) |
| Detection method | Outbound DNS to *.ngrok-agent.com |
| Username | gibunxi4201 |
| Created | 2025-06-27 |
| Last active | 2026-04-18 (4 days pre-discovery) |
| Public repos | 53 |
| Language | Simplified Chinese (repo descriptions, code comments) |
| Infrastructure | kube-node-diag deleted 2026-04-25 |
| Motive | LLM API key theft (financial) |
| Attribution | LOW — Chinese-language profile, no group overlap |
S4's symbol table exposes a routing configuration for 40+ LLM API models. The proxy intercepts requests for each of these endpoints, relaying traffic to the C2 while logging API credentials. Chinese reseller backends (-xmind, -cloudsway, -shubiaobiao suffixes) indicate the attacker routes stolen credentials to Chinese API resellers for monetisation.
kube-node-health and PyPI kube-health packages masquerading as Kubernetes health-check utilities./tmp/.ns shell script written by S2 dropper; executes via execl("/bin/sh").sync.geeker.indevs.in.HackTool:Linux/Chisel.C) and log strings.n4k8x2m6. S3: garble obfuscation randomising all package and function names./tmp/.ns. S1 uses zlib decompression via Cython runtime.--tls-skip-verify). Log string: "client: TLS verification disabled".github.com/kubernetes/node-health-check in S3/S4./tmp/.ns, /tmp/.kh, /tmp/.nhc.enc, /tmp/.nhc-switch.*proxy.GPTProxy and *proxy.toolCallState implement LLM API MITM. API Bearer tokens and tool call payloads intercepted across 40+ providers.sync.geeker.indevs.in and geeker.indevs.in at your DNS resolver and perimeter TLS inspection. Do not block the Cloudflare IPs (104.21.64.60, 172.67.176.169) — they are shared infrastructure. Deploy Suricata rules SIDs 9000001–9000006.node_modules/kube-node-health/, Python environments containing kube_health, and processes running from /tmp/. paths. On Linux: geeker.indevs.in. Cloudflare — reverse proxy abuse report for sync.geeker.indevs.in. GitHub — report account gibunxi4201 (account still active as of 2026-04-25).package-lock.json and requirements.txt. Flag any npm package shipping a .node NAPI addon for security review. Add kube-* package allowlists to internal registries. Monitor for outbound WSS connections with Upgrade: websocket headers from developer workstations.