Toy Ghouls — "Angry Birds" MQTT / Matrix Backdoor Hunt

Financially motivated intrusion set (aka Bearlyfy, Laboo.boo, Feral Wolf) abusing the public HiveMQ MQTT broker and the Matrix/Element messenger as C2 channels for two new Windows backdoors, delivered over WinRM.
Threat
Toy Ghouls — mqtt-bird-agent / matrix-bird-agent
Severity
HIGH
Type
Financially motivated intrusion — custom backdoor C2
Access Vector
WinRM (Evil-WinRM / WinRM-fs)
Version
v0.1 (Draft)
Author
HuntPack
Confidence
Medium-High
01

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.

Defender priority: deploy Q1–Q5 (binary execution, malicious service names, sealed-config registry keys, the Matrix/Element C2 domain, and PowerShell spawned directly by the backdoor) as Custom IOAs immediately — they are high-confidence and low-noise. Do NOT add 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.
02

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.

TierSourceKey FindingCarry Forward
T1 VendorKaspersky 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 keysYes — primary source for all atomic IOCs and behavioral detail
T1 VendorKaspersky 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 footholdPartial — actor context and exec-summary framing only; no atomic IOC from this source ships in this pack's CQL/IOA content
T2 SecondarySecurityOnline.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 SecondaryGBHackers — 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.

03

Hunt Brief & Attack Chain

