SOCcare June 2026: previously unseen malware

Icon

Enter: from a single Ctrl+V to previously unseen malware

Recently I had the chance to analyze an interesting malicious chain: from “ClickFix” social engineering to a previously unseen modular Python RAT and a browser extension. The interesting part is how the malware obtains its C2 domains: not hardcoded, but dynamically retrieved from a smart contract on the blockchain (the EtherHiding tactic). This is the analysis I would like to share.

First stage - “ClickFix”

It all started on a legitimate but compromised website – a Lithuanian clothing store. On which a convincing but fake message was placed – “let us know you’re human” – along with a simple “solution”: press Win + R, then Ctrl + V and Enter. An interesting detail is that the malicious message was loaded from the promo-chatgpt.com domain.

The trick is that the website’s code has already placed a malicious command onto the clipboard. The user thinks they are confirming their humanity, but in reality they launch the malware’s first command with their own hands. This technique, called ClickFix, is particularly unpleasant from a defensive standpoint: at the start there is often no download of malicious code at all; and the action is performed by the user themselves, so it looks like legitimate human activity. In the observed case, the executed command only created a scheduled task named “Enter”, which was already meant to download the next stage.

Second stage - control via Powershell

Once the scheduled task “Enter” ran, it downloaded and executed a script that saved two files into the user’s temporary directory (%TEMP%) – a launcher and an obfuscated PowerShell script – then added the registry “Run” key PersonalizedUpdates (so that it would run when the user logs in), deleted the scheduled task “Enter” itself (it had already done its job, so the trace is removed) and launched the obfuscated script.

It is precisely this obfuscated script that is the first real control component – a kind of “mini” PowerShell RAT. First it collected the system’s fingerprint – the username, the computer name and the unique system identifier stored in the registry (MachineGuid) – and encrypted it in several layers (XOR with a static, hardcoded key → string reversal → Base64). This fingerprint lets the operator identify each victim.

Then comes the most interesting part – how the script knows with which server to communicate. The C2 domain is not written into the script. Instead it is obtained dynamically from the blockchain – a technique called EtherHiding.

The essence of how it works is this: the operator “hides” their C2 domain in a smart contract on a public blockchain network (in this case – Polygon). The malicious code performs an eth_call type query to a specific contract (specifying its address and the function to be called), and the returned value is decoded into the actual C2 address. Unlike a domain or a server, a blockchain record cannot be taken down – it is immutable and uncensorable. And the queries travel to reputable public blockchain RPC nodes, which are rarely blocked in organizations. An important detail – eth_call is a read-only operation: it is executed locally on the blockchain node, no transaction is broadcast to the network, no “gas” fee is paid and no “on-chain” trace is left that could be linked to the victim. The malicious code simply reads the state of the contract – as if it were a value from a remote configuration file.

Having obtained the C2 address (3262d48df5d75e34[.]shop), the script began a periodic (every 20 seconds) beacon connection, sending the encrypted fingerprint in the Authorization header, thereby signaling that a new victim is active and awaiting commands.

From this C2 a single command was received: via Invoke-WebRequest download and run the next stage from the onemm[.]net domain (IP 37[.]27[.]52[.]152). The downloaded file was saved in the temporary directory – and from it begins the most interesting part of the chain.

Third stage - Python environment and modular RAT

The PowerShell script downloaded in the second stage begins the third part of the chain. First it checks whether Python is installed on the system, and if it does not find it – it unpacks a portable Python environment bundled within itself (gzip + Base64) together with the malicious code into a subfolder of the temporary directory and launches pythonw.exe (a Python environment without a pop-up window, the process runs in the background), passing it the malicious Python bytecode (.pyc) file, disguised under the innocent name LICENSE.txt.

Here lies another elegant trick: pythonw.exe is legitimately signed by “Python Software Foundation”, so signature-based protections do not block it. Only the .pyc file (LICENSE.txt) is malicious, while all the real activity happens under the name of a legitimate process –  the classic “bring your own interpreter” principle.

LICENSE.txt itself is heavily obfuscated: random function and variable names, XOR + Base64 encrypted strings, ”dead” code and control flow implemented through exceptions, all making analysis harder. Even before getting to work, it performs a sandbox check: it sleeps for 5-10min, then reads the USERNAME and COMPUTERNAME values and compares them against a “blacklist” of known analysis environments – for example, typical sandbox usernames (such as “JohnDoe”) or computer names (such as “DESKTOP-NAKFFMT”). Upon detecting such an indicator, the malware immediately terminates and thereby evades automated analysis systems. Only once it is convinced that it is running on a real machine does it continue its work.

The launched .pyc operates modularly – it is by now a full-fledged Python RAT that, according to C2 commands, downloads and executes individual modules (if needed it can relaunch itself as an x64 version too). First, system and network reconnaissance is performed – commands such as net session, cmd /c ver, ipconfig /all, net use and arp -a are run, and the installed antivirus programs are enumerated via the SecurityCenter2 WMI class. Next the bot establishes persistence via two more mechanisms (a registry “Run” key edgewebhelper_7565 and a logon script by adding the registry HKCU\Environment\UserInitMprLogonScript), thus adding two new ones to the earlier first-stage persistence.

