| Resource Development | | Operates a licensed panel with multiple utilities and manages infrastructure including steganographic PNG hosting, session and signal endpoints, and payload auto-rebuilding. Uses a Telegram bot (@harrypoterlohBOT) for operational notifications. Operators registered phishing domains impersonating CRM portals (login-netsuite[.]com, login-hubspot[.]com, verification-salesforce[.]com, and others). | Newly registered domains with -netsuite, -hubspot, -salesforce, -odoo in the name; Telegram bot activity from build infrastructure; DOUBLECUP license panel exposed at port 9090. |
|---|
| Initial Access | | Entry is through phishing links directing victims to fake CRM login pages. Observed lures impersonate NetSuite, Odoo, HubSpot, and Salesforce login portals. DOUBLECUP code is injected via embedded iframes into the operator's phishing page. On page load the browser immediately starts pre-caching the PNG; no user interaction beyond visiting the page is required for staging to complete. | Proxy/DNS logs for phishing domains; user navigating to a login page that contains an iframe loading a DOUBLECUP /api/config endpoint; browser downloading a large PNG immediately on page load. |
|---|
| Execution | | The FakeCaptcha places a browser-specific command into the clipboard and instructs the victim to run it. The command uses cmd, for loops with wildcards (pow?r?hell.exe), and findstr or certutil to locate and extract the PNG payload. PowerShell runs Stage 2 and is the core execution engine for CountLoader 4.5p. Python (downloaded as an embeddable package) handles CountLoader's primary persistence task. WMI is used by both CountLoader and DeviceManager for system information discovery. | cmd.exe spawned interactively from Run dialog or console; findstr or certutil reading files from browser cache directories; PowerShell with wildcarded binary names (pow?r?hell.exe); embeddable Python package downloaded to USERPROFILE; WMI Win32 queries from a non-system process. |
|---|
| Persistence | | CountLoader creates two scheduled tasks: GoogleUpdateService<GUID> (primary, runs a downloaded Python environment to re-fetch CountLoader from C2 every 25 minutes) and MSEdgeUpdateService<GUID> (fallback, runs the headless patched conhost.exe to pull and run CountLoader). Both tasks delete their XML definitions after creation. The malware runs briefly every 25 minutes and terminates, making behavioral engines unlikely to catch it mid-execution. DeviceManager includes a WMI Event Subscription mechanism (PythonAppTimer_600 / PythonAppUpdateFilter / PythonAppUpdateConsumer) that uses ctypes COM APIs, bypassing process-lineage detections. The macOS Mach-O variant persists via a LaunchAgent .plist file in ~/Library/LaunchAgents/. | New scheduled tasks named GoogleUpdateService<GUID> or MSEdgeUpdateService<GUID> (Event ID 4698); WMI objects PythonAppUpdateFilter and PythonAppUpdateConsumer in root\subscription; .plist files in LaunchAgents referencing pythonw.exe paths; Python 3.13 embeddable package downloaded to USERPROFILE. |
|---|
| Defense Evasion | | Malicious code is embedded in a PNG image cached by the browser and located by file size rather than filename. Stage 2 uses PBKDF2 to derive its decryption key from the victim's live public IP, making sandbox detonation impossible without the correct network context. The final payload is reflectively loaded as a .NET assembly, never written to disk as an executable. CountLoader uses D/Invoke and a custom Regex-based JSON parser to bypass AMSI and avoid monitoring on ConvertFrom-Json. All execution runs through copies of legitimate Windows binaries with patched PE headers. PowerShell command-line obfuscation uses wildcards (pow?r?hell.exe). Stage 2 XOR-obfuscates .NET namespace strings with key 210, reconstructing them entirely at runtime. | Browser caching a PNG immediately on page load; findstr or certutil reading browser cache paths; no PE file written before payload execution; schtask or cmd.exe running a binary with a name matching a legitimate auto-start app from a user-writable path; D/Invoke loaded via reflection; AMSI bypass attempts; short-lived process pairs. |
|---|
| Discovery | | CountLoader profiles the victim with WMI Win32_Processor, Win32_ComputerSystemProduct, Win32_DiskDrive (hardware fingerprint), Win32_OperatingSystem (exact OS name), and rootSecurityCenter2/AntiVirusProduct (installed AV). It checks HKLM security descriptors to determine administrator privilege and appends an asterisk to the username if elevated. It checks for Ledger Live in APPDATA paths and scans 45 browser User Data directories for 48 extension IDs (primarily crypto wallet extensions: MetaMask, Binance Chain Wallet, Phantom, and others). It checks for the Signal Desktop application. The victim's public IP is resolved via actor-controlled or third-party APIs (ip-api.com) for both telemetry and environmental keying. | WMI queries to Win32_Processor, Win32_DiskDrive, AntiVirusProduct from a short-lived non-system process; reads across 45 browser User Data directories for extension manifests; HKLM MachineGuid read; IP resolution queries to ip-api.com or similar from a process that should not need network location. |
|---|
| Lateral Movement | | CountLoader includes a USB and network-share worming command (command 9) that scans all connected logical and physical drives, drops malicious LNK shortcuts pointing to mshta.exe to pull and run CountLoader, enabling spread to USB drives and network shares. A separate browser shortcut hijacking capability (currently unused/in development) can rewrite .lnk desktop shortcuts to launch CountLoader alongside the legitimate browser. | Malicious LNK creation on USB drives or network shares pointing to mshta.exe; modification of existing browser shortcuts in desktop or Start Menu locations; unexpected mshta.exe launch from a shortcut target. |
|---|
| Collection | | CountLoader audits installed browser extensions for 48 cryptocurrency wallet extension IDs across 45 browsers and checks for Ledger Live and other hardware wallet software in well-known paths. It profiles the system for the Signal Desktop application. This reconnaissance data is packaged and exfiltrated to the C2 on first beacon, providing the operator with a wallet and messaging-app inventory per victim before any follow-on command is issued. | A short-lived process reading browser extension manifest.json files across 45 browser User Data directories; APPDATA reads for @trezor, atomic, Exodus, Guarda, KeepKey, Ledger Live; APPDATA read for the Signal directory. |
|---|
| Command and Control | | DOUBLECUP's session endpoints (/session/reg, /session/check, /session/signal) track infection status over HTTP. CountLoader uses an HTTP GET beacon with a random six-digit XOR key prepended to hex-encoded telemetry; responses are a JWT token used for Bearer authorization on subsequent POSTs. Commands are decrypted from hex with the same XOR key and parsed with a custom Regex JSON parser that avoids ConvertFrom-Json monitoring. The C2 can push 11 different command types including download-and-execute, DLL rundll32, MSI install, lateral movement/USB worming, and persistence cleanup. DeviceManager uses EtherHiding to resolve its C2 from an Ethereum smart contract, with ChaCha20 decryption keyed on the contract address as the nonce. | HTTP GET to /connect?key1=value1... with a 20-character campaign token; Authorization: Bearer headers in POST requests; eth_call JSON-RPC requests to Sepolia testnet RPC endpoints from a non-blockchain process; outbound DNS TXT queries with long base64 labels ending in .microsoft.com but resolving to non-Microsoft infrastructure. |
|---|
| Reconnaissance / Privilege Escalation / Credential Access / Exfiltration / Impact | — | No pre-attack reconnaissance, local privilege escalation, or destructive impact has been documented. Credential access is focused on wallet extension enumeration rather than platform credential theft. Data leaves the environment as part of the C2 beacon rather than through a dedicated exfiltration channel. |
|---|