Hunt hypotheses

  1. (High) The backdoor binaries execute under their vendor-attributed names cplsupport.exe / wtass.exe — a filename + hash hunt with near-zero collision risk. → Q1
  2. (High) Persistence is installed as a Windows service under one of exactly two literal names, cplsupport or wtas — a service-creation hunt with near-zero collision risk. → Q2
  3. (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
  4. (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
  5. (High) Both variants execute operator commands via PowerShell or cmd.exe launched directly as a child of the backdoor process/service. → Q5
  6. (Medium) The -NonInteractive -NoProfile -Command PowerShell 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
  7. (Medium) WinRM-delivered payloads spawn child processes under wsmprovhost.exe — a broad Evil-WinRM/legitimate-remoting signal that needs heavy scoping. → Q7
  8. (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
  9. (Low-Medium) An unexpected process querying ip-api.com for 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
  10. (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

StepBehaviorTelemetryHunt Angle
1Initial access / delivery via WinRM using Evil-WinRM and WinRM-fsProcess (wsmprovhost.exe children), network (5985/5986), auth logsQ7 (broad, needs tuning)
2Ingress tool transfer — backdoor binary + config.toml copied to the target over the WinRM-fs channelFile-write telemetry (generic filename, not independently hunted — see Coverage Gaps)Gap — no dedicated query; config.toml alone is too generic to hunt
3Execution / installation with --install (HiveMQ) or install (Element)Process execution (cplsupport.exe, wtass.exe)Q1
4Persistence as a Windows service (cplsupport, wtas), masquerading as built-in Windows componentsService creationQ2, Q10
5Config sealed with ChaCha20-Poly1305 keyed to MachineGuid; Element variant deletes its config file and persists to the registry insteadRegistry write (SealedConfig, metrics_interval)Q3
6Discovery — geolocation lookup against http://ip-api.com/jsonDNS / outbound HTTPQ9 (enrichment only)
7Command and control — HiveMQ MQTT broker (broker.hivemq.com:8883) or Matrix/Element homeserver (meet.element.tw)DNS / outbound networkQ8 (anomalous-context), Q4 (attacker infra)
8Command execution — hidden PowerShell (HiveMQ variant) or Windows command line (Element variant)Process execution, parent-childQ5, 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 movementn/a to this packNot hunted — see Coverage Map gap; recommend a dedicated GenieLocker hunt pack
04

Consolidated IOC Table

TypeValueConfidenceActionContextExpiry
MD5BFADBEEE63A4F0BF19EC9DEB8FA58F58highdetectcplsupport.exe — HiveMQ variant (mqtt-bird-agent)2027-03-13
MD57916C33688385525078BEE504C90F359highdetectwtass.exe — Element variant (matrix-bird-agent)2027-03-13
Domainmeet.element.twhighdetectAttacker-controlled Matrix/Element homeserver, C2 for the Element variant2027-03-13
Filenameconfig.tomlmediumhuntBackdoor configuration file (generic name — do not detect/block on filename alone)2026-12-13
Service namecplsupporthighhuntMasquerades as "Problem Reports Control Panel"2027-03-13
Service namewtashighhuntMasquerades as "Windows Telemetry Aggregator Service"2027-03-13
Registry keyHKLM\Software\synapse\Config\SealedConfighighhuntSealed backdoor configuration (Element variant)2027-03-13
Registry keyHKLM\Software\SynapseAgent\metrics_intervalhighhuntBackdoor telemetry interval setting (Element variant)2027-03-13
Domainbroker.hivemq.comhighenrichLEGITIMATE public MQTT broker abused as C2 — never detect/block; use only as an anomalous-context signal correlated with other hits2026-10-13
Domainip-api.commediumenrichLEGITIMATE geolocation API abused for recon — never detect/block; use only as an anomalous-context signal2026-10-13
Account namepanel-botmediumpivotElement/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 indicator2026-12-13
05

Affected Surface & Telemetry Matrix

SurfaceTelemetry RequiredPriorityGap Risk
Windows endpoints/servers with WinRM enabledFalcon process (ProcessRollup2/SyntheticProcessRollup2), network (NetworkConnectIP4, DnsRequest), registry (RegGenericValueUpdate), service creation (CreateService)HighLow — all Falcon-native
Network egress path to public internet (MQTT/Matrix C2)DNS resolution logs, NetworkConnectIP4 metadata (domain/IP/port only)HighMedium — 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 serviceProcess telemetry for wsmprovhost.exe children; native Microsoft-Windows-WinRM/Operational event log as a fallbackMedium-HighMedium — 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 hostNot Falcon-native; requires host-based forensic collection (RTR script or offline triage) to recover the panel-bot account and room historyMediumHigh — no EDR telemetry surfaces Element client-side SQLite content; this is a manual IR step, not a scheduled hunt
06

ATT&CK Mapping

TacticTechnique IDTechnique NameObserved Behavior
Initial Access / Lateral MovementT1021.006Remote Services: Windows Remote ManagementDelivery via Evil-WinRM and WinRM-fs
Command and ControlT1105Ingress Tool TransferBackdoor binary and config.toml copied to the target over WinRM-fs
PersistenceT1543.003Create or Modify System Process: Windows Service--install / install registers the backdoor as a Windows service
Defense EvasionT1036.005Masquerading: Match Legitimate Name or LocationService names "cplsupport" (Problem Reports Control Panel) and "wtas" (Windows Telemetry Aggregator Service) impersonate built-in components
Persistence / Defense EvasionT1112Modify RegistrySealed config and metrics interval written to HKLM\Software\synapse\Config\SealedConfig / HKLM\Software\SynapseAgent\metrics_interval
Defense EvasionT1027Obfuscated Files or InformationConfiguration encrypted with ChaCha20-Poly1305, keyed to the host's MachineGuid, binding it to the infected machine
Command and ControlT1102.002Web Service: Bidirectional CommunicationPublic HiveMQ MQTT broker and an attacker-run Matrix/Element homeserver used to relay commands and results
Command and ControlT1071Application Layer ProtocolMQTT and Matrix application protocols carry status/metrics/command traffic
ExecutionT1059.001Command and Scripting Interpreter: PowerShellHiveMQ variant executes operator commands via PowerShell.exe -NonInteractive -NoProfile -Command
DiscoveryT1614System Location DiscoveryBoth variants query http://ip-api.com/json at startup for public IP and country
07

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 ServiceName for cplsupport or wtas, or ServiceFileName for a path under %PROGRAMDATA%.
  • Microsoft-Windows-WinRM/Operational event 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 TargetObject for ...\synapse\Config\SealedConfig or ...\SynapseAgent\metrics_interval as 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, or Trojan.Script.Zapchast.abwo (all from the Kaspersky Securelist advisory).
  • PowerShell Microsoft-Windows-PowerShell/Operational Event ID 4104 (ScriptBlock logging, if enabled per Section 12) — search block text for the literal flag combination -NonInteractive -NoProfile -Command paired with an unusual parent process, to corroborate Q5/Q6 without Falcon.
08

CrowdStrike LogScale CQL Hunt Queries

Pick your tenant's cloud first — every "Open in Falcon" button below uses this selection.
Q1 · Angry Birds backdoor process execution (cplsupport.exe / wtass.exe)
CONF HIGHFP LOWCOST LOW

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])
Q2 · Malicious Windows service creation (cplsupport / wtas)
CONF HIGHFP LOWCOST LOW

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])
Q3 · Sealed-config / metrics-interval registry persistence
CONF HIGHFP LOWCOST LOW

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])
Q4 · Matrix/Element attacker C2 homeserver contact (meet.element.tw)
CONF HIGHFP LOWCOST LOW

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])
Q5 · PowerShell spawned directly by the backdoor process (strict parent match)
CONF HIGHFP LOWCOST LOW

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])
Q6 · Environment-wide hidden/non-interactive PowerShell execution
CONF MEDIUMFP HIGHCOST MEDIUM

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])
Q7 · Child process spawned via WinRM provider host (possible Evil-WinRM / WinRM-fs delivery)
CONF MEDIUMFP HIGHCOST MEDIUM

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])
Q8 · Anomalous process contacting the public HiveMQ MQTT broker
CONF MEDIUMFP HIGHCOST MEDIUM

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])
Q9 · Anomalous ip-api.com geolocation lookup
CONF LOWFP HIGHCOST LOW

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])
Q10 · New Windows service with a ProgramData-rooted image path
CONF MEDIUMFP MEDIUMCOST LOW

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])
09

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