Then data collection begins: the bot takes a screenshot, reads the clipboard contents and proceeds to steal data stored in the browser. To do this it forcibly closes the browsers and relaunches them with specific parameters that allow it to “unlock” the password and cookie databases. In this way browser data is stolen – not only passwords, but also session cookies, which make it possible to bypass multi-factor authentication (MFA), because once an active session is hijacked no separate login is needed.

The connection to the C2 again starts with EtherHiding – this time the C2 domain (aj3hf7uk3hh3yskr[.]com) is obtained from a second Polygon contract. The connection is by now more mature than the first stage’s “mini” RAT: JSON messages are encrypted with AES-256-GCM and sent over HTTPS less frequently (the default “beacon” interval is ~250 s), and the functionality is split across several endpoints – /b (beacon), /r (results), /l (logs), /mc/{name} (module download) and /s (interactive stream). The bot supports a rich set of commands: dynamically load, run and update modules, rotate encryption keys, and upon receiving a “kill” command – terminate and remove its traces. Failed transmissions go into a retry queue (up to 100 messages), so some of the data is not lost even when the connection is intermittent.

Finally the bot contacts yet another server (90happymoney[.]top) and downloads the last component – a browser extension, which turns the chain into full-fledged remote control within the browser itself.

Fourth stage - a "Chrome" extension with two layers

The last component of the chain is downloaded from 90happymoney[.]top and installs itself as a Chrome extension (location %APPDATA%\MediaEngineOpen_6u6g8l, extension ID kkecmimnokipgkinknmmpjcbpldfdhfd). It consists of two obfuscated scripts that control two different layers – content.js and LensTestManager.ps1 – along with the control script background.js that connects them.

content.js runs in the context of every visited page. Its goal is to capture data while still in the browser. To do this it overrides three standard browser mechanisms: XMLHttpRequest.send(), window.fetch() and window.postMessage() – from that moment on all POST/PUT/PATCH traffic sent from the page passes through its filter. Besides traffic, content.js records keystrokes (keylogger functionality) and intercepts form submissions. It collects payment card data in several ways at once: it scans DOM elements, checks field names and autocomplete attributes, validates the numbers it finds with the Luhn algorithm and monitors the postMessage stream – in this way even data passed through iframes from payment processing services (“Stripe”, “Braintree”, “Spreedly”) is captured. All the collected information is passed to the background.js script.

System-level operations are carried out through a native messaging host. background.js sends commands via chrome.runtime.sendNativeMessage(“com.top.index”, …), and they are executed by LensTestManager.ps1, which is launched by TestPad.bat. LensTestManager.ps1 – a file of about 58 thousand lines, the bulk of which consists of junk, deceptive functions. The file header is forged so that the script would look like a legitimate tool: it declares itself to be “SessionManager v2.6.21 – Enterprise ResourcePool Module” (the author is listed as “Platform Engineering”). The real malicious code – one large obfuscated “PowerShell” string, hidden in the middle of the file. Before getting to work, it first “blinds” the defenses: it tries to disable AMSI, ETW and PowerShell script block logging, thereby depriving defenders of part of their visibility. Using the native messaging host, the operator can execute any “PowerShell” command.

