Toy Ghouls — "Angry Birds" MQTT / Matrix Backdoor Hunt
Executive Summary
Toy Ghouls — a financially motivated group tracked since 2025 under the aliases Bearlyfy, Laboo.boo, and Feral Wolf, and previously observed deploying the custom GenieLocker ransomware against Russian manufacturing organizations — has added a custom backdoor family to its toolkit for the first time. Kaspersky's 4 September 2026 Securelist post ("Angry Birds: Toy Ghouls' new toys") documents two backdoor variants, mqtt-bird-agent (shipped as cplsupport.exe) and matrix-bird-agent (shipped as wtass.exe), delivered over Windows Remote Management using Evil-WinRM and WinRM-fs and installed as persistent Windows services. The attacker's objective is durable, low-noise remote control of compromised Windows hosts: both variants encrypt their configuration with ChaCha20-Poly1305 keyed to the machine's own MachineGuid, execute operator commands via PowerShell or cmd.exe, and — most notably — route their command-and-control traffic through two legitimate, widely used public services: the free-tier HiveMQ MQTT broker (broker.hivemq.com) and an attacker-run Matrix/Element homeserver (meet.element.tw).
The highest-value defensive angle is that, despite the novel C2 channel, the backdoor's footprint on disk and in the registry is small, specific, and vendor-attributed: two literal binary names and MD5 hashes, two literal Windows service names that masquerade as built-in components, and two non-standard registry keys. None of these collide with legitimate software, so hunting them (queries Q1–Q5 below) carries essentially zero false-positive risk. The C2 channel itself is the hard part — broker.hivemq.com and ip-api.com are legitimate infrastructure used by countless benign applications, so those signals must be hunted as anomalous-context indicators, never as blocklist entries.
broker.hivemq.com or ip-api.com to any block/prevent policy: both are legitimate public services and blocking them will break unrelated legitimate traffic. Hunt them contextually with Q8/Q9 instead.
Source Review & Web Hunter Notes
Four sources were fetched and saved verbatim as plain-text snapshots in ToyGhouls-MQTT-Matrix-C2-Hunt-sources/ before any indicator was carried into this pack. A fifth candidate source (hackread.com's coverage of the same story) returned HTTP 403 on every fetch attempt and was dropped — it is cited nowhere in this pack and no indicator is sourced from it. No fetched content attempted to issue instructions, redirect research, or claim operator authority; all four snapshots are ordinary vendor/security-journalism prose.
| Tier | Source | Key Finding | Carry Forward |
|---|---|---|---|
| T1 Vendor | Kaspersky Securelist — "Angry Birds: Toy Ghouls' new toys" (04 Sep 2026) | Primary technical disclosure: delivery via WinRM/Evil-WinRM, install options, ChaCha20-Poly1305 config encryption keyed to MachineGuid, full HiveMQ and Matrix/Element C2 protocol detail, binary names/hashes, service names, registry keys | Yes — primary source for all atomic IOCs and behavioral detail |
| T1 Vendor | Kaspersky Securelist — "Toy Ghouls' new toy: the GenieLocker ransomware" (30 Jul 2026) | Actor background: prior TTPs (OpenVPN partner-trust abuse, Mimikatz, PsExec/PAExec, RDP/SSH lateral movement), aliases, motivation, and the GenieLocker ransomware this group deploys after gaining a foothold | Partial — actor context and exec-summary framing only; no atomic IOC from this source ships in this pack's CQL/IOA content |
| T2 Secondary | SecurityOnline.info — "Toy Ghouls Backdoor Uses HiveMQ and Element for C2" (04 Sep 2026) | Independent corroboration of the Kaspersky findings; adds defender-guidance framing (monitor Evil-WinRM/WinRM-fs, outbound MQTT/Matrix, hidden PowerShell) | Partial — corroboration and response-guidance framing only, no new atomic IOCs |
| T2 Secondary | GBHackers — HiveMQ/Element backdoor coverage (on/around 04 Sep 2026) | Independent corroboration of binaries, C2 domains, and delivery mechanism (fetch tool returned a factual summary rather than verbatim text due to copyright handling) | Partial — corroboration only, no new atomic IOCs |
Dropped source: hackread.com ("Toy Ghouls Targets Russian Organizations With New Windows Backdoors") — returned HTTP 403 on every fetch attempt (direct fetch and tool-mediated fetch). Not cited, no indicator sourced from it.
Hostile-content check: none of the four saved snapshots contained embedded instructions, prompt-injection attempts, or claims of operator/user authority. All fetched text was treated as intelligence data, never as directives.
Hunt Brief & Attack Chain
Hunt hypotheses
- (High) The backdoor binaries execute under their vendor-attributed names
cplsupport.exe/wtass.exe— a filename + hash hunt with near-zero collision risk. → Q1 - (High) Persistence is installed as a Windows service under one of exactly two literal names,
cplsupportorwtas— a service-creation hunt with near-zero collision risk. → Q2 - (High) The sealed configuration lands in two non-standard registry locations (
...\synapse\Config\SealedConfig,...\SynapseAgent\metrics_interval) that no legitimate software is known to use. → Q3 - (High) The Element variant's C2 homeserver is a specific attacker-registered hostname,
meet.element.tw, distinct from the legitimate element.io/matrix.org services. → Q4 - (High) Both variants execute operator commands via PowerShell or cmd.exe launched directly as a child of the backdoor process/service. → Q5
- (Medium) The
-NonInteractive -NoProfile -CommandPowerShell flag combination, broadened beyond the specific backdoor parent, is a general hidden-automation signal worth an environment-wide hunt — at the cost of high false-positive volume from legitimate RMM/DevOps tooling. → Q6 - (Medium) WinRM-delivered payloads spawn child processes under
wsmprovhost.exe— a broad Evil-WinRM/legitimate-remoting signal that needs heavy scoping. → Q7 - (Medium) An unexpected process making contact with the public HiveMQ broker (
broker.hivemq.com, port 8883) is anomalous-context, never a blocklist signal, and needs correlation with Q1–Q3 to be actionable. → Q8 - (Low-Medium) An unexpected process querying
ip-api.comfor geolocation is a weak recon signal on its own (legitimate services use it constantly) but useful as an enrichment pivot once another Toy Ghouls indicator has fired. → Q9 - (Medium) Any new Windows service whose image path resolves under
%PROGRAMDATA%is a broader, noisier companion to hypothesis 2 that catches variants using different service names. → Q10
Attack chain
| Step | Behavior | Telemetry | Hunt Angle |
|---|---|---|---|
| 1 | Initial access / delivery via WinRM using Evil-WinRM and WinRM-fs | Process (wsmprovhost.exe children), network (5985/5986), auth logs | Q7 (broad, needs tuning) |
| 2 | Ingress tool transfer — backdoor binary + config.toml copied to the target over the WinRM-fs channel | File-write telemetry (generic filename, not independently hunted — see Coverage Gaps) | Gap — no dedicated query; config.toml alone is too generic to hunt |
| 3 | Execution / installation with --install (HiveMQ) or install (Element) | Process execution (cplsupport.exe, wtass.exe) | Q1 |
| 4 | Persistence as a Windows service (cplsupport, wtas), masquerading as built-in Windows components | Service creation | Q2, Q10 |
| 5 | Config sealed with ChaCha20-Poly1305 keyed to MachineGuid; Element variant deletes its config file and persists to the registry instead | Registry write (SealedConfig, metrics_interval) | Q3 |
| 6 | Discovery — geolocation lookup against http://ip-api.com/json | DNS / outbound HTTP | Q9 (enrichment only) |
| 7 | Command and control — HiveMQ MQTT broker (broker.hivemq.com:8883) or Matrix/Element homeserver (meet.element.tw) | DNS / outbound network | Q8 (anomalous-context), Q4 (attacker infra) |
| 8 | Command execution — hidden PowerShell (HiveMQ variant) or Windows command line (Element variant) | Process execution, parent-child | Q5, Q6 |
| 9 | (Related, out of scope here) Escalation to GenieLocker ransomware via separately reported TTPs — OpenVPN partner-trust abuse, Mimikatz, PsExec/PAExec, RDP/SSH lateral movement | n/a to this pack | Not hunted — see Coverage Map gap; recommend a dedicated GenieLocker hunt pack |
Consolidated IOC Table
| Type | Value | Confidence | Action | Context | Expiry |
|---|---|---|---|---|---|
| MD5 | BFADBEEE63A4F0BF19EC9DEB8FA58F58 | high | detect | cplsupport.exe — HiveMQ variant (mqtt-bird-agent) | 2027-03-13 |
| MD5 | 7916C33688385525078BEE504C90F359 | high | detect | wtass.exe — Element variant (matrix-bird-agent) | 2027-03-13 |
| Domain | meet.element.tw | high | detect | Attacker-controlled Matrix/Element homeserver, C2 for the Element variant | 2027-03-13 |
| Filename | config.toml | medium | hunt | Backdoor configuration file (generic name — do not detect/block on filename alone) | 2026-12-13 |
| Service name | cplsupport | high | hunt | Masquerades as "Problem Reports Control Panel" | 2027-03-13 |
| Service name | wtas | high | hunt | Masquerades as "Windows Telemetry Aggregator Service" | 2027-03-13 |
| Registry key | HKLM\Software\synapse\Config\SealedConfig | high | hunt | Sealed backdoor configuration (Element variant) | 2027-03-13 |
| Registry key | HKLM\Software\SynapseAgent\metrics_interval | high | hunt | Backdoor telemetry interval setting (Element variant) | 2027-03-13 |
| Domain | broker.hivemq.com | high | enrich | LEGITIMATE public MQTT broker abused as C2 — never detect/block; use only as an anomalous-context signal correlated with other hits | 2026-10-13 |
| Domain | ip-api.com | medium | enrich | LEGITIMATE geolocation API abused for recon — never detect/block; use only as an anomalous-context signal | 2026-10-13 |
| Account name | panel-bot | medium | pivot | Element/Matrix room account used by the attackers to send commands (recovered from Element SQLite databases on compromised hosts) — useful when hunting on a compromised Matrix client, not a network-detectable indicator | 2026-12-13 |
Affected Surface & Telemetry Matrix
| Surface | Telemetry Required | Priority | Gap Risk |
|---|---|---|---|
| Windows endpoints/servers with WinRM enabled | Falcon process (ProcessRollup2/SyntheticProcessRollup2), network (NetworkConnectIP4, DnsRequest), registry (RegGenericValueUpdate), service creation (CreateService) | High | Low — all Falcon-native |
| Network egress path to public internet (MQTT/Matrix C2) | DNS resolution logs, NetworkConnectIP4 metadata (domain/IP/port only) | High | Medium — Falcon does not decode MQTT/Matrix application payloads, only connection metadata; full message content requires a network capture or proxy/SWG log outside Falcon's scope |
| Windows Remote Management service | Process telemetry for wsmprovhost.exe children; native Microsoft-Windows-WinRM/Operational event log as a fallback | Medium-High | Medium — WinRM is used for extensive legitimate remote administration; isolating malicious sessions requires correlation, not a single query |
| Local Element/Matrix client artifacts (SQLite databases) on a compromised host | Not Falcon-native; requires host-based forensic collection (RTR script or offline triage) to recover the panel-bot account and room history | Medium | High — no EDR telemetry surfaces Element client-side SQLite content; this is a manual IR step, not a scheduled hunt |
ATT&CK Mapping
| Tactic | Technique ID | Technique Name | Observed Behavior |
|---|---|---|---|
| Initial Access / Lateral Movement | T1021.006 | Remote Services: Windows Remote Management | Delivery via Evil-WinRM and WinRM-fs |
| Command and Control | T1105 | Ingress Tool Transfer | Backdoor binary and config.toml copied to the target over WinRM-fs |
| Persistence | T1543.003 | Create or Modify System Process: Windows Service | --install / install registers the backdoor as a Windows service |
| Defense Evasion | T1036.005 | Masquerading: Match Legitimate Name or Location | Service names "cplsupport" (Problem Reports Control Panel) and "wtas" (Windows Telemetry Aggregator Service) impersonate built-in components |
| Persistence / Defense Evasion | T1112 | Modify Registry | Sealed config and metrics interval written to HKLM\Software\synapse\Config\SealedConfig / HKLM\Software\SynapseAgent\metrics_interval |
| Defense Evasion | T1027 | Obfuscated Files or Information | Configuration encrypted with ChaCha20-Poly1305, keyed to the host's MachineGuid, binding it to the infected machine |
| Command and Control | T1102.002 | Web Service: Bidirectional Communication | Public HiveMQ MQTT broker and an attacker-run Matrix/Element homeserver used to relay commands and results |
| Command and Control | T1071 | Application Layer Protocol | MQTT and Matrix application protocols carry status/metrics/command traffic |
| Execution | T1059.001 | Command and Scripting Interpreter: PowerShell | HiveMQ variant executes operator commands via PowerShell.exe -NonInteractive -NoProfile -Command |
| Discovery | T1614 | System Location Discovery | Both variants query http://ip-api.com/json at startup for public IP and country |
Native Audit-Log Hunts
Use these when Falcon coverage is incomplete or as a second, independent data source to corroborate a Falcon hit.
- Windows Security Event ID 4697 ("A service was installed in the system") or System log Event ID 7045 (Service Control Manager) — filter
ServiceNameforcplsupportorwtas, orServiceFileNamefor a path under%PROGRAMDATA%. Microsoft-Windows-WinRM/Operationalevent log — inbound WinRM session establishment events, correlated against your known jump-host/admin-subnet allowlist; anything outside it warrants review.- Sysmon Event ID 13 (registry value set), if Sysmon is deployed alongside Falcon — filter
TargetObjectfor...\synapse\Config\SealedConfigor...\SynapseAgent\metrics_intervalas an independent corroboration of Q3. - Third-party AV/EDR console verdicts — in mixed-vendor environments running Kaspersky alongside Falcon, search AV console history for the verdict names
HEUR:Backdoor.Win64.Suptoml.gen,HEUR:Trojan.Script.Zapchast.conf,Backdoor.Win64.Agent.smgdvy,Trojan.Script.Zapchast.abwm,Trojan.Win64.Agent.smgsfo, orTrojan.Script.Zapchast.abwo(all from the Kaspersky Securelist advisory). - PowerShell
Microsoft-Windows-PowerShell/OperationalEvent ID 4104 (ScriptBlock logging, if enabled per Section 12) — search block text for the literal flag combination-NonInteractive -NoProfile -Commandpaired with an unusual parent process, to corroborate Q5/Q6 without Falcon.
CrowdStrike LogScale CQL Hunt Queries
Looks for: execution of the two vendor-attributed backdoor binaries by their literal filenames. Promotion: Custom IOA candidate.
// HUNT: Angry Birds backdoor process execution (cplsupport.exe / wtass.exe) // MITRE: T1036.005, T1204.002 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: none expected -- these binary names are not shipped by Microsoft or any known legitimate vendor // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^(cplsupport|wtass)\.exe$/i | table([ComputerName, UserName, FileName, ImageFileName, CommandLine, MD5HashData, SHA256HashData, ParentBaseFileName, timestamp])
Looks for: a new Windows service registered under either literal malicious service name. Promotion: Custom IOA candidate.
// HUNT: Malicious Windows service creation -- cplsupport / wtas masquerading services // MITRE: T1543.003, T1036.005 // CONF: high FP: low COST: low // REQUIRES: CreateService // FALSE POSITIVES: none expected -- "cplsupport" and "wtas" are not real Windows or third-party service names; the genuine components they impersonate ("Problem Reports Control Panel", "Windows Telemetry Aggregator Service") do not exist under these literal ServiceName values // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=CreateService | ServiceName=/^(cplsupport|wtas)$/i | table([ComputerName, UserName, ServiceName, ServiceDisplayName, ServiceImagePath, timestamp])
Looks for: writes to the two non-standard registry locations the Element variant uses for its sealed configuration and telemetry interval. Promotion: Custom IOA candidate.
// HUNT: Toy Ghouls sealed-config / metrics-interval registry writes // MITRE: T1112, T1027 // CONF: high FP: low COST: low // REQUIRES: RegGenericValueUpdate, RegSystemConfigValueUpdate // FALSE POSITIVES: none expected -- "synapse\Config\SealedConfig" and "SynapseAgent\metrics_interval" are not standard Windows or known third-party registry paths // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=/RegGenericValueUpdate|RegSystemConfigValueUpdate/ | RegObjectName=/synapse.*SealedConfig$|SynapseAgent.*metrics_interval$/i | table([ComputerName, UserName, RegObjectName, RegValueName, RegStringValue, timestamp])
Looks for: DNS resolution of the attacker-registered Matrix/Element homeserver used exclusively by the Element-variant backdoor. This is attacker-owned infrastructure, unlike HiveMQ/ip-api.com, so it is safe to treat as a detect-grade indicator. Promotion: Custom IOA candidate.
// HUNT: Matrix/Element attacker C2 homeserver contact (meet.element.tw) // MITRE: T1102.002, T1071 // CONF: high FP: low COST: low // REQUIRES: DnsRequest // FALSE POSITIVES: low -- meet.element.tw is an attacker-registered homeserver, distinct from the legitimate element.io / matrix.org services; confirm it is not a documented internal Matrix deployment before escalating // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=DnsRequest | DomainName=/^meet\.element\.tw$/i | table([ComputerName, UserName, ContextBaseFileName, DomainName, timestamp])
Looks for: the HiveMQ variant's documented command-execution pattern (hidden, non-interactive PowerShell) with its parent process locked to the backdoor binary itself, which keeps false positives at essentially zero. Promotion: Custom IOA candidate.
// HUNT: PowerShell hidden execution spawned directly by cplsupport.exe / wtass.exe // MITRE: T1059.001, T1543.003 // CONF: high FP: low COST: low // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: none expected -- the parent process is itself a vendor-attributed backdoor binary; legitimate software does not spawn PowerShell from a process named cplsupport.exe or wtass.exe // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^powershell\.exe$/i | ParentBaseFileName=/^(cplsupport|wtass)\.exe$/i | table([ComputerName, UserName, ParentBaseFileName, CommandLine, timestamp])
Looks for: the HiveMQ variant's exact flag combination (-NonInteractive -NoProfile -Command) fleet-wide, regardless of parent process, to catch a renamed or re-parented copy of the backdoor. FP: RMM tools, SCCM/Intune baseline enforcement, Ansible/Chef/Puppet, and CI/CD runners all legitimately launch PowerShell with this exact flag set -- this is Investigate-only, not an IOA candidate, until tuned to your environment.
// HUNT: Environment-wide hidden/non-interactive PowerShell execution // MITRE: T1059.001 // CONF: medium FP: high COST: medium // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: RMM agents, SCCM/Intune, Ansible/Chef/Puppet, CI/CD runners, and AV/EDR update scripts all legitimately combine -NonInteractive -NoProfile -Command // TUNING: exclude known automation parents, e.g. add a stage "| !in(ParentBaseFileName, values=[\"ccmexec.exe\",\"SenseIR.exe\",\"MsMpEng.exe\",\"TeamsUpdate.exe\",\"WindowsTerminal.exe\",\"explorer.exe\",\"code.exe\"])" and scope to servers/workstations that have no known automation baseline // LOOKBACK: 24h -- set the window with the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | FileName=/^powershell\.exe$/i | CommandLine=/-NonInteractive/i | CommandLine=/-NoProfile/i | CommandLine=/-Command/i | !in(ParentBaseFileName, values=["ccmexec.exe","SenseIR.exe","MsMpEng.exe","TeamsUpdate.exe","WindowsTerminal.exe","explorer.exe","code.exe"]) | table([ComputerName, UserName, ParentBaseFileName, CommandLine, timestamp])
Looks for: any process created as a child of wsmprovhost.exe (the WinRM provider host), which is the process-tree fingerprint of a remote PowerShell/WinRM session including Evil-WinRM. FP: legitimate PowerShell Remoting, DSC, Ansible's winrm connection plugin, SCOM/SCCM remoting, and help-desk tooling all spawn children this same way -- this is Investigate-only until scoped to your environment's expected WinRM sources.
// HUNT: Child process spawned via WinRM provider host (possible Evil-WinRM / WinRM-fs delivery) // MITRE: T1021.006, T1105 // CONF: medium FP: high COST: medium // REQUIRES: ProcessRollup2, SyntheticProcessRollup2 // FALSE POSITIVES: PowerShell Remoting, DSC, Ansible (winrm plugin), SCOM/SCCM, and legitimate help-desk remoting all spawn children under wsmprovhost.exe // TUNING: exclude known jump hosts and automation service accounts, e.g. add a stage "| !in(ComputerName, values=[\"REPLACE_WITH_KNOWN_JUMPHOST\"])" and "| !in(UserName, values=[\"REPLACE_WITH_AUTOMATION_SVC_ACCOUNT\"])" once you have baselined legitimate WinRM sources // LOOKBACK: 24h -- set the window with the console time picker #event_simpleName=/ProcessRollup2|SyntheticProcessRollup2/ | ParentBaseFileName=/^wsmprovhost\.exe$/i | table([ComputerName, UserName, ParentBaseFileName, FileName, CommandLine, timestamp])
Looks for: DNS resolution of broker.hivemq.com or an outbound connection on MQTT's TLS port 8883, from a process that is not a known browser or MQTT client. FP: broker.hivemq.com is a LEGITIMATE free-tier public broker used by countless IoT platforms, dev/test tooling, and monitoring agents. Do not add this domain or its IPs to any blocklist -- treat a hit as anomalous context only, and escalate solely when it correlates with a Q1-Q3 hit on the same host.
// HUNT: Anomalous process contacting the public HiveMQ MQTT broker (broker.hivemq.com:8883) // MITRE: T1102.002, T1071 // CONF: medium FP: high COST: medium // REQUIRES: DnsRequest, NetworkConnectIP4 // FALSE POSITIVES: broker.hivemq.com is a LEGITIMATE public MQTT broker used by IoT platforms, dev/test tooling, and monitoring agents -- do NOT treat a hit alone as malicious and never add this domain/IP to a blocklist. Escalate only when the connecting process is unexpected or correlates with Q1-Q3. // TUNING: exclude known-good MQTT client processes and IoT/OT segments, e.g. add "| !in(ContextBaseFileName, values=[\"chrome.exe\",\"msedge.exe\",\"firefox.exe\",\"mosquitto.exe\",\"node.exe\"])" and scope this hunt to standard corporate endpoint subnets, not IoT/OT segments where HiveMQ traffic is expected // LOOKBACK: 24h -- set the window with the console time picker #event_simpleName=/DnsRequest|NetworkConnectIP4/ | DomainName=/^broker\.hivemq\.com$/i or RemotePort=8883 | !in(ContextBaseFileName, values=["chrome.exe","msedge.exe","firefox.exe","mosquitto.exe","node.exe"]) | table([ComputerName, UserName, ContextBaseFileName, DomainName, RemoteAddressIP4, RemotePort, timestamp])
Looks for: DNS resolution of ip-api.com, the geolocation service both backdoor variants query at startup. FP: ip-api.com is queried by countless legitimate applications, installers, and browser extensions. Do not blocklist this domain -- it is only useful as an enrichment pivot once a Q1-Q5 hit already exists on the same host.
// HUNT: Anomalous ip-api.com geolocation lookup (recon/enrichment signal, not a standalone alert) // MITRE: T1614 // CONF: low FP: high COST: low // REQUIRES: DnsRequest // FALSE POSITIVES: ip-api.com is a LEGITIMATE geolocation API used by countless legitimate applications and installers -- never blocklist; use only to enrich/correlate with Q1-Q5 hits on the same host // TUNING: exclude browsers and known installers/updaters, e.g. add "| !in(ContextBaseFileName, values=[\"chrome.exe\",\"msedge.exe\",\"firefox.exe\",\"curl.exe\",\"MicrosoftEdgeUpdate.exe\"])" // LOOKBACK: 24h -- set the window with the console time picker #event_simpleName=DnsRequest | DomainName=/^ip-api\.com$/i | !in(ContextBaseFileName, values=["chrome.exe","msedge.exe","firefox.exe","curl.exe","MicrosoftEdgeUpdate.exe"]) | table([ComputerName, UserName, ContextBaseFileName, DomainName, timestamp])
Looks for: any newly created service whose binary path resolves under %PROGRAMDATA% -- both backdoor variants default to %PROGRAMDATA%\cplsupport\ or %PROGRAMDATA%\SynapseAgent\. Broader companion to Q2 that survives a service-name change. FP: some legitimate backup, monitoring, and third-party EDR agents also install into ProgramData.
// HUNT: New Windows service with a ProgramData-rooted image path // MITRE: T1543.003, T1036.005 // CONF: medium FP: medium COST: low // REQUIRES: CreateService // FALSE POSITIVES: some legitimate backup, monitoring, and third-party EDR agents also install into ProgramData -- this is a broader, noisier companion to Q2, not a standalone high-confidence alert // TUNING: exclude known-good ProgramData-based services after a one-time baseline, e.g. add "| !in(ServiceName, values=[\"REPLACE_WITH_YOUR_KNOWN_AGENT_SVC\"])" // LOOKBACK: 30d -- set the window with the console time picker #event_simpleName=CreateService | ServiceImagePath = "*\\ProgramData\\*" | table([ComputerName, ServiceName, ServiceDisplayName, ServiceImagePath, timestamp])
CrowdStrike Custom IOA Recommendations
Promote the five high-confidence, low-FP queries to Custom IOA rules (Falcon console: Configuration → Custom IOA Rule Groups) or Next-Gen SIEM Scheduled Searches. Keep Q6-Q10 as Investigate-only hunt queries — their false-positive rate is too high for automated response without environment-specific tuning.
IOA / Scheduled Search candidates
| Name | Pattern | Exclusions | Deployment Path |
|---|---|---|---|
| HUNT: Toy Ghouls - Backdoor Binary Execution | FileName matches cplsupport.exe / wtass.exe | None required | Custom IOA (block or detect) — safe to set to Block after a 14-day silent detect-only run |
| HUNT: Toy Ghouls - Malicious Service Creation | ServiceName equals cplsupport / wtas | None required | Custom IOA (detect) — service creation IOAs default to detect-only in most tenants |
| HUNT: Toy Ghouls - Sealed Config Registry Write | RegObjectName matches synapse\Config\SealedConfig or SynapseAgent\metrics_interval | None required | Scheduled Search (LogScale) — registry IOAs are less commonly supported than process/file IOAs; run as a scheduled search alerting to SOC queue |
| HUNT: Toy Ghouls - Matrix/Element C2 Domain Contact | DomainName equals meet.element.tw | Confirm no internal Matrix homeserver shares this hostname | Custom IOA (detect) or Falcon Custom IOC (domain, detect action) |
| HUNT: Toy Ghouls - PowerShell Spawned by Backdoor Process | FileName=powershell.exe AND ParentBaseFileName matches cplsupport.exe/wtass.exe | None required | Custom IOA (detect) — pairs naturally with the binary-execution IOA above |
Alert package summary (for the five IOA candidates above)
Subject: [HIGH] Detection: Toy Ghouls Angry Birds Backdoor — Binary/Service/Registry/C2 Match
Body guidance: State which specific indicator fired (binary name, service name, registry key, or C2 domain), the host and user context, and note that this backdoor family grants full remote command execution — treat any hit as a confirmed compromise, not a suspicious anomaly, given the near-zero false-positive rate of Q1-Q5.
Triage checklist:
- Confirm the event type —
ProcessRollup2/CreateService/RegGenericValueUpdatemeans it executed/persisted; a correspondingProcessBlockedmeans Falcon prevention already stopped it. - Pull the host's full process tree around the hit — identify how the binary arrived (look for a
wsmprovhost.exeancestor, per Q7). - Check for the companion service (Q2/Q10) and registry keys (Q3) on the same host — Toy Ghouls installs all three together.
- Pivot to Q8/Q9 on the same host and timeframe to identify which C2 channel (HiveMQ or Matrix/Element) is in use.
- Check authentication logs for the WinRM session that likely delivered the binary — identify the source account and source host.
- Isolate the host via Falcon RTR once C2 contact is confirmed (see Containment Runbook, Section 14).
- Hunt fleet-wide for the same MD5/service/registry key — Toy Ghouls has historically moved laterally before this stage.
Pivot queries: host-scoped variants of Q1/Q3/Q4/Q8/Q9 filtered to the affected ComputerName, plus an environment-wide re-run of Q1-Q4 to check for additional infected hosts.
Machine-Readable IOC Appendix
type,value,action,severity,expiration,description,tags md5,BFADBEEE63A4F0BF19EC9DEB8FA58F58,detect,high,2027-03-13,Toy Ghouls Angry Birds backdoor (HiveMQ variant) cplsupport.exe,campaign:ToyGhouls md5,7916C33688385525078BEE504C90F359,detect,high,2027-03-13,Toy Ghouls Angry Birds backdoor (Element variant) wtass.exe,campaign:ToyGhouls domain,meet.element.tw,detect,high,2027-03-13,Toy Ghouls attacker-controlled Matrix/Element homeserver C2,campaign:ToyGhouls
# Not literal IOCs -- paste directly into Q1-Q5/Q10 above, or your own IOA builder ServiceName: cplsupport (masquerades as "Problem Reports Control Panel") ServiceName: wtas (masquerades as "Windows Telemetry Aggregator Service") RegObjectName: HKLM\Software\synapse\Config\SealedConfig RegObjectName: HKLM\Software\SynapseAgent\metrics_interval Default config path (HiveMQ variant): %PROGRAMDATA%\cplsupport\config.toml Default config path (Element variant): %PROGRAMDATA%\SynapseAgent\config.toml CLI help flags observed: --install / --uninstall / --seal / -c,--config (HiveMQ); install / uninstall / service / -c,--config (Element) Command execution: PowerShell.exe -NonInteractive -NoProfile -Command (HiveMQ) ; Windows command line (Element)
Backdoor family: "Angry Birds" (Kaspersky naming) - mqtt-bird-agent 0.1.0 (binary: cplsupport.exe) - matrix-bird-agent 0.1.0 (binary: wtass.exe) Delivery tooling: Evil-WinRM, WinRM-fs Threat actor: Toy Ghouls / Bearlyfy / Laboo.boo / Feral Wolf Related follow-on ransomware (separate hunt pack recommended): GenieLocker Kaspersky verdict names: HEUR:Backdoor.Win64.Suptoml.gen HEUR:Trojan.Script.Zapchast.conf Backdoor.Win64.Agent.smgdvy Trojan.Script.Zapchast.abwm Trojan.Win64.Agent.smgsfo Trojan.Script.Zapchast.abwo
# LEGITIMATE public services abused as C2/recon infrastructure. # Do NOT add these to any prevent/block/deny policy -- doing so # breaks unrelated legitimate traffic. Use only with Q8/Q9 above, # correlated against a Q1-Q5 hit on the same host in the same window. broker.hivemq.com (public MQTT broker, port 8883 -- HiveMQ variant C2) ip-api.com (public geolocation API -- both variants' recon call)
# Run before enabling Q6/Q7 as anything more than Investigate-only. Get-Service WinRM | Select-Object Status, StartType Get-Item WSMan:\localhost\Service\Auth\Basic Get-Item WSMan:\localhost\Service\AllowUnencrypted Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 1 Get-ItemProperty "HKLM:\SOFTWARE\Policies\Microsoft\Windows\PowerShell\ScriptBlockLogging" -ErrorAction SilentlyContinue
Detection Validation Gates
| Gate | Requirement | Status for this pack |
|---|---|---|
| Telemetry ready | Falcon sensor process, network, and registry visibility confirmed on target hosts | Confirmed for standard Windows sensor deployment; no additional collector needed for Q1-Q7, Q10 |
| Benign baseline | 7-14 day silent run to characterize legitimate hits before enabling response actions | Required before promoting Q6-Q10 out of Investigate-only; Q1-Q5 may skip a long baseline given their near-zero expected FP, but a short dry run is still recommended |
| Positive tests | Confirm the query actually fires against the documented behavior in a lab | Recommend a controlled lab test: create a service literally named "cplsupport" pointing at a harmless test binary, or launch powershell.exe -NonInteractive -NoProfile -Command "1+1" from a renamed test binary, and confirm Q1/Q2/Q5 fire |
| Promotion criteria | Zero benign hits over the baseline window before moving detect → block, or Investigate-only → Custom IOA | Q1-Q5: promote to Custom IOA (detect, then block after a further 14-day silent run). Q6-Q10: remain Investigate-only indefinitely unless your environment's automation baseline is fully enumerated and excluded |
Hardening — Tiered & Deployable
- Disable or restrict WinRM on endpoints that do not need it. MITRE M1042 (Disable or Remove Feature or Program). Verify:
Get-Service WinRM | Select Status,StartType. On hosts requiring WinRM only for centralized management, restrict the listener to your management subnet and require Kerberos/HTTPS, disabling Basic auth:winrm set winrm/config/service/auth @{Basic="false"}. - Enable PowerShell ScriptBlock and Module logging. CIS Microsoft Windows Benchmark, PowerShell logging control area 18-9-100 (“Turn on PowerShell Script Block Logging” and “Turn on PowerShell Transcription” sub-items); MITRE M1047 (Audit). GPO:
Computer Configuration > Administrative Templates > Windows Components > Windows PowerShell > Turn on PowerShell Script Block Logging= Enabled. Verify:Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 1should return recent Event ID 4104 entries. - Disable PowerShell v2 (bypasses ScriptBlock/Module logging). MITRE M1042.
Disable-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Root -NoRestart. Verify:Get-WindowsOptionalFeature -Online -FeatureName MicrosoftWindowsPowerShellV2Rootshould report Disabled.
- AppLocker/WDAC rule denying unsigned executable launch from
%PROGRAMDATA%. MITRE M1038 (Execution Prevention), M1033 (Limit Software Installation). Both backdoor variants default to a ProgramData install path. Verify post-deployment with Q10 above — hits should drop to your known-good baseline. - Egress alerting for outbound MQTT (1883/8883) and non-approved Matrix homeservers from workstation/server VLANs. MITRE M1037 (Filter Network Traffic), M1021 (Restrict Web-Based Content). Alert-only, scoped to endpoint subnets — do NOT block
broker.hivemq.comor matrix.org wholesale, since that breaks unrelated legitimate SaaS/IoT integrations elsewhere in the business.
- Move WinRM-based remote administration to Just Enough Administration (JEA) constrained endpoints instead of broad local-admin WinRM access. MITRE M1018 (User Account Management), M1026 (Privileged Account Management). This directly removes the access level Evil-WinRM depends on. ⚠ best-practice, no single formal CIS benchmark control number covers JEA rollout — treat as an architectural project, not a one-line config.
- Tiered administrative model / PAM for accounts capable of establishing WinRM sessions, closing the same credential-reuse pattern documented in Toy Ghouls' GenieLocker intrusions (trusted-partner OpenVPN access + valid, reused credentials). MITRE M1026, M1032 (Multi-factor Authentication).
Deployable Playbooks
Playbook 1 — Restrict and log WinRM
1. Inventory hosts with WinRM enabled:
Get-CimInstance -ClassName Win32_Service -Filter "Name='WinRM'" | Select PSComputerName, State, StartMode
Prerequisites: domain admin or delegated read access to run a fleet-wide CIM query.
Reboot required: no.
Rollback: none required (read-only inventory step).
2. On hosts where WinRM is not required for management, disable it:
Stop-Service WinRM -Force
Set-Service WinRM -StartupType Disabled
Prerequisites: confirm the host is not a designated management/jump box first (step 1's inventory).
Reboot required: no.
Rollback: Set-Service WinRM -StartupType Manual ; Start-Service WinRM
3. On hosts where WinRM must remain enabled, restrict authentication and transport:
winrm set winrm/config/service/auth '@{Basic="false"}'
winrm set winrm/config/service '@{AllowUnencrypted="false"}'
winrm set winrm/config/client '@{TrustedHosts=""}'
Prerequisites: confirm no legitimate workflow depends on Basic auth or unencrypted WinRM traffic (test in a pilot ring).
Reboot required: no (WinRM service restart only -- Restart-Service WinRM).
Rollback: winrm set winrm/config/service/auth '@{Basic="true"}' ; winrm set winrm/config/service '@{AllowUnencrypted="true"}' (only if a documented legacy dependency requires it -- prefer fixing the dependency instead).
Playbook 2 — Enable PowerShell ScriptBlock and Module logging via GPO
1. Open Group Policy Management, edit (or create) a GPO linked to the target OU. Prerequisites: Group Policy Management permissions on the target OU. Reboot required: no. Rollback: none required (no state changed yet -- GPO not yet linked/enabled). 2. Computer Configuration -> Administrative Templates -> Windows Components -> Windows PowerShell -> "Turn on PowerShell Script Block Logging" = Enabled Windows PowerShell -> "Turn on Module Logging" = Enabled, Module Names = * Prerequisites: none beyond GPO edit rights. Reboot required: no (takes effect on next gpupdate /force + PowerShell session). Rollback: set both policies back to "Not Configured" and run gpupdate /force on affected hosts. 3. Verify on a test host: gpupdate /force Get-WinEvent -LogName "Microsoft-Windows-PowerShell/Operational" -MaxEvents 5 Prerequisites: local admin on the test host to read the Operational log. Reboot required: no. Rollback: none required (verification step only).
Playbook 3 — AppLocker rule: deny unsigned EXE launch from ProgramData
1. In a PILOT ring first, create an AppLocker Executable Rule: Action: Deny User/Group: Everyone Condition: Path -> %PROGRAMDATA%\* Exceptions: add a path exception for every legitimate vendor already installing into ProgramData in your environment (identify these with Q10 in Audit mode for at least one full patch cycle before enforcing). Prerequisites: AppLocker (or WDAC) policy infrastructure already in place; a completed Q10 baseline of legitimate ProgramData services/executables. Reboot required: no (Application Identity service restart may be needed: Restart-Service AppIDSvc). Rollback: set the rule's enforcement mode back to "Audit only" or delete the rule from the GPO; re-run gpupdate /force. 2. Deploy in Audit-only enforcement mode for 14 days; review the AppLocker event log (Microsoft-Windows-AppLocker/EXE and DLL) for unexpected denials. Prerequisites: step 1 rule created in Audit mode. Reboot required: no. Rollback: none required (audit mode makes no enforcement change). 3. Switch enforcement mode to "Enforce" only after the audit period shows zero unexpected legitimate blocks. Prerequisites: clean 14-day audit period from step 2. Reboot required: no. Rollback: set enforcement mode back to "Audit only" immediately if legitimate software is blocked; add the specific path as an exception, then re-enforce.
Containment Runbook
| Phase | Actions | Owner | Evidence to Preserve |
|---|---|---|---|
| Isolate | Network-contain the host via Falcon RTR immediately upon a Q1/Q2/Q3/Q4/Q5 hit. Do not use the backdoor's own --uninstall/uninstall option to remove it — that destroys forensic state and hands the attacker a clean signal that they were detected. | IR/SOC on-call | Full process tree, network connection history (domains/IPs/ports contacted), memory/process dump of the backdoor binary if feasible |
| Eradicate | Collect the service binary and config.toml (if not yet deleted) for analysis; export the SealedConfig/metrics_interval registry values; then stop and delete the malicious service (sc.exe stop wtas / sc.exe delete wtas, or the equivalent for cplsupport) and remove the binary and registry keys. | IR/Endpoint engineering | Binary hash confirmation against Section 10's CSV, exported registry hive fragment, service configuration export (sc.exe qc <name> output before deletion) |
| Recover | Rotate credentials for any account that established a WinRM session to the affected host in the delivery window (Section 3, step 1); re-image if lateral movement or credential theft is confirmed; re-enable the host from network containment only after Q1-Q5 return clean on two consecutive scheduled runs. | IR + IT Operations | List of accounts used over WinRM in the incident window, re-image/rebuild ticket reference, clean re-scan results |
| Follow-up | Hunt fleet-wide for the same MD5/service/registry key (Q1-Q3) and, given this actor's history, check for the separately reported GenieLocker precursor toolset (Mimikatz, PsExec/PAExec, SoftPerfect Network Scanner, unexpected OpenVPN sessions from partner networks) — those TTPs are not covered by this pack's queries and warrant a dedicated hunt. | Threat hunting team | Fleet-wide query results, any additional infected-host list |
Detection Coverage Map
| Technique | Behavior | CQL | IOA | Coverage |
|---|---|---|---|---|
| T1543.003 / T1036.005 | Backdoor binary execution | Q1 | Yes (Section 9) | Good |
| T1543.003 / T1036.005 | Malicious service creation (named + ProgramData-rooted) | Q2, Q10 | Q2 yes; Q10 Investigate-only | Good |
| T1112 / T1027 | Sealed-config registry persistence | Q3 | Yes (Section 9) | Good |
| T1102.002 / T1071 | Matrix/Element attacker C2 domain | Q4 | Yes (Section 9) | Good |
| T1059.001 | PowerShell command execution (strict + broad) | Q5, Q6 | Q5 yes; Q6 Investigate-only | Good |
| T1021.006 / T1105 | WinRM-based delivery | Q7 | Investigate-only | Partial |
| T1102.002 / T1071 | HiveMQ MQTT anomalous-context C2 | Q8 | Investigate-only (by design — legitimate infra) | Partial |
| T1614 | ip-api.com geolocation recon | Q9 | Investigate-only / enrichment (by design) | Partial |
| T1105 (config/binary drop) | WinRM-fs file transfer of config.toml / the backdoor binary itself | None | None | GAP |
Element client-side artifact (panel-bot operator account, room history) | Local Element SQLite database content on a compromised host | None — not EDR-visible | None | GAP |
| Follow-on GenieLocker ransomware chain | OpenVPN partner-trust abuse, Mimikatz, PsExec/PAExec, RDP/SSH lateral movement, disk encryption | Out of scope for this pack | None | GAP |
This pack does not catch: (1) the initial file transfer of the backdoor binary/config over WinRM-fs, since generic file-write telemetry on a filename as common as config.toml would be unusably noisy; (2) any full decode of MQTT/Matrix application-layer message content, since Falcon's network telemetry is connection-metadata only; (3) the Element client-side SQLite artifacts that reveal the panel-bot operator account, which require manual host forensics; and (4) the separately reported GenieLocker ransomware chain this actor deploys after establishing a foothold — that chain has its own TTP set and deserves its own dedicated hunt pack. Validation gates for the queries that do ship are in Section 11.
Hunt Summary Ticket
TITLE: Toy Ghouls "Angry Birds" MQTT/Matrix Backdoor Hunt SEVERITY: HIGH SCOPE: All Windows endpoints/servers with Falcon sensor coverage, priority on hosts with WinRM enabled HYPOTHESIS: Toy Ghouls has delivered the mqtt-bird-agent (cplsupport.exe) or matrix-bird-agent (wtass.exe) backdoor via WinRM, installed it as a Windows service, and is controlling it through the public HiveMQ MQTT broker or an attacker-run Matrix/Element homeserver. QUERIES: Q1-Q5 (Custom IOA candidates, near-zero FP) ; Q6-Q10 (Investigate-only, require tuning) DO FIRST: Run Q1-Q4 fleet-wide with a 30-day lookback. Any hit is a confirmed compromise -- escalate directly to Containment (Section 14), do not treat as a suspicious anomaly. FINDINGS: [POPULATE AFTER RUNNING -- record hit count, affected hosts, and which C2 channel (HiveMQ vs Matrix/Element) was in use per host] GAPS: WinRM-fs file-transfer step not independently hunted (config.toml too generic); MQTT/Matrix payload content not visible to Falcon (metadata only); Element client-side SQLite artifacts require manual forensics; GenieLocker follow-on chain out of scope. ACTIONS: Promote Q1-Q5 to Custom IOA (detect now, block after a 14-day silent run). Deploy Section 12 Immediate hardening (WinRM restriction, PowerShell logging) this week. Schedule a dedicated GenieLocker hunt pack for the ransomware follow-on chain. OWNER: [REPLACE_WITH_ASSIGNED_ANALYST_OR_TEAM] VERSION: v0.1 - 2026-09-13
Changelog
References
| Tier | Source | Used For | Access Date |
|---|---|---|---|
| T1 Vendor | Securelist — "Angry Birds: Toy Ghouls' new toys" (Kaspersky GERT, published 2026-09-04) | Primary source for all atomic IOCs, delivery/persistence/C2 technical detail | 2026-09-13 |
| T1 Vendor | Securelist — "Toy Ghouls' new toy: the GenieLocker ransomware" (Kaspersky, published 2026-07-30) | Actor background, aliases, prior TTPs (context only — no atomic IOC sourced from this article) | 2026-09-13 |
| T2 Secondary | SecurityOnline.info — "Toy Ghouls Backdoor Uses HiveMQ and Element for C2" (published 2026-09-04) | Independent corroboration, defender-guidance framing | 2026-09-13 |
| T2 Secondary | GBHackers — HiveMQ/Element backdoor coverage | Independent corroboration | 2026-09-13 |
Attempted but not used: hackread.com's coverage of the same story returned HTTP 403 on every fetch attempt and is not cited anywhere in this pack.