NamePatternExclusionsDeployment Path
HUNT: Toy Ghouls - Backdoor Binary ExecutionFileName matches cplsupport.exe / wtass.exeNone requiredCustom IOA (block or detect) — safe to set to Block after a 14-day silent detect-only run
HUNT: Toy Ghouls - Malicious Service CreationServiceName equals cplsupport / wtasNone requiredCustom IOA (detect) — service creation IOAs default to detect-only in most tenants
HUNT: Toy Ghouls - Sealed Config Registry WriteRegObjectName matches synapse\Config\SealedConfig or SynapseAgent\metrics_intervalNone requiredScheduled 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 ContactDomainName equals meet.element.twConfirm no internal Matrix homeserver shares this hostnameCustom IOA (detect) or Falcon Custom IOC (domain, detect action)
HUNT: Toy Ghouls - PowerShell Spawned by Backdoor ProcessFileName=powershell.exe AND ParentBaseFileName matches cplsupport.exe/wtass.exeNone requiredCustom 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:

  1. Confirm the event type — ProcessRollup2/CreateService/RegGenericValueUpdate means it executed/persisted; a corresponding ProcessBlocked means Falcon prevention already stopped it.
  2. Pull the host's full process tree around the hit — identify how the binary arrived (look for a wsmprovhost.exe ancestor, per Q7).
  3. Check for the companion service (Q2/Q10) and registry keys (Q3) on the same host — Toy Ghouls installs all three together.
  4. Pivot to Q8/Q9 on the same host and timeframe to identify which C2 channel (HiveMQ or Matrix/Element) is in use.
  5. Check authentication logs for the WinRM session that likely delivered the binary — identify the source account and source host.
  6. Isolate the host via Falcon RTR once C2 contact is confirmed (see Containment Runbook, Section 14).
  7. 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.

10

Machine-Readable IOC Appendix

Falcon IOC Management CSVbulk import
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
Behavioral Signatureshunt / IOA source
# 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)
Named Malware / Toolingcontext
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
Anomalous-Context Watchlistenrich only -- DO NOT BLOCK
# 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)
WinRM / PowerShell Audit Checklisttenant validation
# 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
11