background.js is the intermediate node between the extension and the operator. It gathers data from content.js and runs PowerShell commands via LensTestManager.ps1. Here too the C2 address is obtained via “EtherHiding” – this time from a third “Polygon” contract. Having connected to the C2 over WebSocket (wss://90happymoney[.]top:3001/ws), it maintains a persistent interactive connection. On first launch it automatically reads and sends to the C2 a screenshot, all browser cookies, browsing history, bookmarks, the list of installed extensions and the list of software present on the system.

At this stage the chain achieves its goal: content.js collects data in real time at the browser level, while LensTestManager.ps1 executes commands on the system itself. The victim is compromised simultaneously at both levels – both the browser and the system.

Conclusion

Spotting such a chain and blocking it in time is hard. The malicious code was new, previously unseen – even as this article was being written, according to VirusTotal data most security vendors mark this attack’s IoCs as safe. Since signature-based measures do not catch a sample like this, the only hope is behavioral analysis – but even the most advanced EDR solutions react too late in this chain, when the damage has already been done.

What would have actually helped? First of all – user training. Phishing training must include a separate section on ClickFix type attacks: explaining the “let us know you’re human” and “Win+R → Ctrl+V → Enter” scenario itself.

Second, organizations should consider blocking blockchain RPC endpoints on workstations. If Web3 functionality is not needed by the company, such traffic can be restricted without hesitation – and this directly counters the EtherHiding tactic, depriving the malware of the ability to dynamically obtain the C2 address or commands. There is no continuously updated, official list of such endpoints, but as a reference point one can use community-maintained lists – for example, awesome-list-rpc-nodes-providers, which collects the addresses of public RPC nodes and providers for many networks (among them – Polygon too).

A closing thought – the most effective investment is often not yet another tool, but a person who will recognize the attack before pressing “Enter”.

IoCs:

RPC endpoints used in campaign:

  • hxxps[://]polygon-bor-rpc[.]publicnode[.]com
  • hxxps[://]1rpc[.]io/matic
  • hxxps[://]polygon[.]gateway[.]tenderly[.]co
  • hxxps[://]polygon[.]api[.]onfinality[.]io/public
  • hxxps[://]polygon[.]rpc[.]subquery[.]network/public
  • hxxps[://]polygon[.]lava[.]build
  • hxxps[://]polygon[.]publicnode[.]com
  • hxxps[://]polygon[.]drpc[.]org
  • hxxps[://]gateway[.]tenderly[.]co/public/polygon

Smart contract addresses and functions:

  • 0xde2d34339C279A7a79bc4fC1C4F37d3C055211b7 (0xb68d1809) – used by PowerShell RAT
  • 0x5c4576e21809ffa8d265bb7385f044a693356c43 (0x3bc5de30) – used by Python Rat
  • 0x46124F9F0f0d70c8b9e62258179574E05FbFF181 (0x3bc5de30) – used by browser extension

Domains/IPs:

  • promo-chatgpt[.]com – ClickFix
  • cleearpeyak[.]online – First stage download domain
  • 2fa07e71ccc6b74f[.]fun – Alternative first stage download domain (after cleearpeyak[.]online was taken down)
  • 3262d48df5d75e34[.]shop – PowerShell RAT C2
  • onemm[.]net (37[.]27[.]52[.]152) – second stage download domain
  • aj3hf7uk3hh3yskr[.]com (45[.]148[.]125[.]108) – Python RAT C2
  • 90happymoney[.]top (31[.]169[.]125[.]164) – third stage download domain and browser extension C2

Hashes:

  • be753ab79513e01452b09a769e52a9048494a366dee9bfb8c681596f3cce272d – PowerShell RAT stager script
  • 7b0cf36784134d5b22ccb82034928f38b9bc2bf6c98d20f2d00e5454cf2cd498 – PowerShell RAT
  • 9c2b3cd0534b9a4cb2cb5c13c8949354be4c24f0b5a611de49086f7cda2fe390 – Python RAT stager script
  • 96fd2b433e48f272f11fa2de515683b8a523179d9e7d66967dd7d883c5a45828 – LICENSE.txt (Python RAT)
  • f22474d14d5fce0345fc7ce016ad1d3e7b001b6c29eb6f744a44369097087606 – background.js
  • 5716d26ceb28db4bff6ea456e18530207c9fab13e0a2d1221a671ab34c8b9817 – content.js
  • 093ce6b1024951fcc9b1653e8c084bb78647c1c1893c144f731241d098967a98 – TestPad.bat
  • 44043ceda5983741d195bc1870c89c1d346c500236dace195e15e4e38ab72c50 – LensTestManager.ps1

Other:

  • kkecmimnokipgkinknmmpjcbpldfdhfd – malicious extension ID
  • top.index – malicious extension name
  • “Optimizes web browsing workflow” – malicious extensions description
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run\PersonalizedUpdates – PowerShell RAT persistence
  • HKCU\Software\Microsoft\Windows\CurrentVersion\Run\edgewebhelper_7565 – Python RAT persistence

The article is part of the SOCcare project, which is co-funded by the European Union, alongside our collaborators, NRD Cyber Security and RevelSI, and supported by the European Cybersecurity Competence Centre (ECCC) Centre (ECCC) under Grant Agreement No. 101145843. Views and opinions expressed are however those of the author(s) only and do not necessarily reflect those of the European Union or the European Cybersecurity Competence Centre. Neither the European Union nor the European Cybersecurity Competence Centre can be held responsible for them. 

Other news and stories

SOCshare: 2026 July cyber landscape review
SOCshare: 2026 July cyber landscape review
In 2025, NRD Cyber Security saw growth in both its project-based activities and ongoing services
In 2025, NRD Cyber Security saw growth in both its project-based activities and ongoing services
Justas Kaminskas on what CTF is and how to win it
Justas Kaminskas on what CTF is and how to win it
SOCshare June 2026: cybersecurity landscape review
SOCshare June 2026: cybersecurity landscape review
The 3rd edition of the Guide for developing a National Cybersecurity Strategy
The 3rd edition of the Guide for developing a National Cybersecurity Strategy
SOCshare May 2026: News in cyber threat landscape
SOCshare May 2026: News in cyber threat landscape
SOCshare April 2026 review : Adobe Acrobat Reader, Claude and phishing
SOCshare April 2026 review : Adobe Acrobat Reader, Claude and phishing
SOCcare March 2026: A “Little Gift” from the photo shop
SOCcare March 2026: A “Little Gift” from the photo shop