Threat Summary
Three concurrent OTX pulses paint a picture of a maturing, multi-platform offensive ecosystem spanning software supply chains, mobile banking fraud, and resilient IoT botnet infrastructure.
Pulse 1 — DEV#POPPER via npm supply chain: Two beta releases in the @joyfill npm namespace were compromised with an import-time JavaScript implant. The implant's defining characteristic is its use of blockchain transactions on Tron, Aptos, and BNB Smart Chain as a dead-drop resolver for encrypted payloads — a technique that makes C2 takedown extremely difficult since the resolution data lives on immutable public ledgers. The final payload is a 77 KB Node.js remote access trojan (DEV#POPPER) that establishes Socket.IO connections for remote control, executes arbitrary commands, and uploads files. OmniStealer infostealer components are also observed. Targeting is developer-centric: compromise the developer workstation, and you inherit access to source code, CI/CD secrets, cloud credentials, and downstream customers.
Pulse 2 — Flying Eagle Android RAT ecosystem: A fractured criminal ecosystem built around the Flying Eagle Android RAT, whose source code was stolen in early 2026 along with nearly 200 customer databases. Hunt.io researchers identified 170 active servers running the framework, plus a successor platform called Night Dragon. Distribution rides Telegram channels, with lures impersonating a Chinese Provincial Public Security Bureau app. Related families SpyNote and BTMOB round out a China-nexus mobile banking fraud operation targeting users in China and Thailand.
Pulse 3 — Moobot post-disruption activity: A misconfigured open directory at 86.53.111[.]212:8080 exposed Moobot botnet source code, DDoS attack tooling, and StresD Pro+, a multi-user DDoS-as-a-service panel with 16 registered accounts and 32 recorded attacks. Moobot is historically attributed to APT28 tooling ecosystems, and this pulse demonstrates the botnet survived the 2024 court-authorized disruption — with Mirai lineage and DDoS-for-hire monetization now interwoven with Chinese cybercrime infrastructure and a fraudulent identity verification service (api.cemg.xyz).
Collective assessment: These pulses share a common thread — adversaries are industrializing resilient infrastructure (blockchain dead-drops, leaked-and-rebranded RAT platforms, DDoS panels) that survives takedown and lowers the barrier for secondary actors. Developer workstations and mobile banking users are the highest-value targets this cycle.
Threat Actor / Malware Profile
DEV#POPPER (Node.js RAT)
- Distribution: Trojanized npm beta releases (
@joyfillnamespace); implant executes at package import time — no postinstall script required, making it harder to spot in code review. - Payload behavior: 77 KB Node.js RAT; remote command execution, file upload/exfiltration; OmniStealer modules harvest browser credentials, crypto wallets, and session tokens.
- C2 communication: Socket.IO over WebSockets for interactive control; payload staging resolved via blockchain transactions (Tron, Aptos, BNB Smart Chain) — encrypted payload URLs/keys are embedded in transaction metadata, defeating domain blocklists.
- Persistence: Typically via npm dependency re-installation (the trojanized package persists in
node_modulesand lockfiles), plus potential shell profile or startup script modification on developer machines. - Anti-analysis: Blockchain-based payload retrieval keeps the true C2 out of static indicators; import-time execution evades tools that only audit
postinstallhooks; encrypted payloads resist sandbox detonation.
Flying Eagle / Night Dragon / SpyNote / BTMOB (Android RATs)
- Distribution: Telegram channels; APK lures impersonating Chinese government/police applications (e.g.,
110gongan.commimics the 110 public security reporting service). - Payload behavior: Full Android RAT capability — SMS interception (banking OTP theft), accessibility-service abuse for overlay attacks, credential theft, keylogging, screen capture.
- C2: 170 active servers identified; framework reuse across operators due to the early-2026 source code leak; Night Dragon is the rebranded successor panel.
- Persistence: Android accessibility service persistence, device admin abuse, battery-optimization exemption requests.
Moobot / Mirai (APT28-linked botnet)
- Distribution: IoT exploitation (router/embedded device vulnerabilities), Mirai-style credential brute-forcing.
- Payload behavior: DDoS attack execution; integrated with StresD Pro+ panel for DDoS-as-a-service monetization (16 accounts, 32 logged attacks).
- C2: Exposed infrastructure at
86.53.111[.]212:8080,api.cemg.xyz, and associated IPs (162.141.92.192,112.21.241.27,39.175.139.108). - Resilience: Survived the 2024 court-authorized disruption; source code exposure on the open directory suggests active development continues.
IOC Analysis
The indicator set spans four operational types, each requiring different handling:
- File hashes (SHA256/SHA1/MD5): The 8 SHA256 hashes from the DEV#POPPER pulse are your highest-fidelity endpoint indicators — the npm implant and RAT binaries are deterministic. The Flying Eagle MD5/SHA1 hashes are mobile APK samples; route these to mobile sandbox (e.g., VirusTotal, Joe Sandbox Mobile) rather than EDR blocklists unless your fleet includes Android devices under management. Note: MD5/SHA1 indicators age poorly against repacked APKs — prioritize behavior over hash matching for mobile.
- IPv4 addresses: The Moobot C2 IPs should be blocked at egress immediately, but treat blocking as temporary — Moobot C2 churns fast. More durable: alert on any historical connection in proxy/firewall/NetFlow logs over the past 90 days to identify already-compromised IoT devices.
- Domains/hostnames:
110gongan.com(government impersonation lure) andapi.cemg.xyz(fraudulent identity verification service) should be sinkholed at DNS. Add both to your DNS RPZ and monitor for resolution attempts — a resolution attempt toapi.cemg.xyzfrom a corporate asset warrants investigation for DDoS-panel or fraud-service interaction. - Blockchain C2 (no traditional IOC): DEV#POPPER's Tron/Aptos/BNB resolution channel generates no domain or IP indicator for the staging step. Detection must be behavioral: Node.js processes making outbound HTTPS to blockchain RPC endpoints (e.g.,
api.trongrid.io, Aptos fullnode APIs, BSC RPC nodes) from developer workstations is anomalous in nearly every enterprise.
Operationalization: Load hashes into your EDR blocklist, IPs/domains into firewall/DNS controls, and wire the behavioral detections below into your SIEM. Tooling: yara + hash lookup for file triage, suricata/zeek for Socket.IO long-poll/WebSocket anomaly detection, and npm audit tooling (Socket, Snyk, npm audit signatures) for supply-chain verification.
Detection Engineering
---
title: DEV#POPPER Node.js RAT - Import-Time Implant Execution from node_modules
description: Detects Node.js spawning child processes or shells from within node_modules paths, consistent with the DEV#POPPER npm import-time implant installing a 77KB RAT and executing commands via Socket.IO C2.
status: experimental
logsource:
category: process_creation
product: windows
Detection:
selection_parent:
ParentImage|endswith: '\node.exe'
selection_child:
Image|endswith:
- '\cmd.exe'
- '\powershell.exe'
- '\pwsh.exe'
- '\wscript.exe'
- '\curl.exe'
- '\certutil.exe'
selection_path:
CommandLine|contains:
- 'node_modules'
- '@joyfill'
condition: selection_parent and (selection_child or selection_path)
falsepositives:
- Legitimate build tooling (webpack, vite) spawning shells during compilation — filter on known CI build agents
level: high
tags:
- attack.initial_access
- attack.t1195.002
- attack.t1059.007
---
title: Node.js Process Outbound Connection to Blockchain RPC Endpoints
description: Detects Node.js processes resolving or connecting to public blockchain RPC API endpoints (Tron, Aptos, BNB Smart Chain), a DEV#POPPER technique using blockchain transactions as a dead-drop resolver for encrypted payload retrieval.
status: experimental
logsource:
category: dns
product: windows
detection:
selection:
Image|endswith: '\node.exe'
QueryName|contains:
- 'trongrid.io'
- 'tronapi'
- 'fullnode.mainnet.aptoslabs.com'
- 'aptoslabs'
- 'bsc-dataseed'
- 'bnbchain'
- 'nodereal.io'
filter_ci:
Computer|contains: 'BUILD'
condition: selection and not filter_ci
falsepositives:
- Legitimate Web3/blockchain development activity — scope exclusions to known developer projects
level: medium
tags:
- attack.command_and_control
- attack.t1102
- attack.t1071.001
---
title: Moobot C2 Communication to Known Botnet Infrastructure
description: Detects network connections to Moobot/StresD Pro+ C2 infrastructure exposed via open directory, including activity post-2024 court-authorized disruption. Also flags connections to the fraudulent identity verification API host.
status: experimental
logsource:
category: network_connection
detection:
selection_ip:
DestinationIp:
- '86.53.111.212'
- '162.141.92.192'
- '112.21.241.27'
- '39.175.139.108'
selection_dns:
QueryName|contains:
- 'api.cemg.xyz'
- '110gongan.com'
selection_port:
DestinationPort: 8080
DestinationIp: '86.53.111.212'
condition: selection_ip or selection_dns or selection_port
falsepositives:
- Threat research and sandbox detonation traffic
level: critical
tags:
- attack.command_and_control
- attack.t1071
- attack.impact
- attack.t1498
// Multi-pulse hunt: DEV#POPPER npm implant behaviors + Moobot C2 + blockchain dead-drop resolution
// Microsoft Sentinel / Defender XDR
let MoobotC2 = dynamic(["86.53.111.212", "162.141.92.192", "112.21.241.27", "39.175.139.108"]);
let BadHosts = dynamic(["api.cemg.xyz", "110gongan.com", "trongrid.io", "fullnode.mainnet.aptoslabs.com"]);
let DEVPopperHashes = dynamic([
"2cfede38fb121a71a2f3607474aa8cd588a99f51b37e5e6f0d8cb789fa275032",
"26351aed0397158d3a3b8cc8fd3047d4c015d264c9895f10f20f1521b974ed18",
"36ff00b45e67baa7e3674b0c80f48e88737264c61e5c6b3b091200972de8157c",
"adc4af90540d33cd1e98f44b51482ae9250fbeb97d6f8d7841c81b618cb2c6e6",
"8e8b90dedd456ded0c5748119836e1ca1066112bc569c1b41ca70eb931d1d4dc",
"5f6a92006ca2ea4b464d66fb41af777edce7296939a7c6ee491e2b3cbfe09848",
"bcc93dc55bc7daedf4ca57254f0e7a7f1c40e09851eab98fe10cde801982db17",
"1352ad22c99983d91e600348b7cbf58235131b1ee34cea9f09623206d5b7dea7"]);
union isfuzzy=true
(DeviceNetworkEvents
| where Timestamp > ago(30d)
| where RemoteIP in (MoobotC2) or RemoteUrl has_any (BadHosts)
| project Timestamp, DeviceName, InitiatingProcessFileName, RemoteIP, RemoteUrl, RemotePort, HuntTag="Network-C2"),
(DeviceProcessEvents
| where Timestamp > ago(30d)
| where SHA256 in (DEVPopperHashes)
or (FileName =~ "node.exe" and (ProcessCommandLine has_any ("node_modules", "@joyfill")
and InitiatingProcessCommandLine has_any ("npm", "yarn", "pnpm", "node")))
or (InitiatingProcessFileName =~ "node.exe" and FileName has_any ("cmd.exe", "powershell.exe", "curl.exe", "certutil.exe"))
| project Timestamp, DeviceName, FileName, ProcessCommandLine, InitiatingProcessFileName, SHA256, HuntTag="Process-Implant"),
(DeviceFileEvents
| where Timestamp > ago(30d)
| where SHA256 in (DEVPopperHashes) or FolderPath has_any ("@joyfill")
| project Timestamp, DeviceName, FileName, FolderPath, SHA256, HuntTag="File-IOC")
| sort by Timestamp desc
# DEV#POPPER + Moobot Enterprise Hunt Script
# Checks: trojanized npm packages, suspicious node child processes, Moobot C2 connections, persistence artifacts
# Run elevated on developer workstations and build agents; output JSON for SIEM ingestion
$findings = @()
# 1. Trojanized @joyfill npm packages in node_modules / lockfiles
$npmPaths = @("$env:USERPROFILE", "C:\Repos", "D:\Projects", "C:\BuildAgent\work")
foreach ($base in $npmPaths) {
if (Test-Path $base) {
Get-ChildItem -Path $base -Recurse -Include "package-lock.json","yarn.lock","pnpm-lock.yaml" -ErrorAction SilentlyContinue -Depth 5 |
Select-String -Pattern '@joyfill' -List | ForEach-Object {
$findings += [pscustomobject]@{Check='NPM-Lockfile'; Path=$_.Path; Detail='@joyfill reference found'; Severity='High'}
}
Get-ChildItem -Path $base -Recurse -Directory -Filter '@joyfill' -ErrorAction SilentlyContinue -Depth 6 | ForEach-Object {
$findings += [pscustomobject]@{Check='NPM-node_modules'; Path=$_.FullName; Detail='@joyfill package installed'; Severity='Critical'}
}
}
}
# 2. Known DEV#POPPER SHA256 hashes staged on disk
$badHashes = @(
'2cfede38fb121a71a2f3607474aa8cd588a99f51b37e5e6f0d8cb789fa275032',
'26351aed0397158d3a3b8cc8fd3047d4c015d264c9895f10f20f1521b974ed18',
'36ff00b45e67baa7e3674b0c80f48e88737264c61e5c6b3b091200972de8157c',
'adc4af90540d33cd1e98f44b51482ae9250fbeb97d6f8d7841c81b618cb2c6e6',
'8e8b90dedd456ded0c5748119836e1ca1066112bc569c1b41ca70eb931d1d4dc',
'5f6a92006ca2ea4b464d66fb41af777edce7296939a7c6ee491e2b3cbfe09848',
'bcc93dc55bc7daedf4ca57254f0e7a7f1c40e09851eab98fe10cde801982db17',
'1352ad22c99983d91e600348b7cbf58235131b1ee34cea9f09623206d5b7dea7'
)
foreach ($ext in @('*.js','*.exe','*.node','*.dll')) {
Get-ChildItem -Path "$env:TEMP","$env:APPDATA","$env:LOCALAPPDATA\Programs" -Recurse -Include $ext -ErrorAction SilentlyContinue -Depth 4 | ForEach-Object {
$h = (Get-FileHash $_.FullName -Algorithm SHA256 -ErrorAction SilentlyContinue).Hash
if ($badHashes -contains $h.ToLower()) {
$findings += [pscustomobject]@{Check='HashMatch'; Path=$_.FullName; Detail=$h; Severity='Critical'}
}
}
}
# 3. Active/historical connections to Moobot C2 infrastructure
$moobotIPs = @('86.53.111.212','162.141.92.192','112.21.241.27','39.175.139.108')
Get-NetTCPConnection -ErrorAction SilentlyContinue | Where-Object { $moobotIPs -contains $_.RemoteAddress } | ForEach-Object {
$proc = Get-Process -Id $_.OwningProcess -ErrorAction SilentlyContinue
$findings += [pscustomobject]@{Check='Moobot-C2-Live'; Path=$proc.Path; Detail="$($_.RemoteAddress):$($_.RemotePort) [$($_.State)]"; Severity='Critical'}
}
# 4. Node.exe spawning shells (DEV#POPPER command execution behavior)
Get-CimInstance Win32_Process -ErrorAction SilentlyContinue | Where-Object {
$_.Name -match '^(cmd|powershell|pwsh|curl|certutil)\.exe$'
} | ForEach-Object {
$parent = Get-CimInstance Win32_Process -Filter "ProcessId=$($_.ParentProcessId)" -ErrorAction SilentlyContinue
if ($parent.Name -match '^node\.exe$') {
$findings += [pscustomobject]@{Check='Node-Spawns-Shell'; Path=$_.ExecutablePath; Detail="Parent: $($parent.CommandLine)"; Severity='High'}
}
}
# 5. Persistence artifacts referencing node/npm payloads
$regRun = 'HKCU:\Software\Microsoft\Windows\CurrentVersion\Run','HKLM:\Software\Microsoft\Windows\CurrentVersion\Run'
foreach ($key in $regRun) {
Get-ItemProperty -Path $key -ErrorAction SilentlyContinue | ForEach-Object {
$_.PSObject.Properties | Where-Object { $_.Value -match 'node\.exe|node_modules|@joyfill' } | ForEach-Object {
$findings += [pscustomobject]@{Check='Registry-RunKey'; Path="$key\$($_.Name)"; Detail=$_.Value; Severity='High'}
}
}
}
Get-ScheduledTask -ErrorAction SilentlyContinue | Where-Object {
($_.Actions.Execute -match 'node\.exe') -or ($_.Actions.Arguments -match 'node_modules|@joyfill')
} | ForEach-Object {
$findings += [pscustomobject]@{Check='ScheduledTask'; Path=$_.TaskName; Detail=$_.Actions.Execute; Severity='High'}
}
# 6. DNS cache check for blockchain dead-drop resolution endpoints
Get-DnsClientCache -ErrorAction SilentlyContinue | Where-Object {
$_.Entry -match 'trongrid|aptoslabs|bsc-dataseed|cemg\.xyz|110gongan'
} | ForEach-Object {
$findings += [pscustomobject]@{Check='DNS-Cache'; Path=$_.Entry; Detail=$_.Data; Severity='Medium'}
}
$findings | ConvertTo-Json -Depth 4
if (-not $findings) { Write-Output '{"status":"clean","checks":6}' }
Response Priorities
Immediate (0–4 hours)
- Block all network IOCs at egress firewall, proxy, and DNS:
86.53.111.212,162.141.92.192,112.21.241.27,39.175.139.108,api.cemg.xyz,110gongan.com. - Load all DEV#POPPER SHA256 hashes into EDR block/quarantine policy; push Flying Eagle MD5/SHA1 hashes to any mobile threat defense (MTD) platform.
- Query the software asset inventory for
@joyfillbeta releases inpackage-lock.json,yarn.lock, orpnpm-lock.yamlacross developer workstations, build agents, and artifact registries. Any hit = treat the host as compromised. - Run the PowerShell hunt script on developer endpoints and CI runners first — they are the priority blast radius for the npm RAT.
24 Hours
- Credential exposure response: DEV#POPPER/OmniStealer harvests browser credentials, session tokens, SSH keys, and cloud/CI secrets from developer machines. For any host with a confirmed or suspected hit: force rotation of all credentials reachable from that machine — npm tokens, GitHub/GitLab PATs, cloud IAM keys, SSH keys, browser-stored passwords, and crypto wallet seed material. Invalidate active sessions (SSO + cloud consoles).
- Audit CI/CD pipelines for anomalous package publishes in the last 30 days — a compromised developer token is a downstream supply-chain event for your own products.
- Mobile fleet review: If corporate Android devices or BYOD are used in APAC operations, verify no sideloaded APKs and audit accessibility service grants; brief regional staff on government-app impersonation lures.
- Retroactive NetFlow/proxy review (90 days) for Moobot C2 contact — IoT/OT segments, printer VLANs, and unmanaged device ranges deserve special attention.
1 Week
- Supply-chain hardening: Enforce
npm ciwith lockfile integrity, disable install scripts in CI (--ignore-scripts) where feasible, deploy artifact-registry proxying with malware scanning (Socket, JFrog Xray, or equivalent), and require provenance/sigstore attestation for production dependencies. - Egress policy: Block or alert on outbound connections from non-browser processes to public blockchain RPC endpoints; restrict developer workstation egress to required service categories.
- IoT segmentation: Move routers, cameras, and embedded devices behind deny-by-default egress policies — Moobot-class botnets require outbound C2 to function. Audit edge devices for known exploited firmware.
- Detection-as-code: Promote the Sigma and KQL content above into production with tuning exclusions for build agents and Web3 development teams; schedule monthly retro-hunts against refreshed OTX indicators.
Related Resources
Security Arsenal Incident Response Managed SOC & MDR Services AlertMonitor Threat Detection From The Dark Side Intel Hub
Is your security operations ready?
Get a free SOC assessment or see how AlertMonitor cuts through alert noise with automated triage.