Detection Validation Gates

GateRequirementStatus for this pack
Telemetry readyFalcon sensor process, network, and registry visibility confirmed on target hostsConfirmed for standard Windows sensor deployment; no additional collector needed for Q1-Q7, Q10
Benign baseline7-14 day silent run to characterize legitimate hits before enabling response actionsRequired 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 testsConfirm the query actually fires against the documented behavior in a labRecommend 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 criteriaZero benign hits over the baseline window before moving detect → block, or Investigate-only → Custom IOAQ1-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
12

Hardening — Tiered & Deployable

Immediate (this week)
  • 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 1 should 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 MicrosoftWindowsPowerShellV2Root should report Disabled.
Near term (1-4 weeks, pilot ring first)
  • 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.com or matrix.org wholesale, since that breaks unrelated legitimate SaaS/IoT integrations elsewhere in the business.
Strategic (1-3 months)
  • 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).
13

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.
14

Containment Runbook

PhaseActionsOwnerEvidence to Preserve
IsolateNetwork-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-callFull process tree, network connection history (domains/IPs/ports contacted), memory/process dump of the backdoor binary if feasible
EradicateCollect 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 engineeringBinary hash confirmation against Section 10's CSV, exported registry hive fragment, service configuration export (sc.exe qc <name> output before deletion)
RecoverRotate 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 OperationsList of accounts used over WinRM in the incident window, re-image/rebuild ticket reference, clean re-scan results
Follow-upHunt 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 teamFleet-wide query results, any additional infected-host list
15

Detection Coverage Map

TechniqueBehaviorCQLIOACoverage
T1543.003 / T1036.005Backdoor binary executionQ1Yes (Section 9)Good
T1543.003 / T1036.005Malicious service creation (named + ProgramData-rooted)Q2, Q10Q2 yes; Q10 Investigate-onlyGood
T1112 / T1027Sealed-config registry persistenceQ3Yes (Section 9)Good
T1102.002 / T1071Matrix/Element attacker C2 domainQ4Yes (Section 9)Good
T1059.001PowerShell command execution (strict + broad)Q5, Q6Q5 yes; Q6 Investigate-onlyGood
T1021.006 / T1105WinRM-based deliveryQ7Investigate-onlyPartial
T1102.002 / T1071HiveMQ MQTT anomalous-context C2Q8Investigate-only (by design — legitimate infra)Partial
T1614ip-api.com geolocation reconQ9Investigate-only / enrichment (by design)Partial
T1105 (config/binary drop)WinRM-fs file transfer of config.toml / the backdoor binary itselfNoneNoneGAP
Element client-side artifact (panel-bot operator account, room history)Local Element SQLite database content on a compromised hostNone — not EDR-visibleNoneGAP
Follow-on GenieLocker ransomware chainOpenVPN partner-trust abuse, Mimikatz, PsExec/PAExec, RDP/SSH lateral movement, disk encryptionOut of scope for this packNoneGAP

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.

16

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
17

Changelog

v0.12026-09-13Initial release. Built from Kaspersky Securelist's 2026-09-04 disclosure of the Toy Ghouls "Angry Birds" backdoor family (mqtt-bird-agent / matrix-bird-agent) and corroborating secondary reporting. Ten CQL hunt queries, five promoted as Custom IOA candidates.
18

References

TierSourceUsed ForAccess Date
T1 VendorSecurelist — "Angry Birds: Toy Ghouls' new toys" (Kaspersky GERT, published 2026-09-04)Primary source for all atomic IOCs, delivery/persistence/C2 technical detail2026-09-13
T1 VendorSecurelist — "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 SecondarySecurityOnline.info — "Toy Ghouls Backdoor Uses HiveMQ and Element for C2" (published 2026-09-04)Independent corroboration, defender-guidance framing2026-09-13
T2 SecondaryGBHackers — HiveMQ/Element backdoor coverageIndependent corroboration2026-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.