Task-specific Atlas Agents investigate threats at machine speed with full transparency, expert validation, and explainable outcomes you can trust.
Atlas Extended Detection and ResponseOpen XDR with Agentic AI & machine learning that eliminates noise, enables real-time detection and response, and automatically blocks threats.
Atlas User ExperienceSee what our SOC sees, review investigations, and see how we are protecting your business.
Atlas Platform IntegrationsSeamless integrations and threat investigation that adapts to your tools and evolves with your business.
24/7 SOC-as-a-Service with unlimited threat hunting and incident handling.
Threat Response Unit (TRU)Proactive threat intelligence, original threat research and a world-class team of seasoned industry veterans.
Cyber Resilience TeamExtend your team capabilities and prevent business disruption with expertise from eSentire.
Response and RemediationWe balance automated blocks with rapid human-led investigations to manage threats.
Combine AI-driven security operations, multi-signal attack surface coverage and 24/7 Elite Threat Hunters to help you take your security program to the next level.
Get unlimited Incident Response with threat suppression guarantee - anytime, anywhere.
CTEM and advisory programs that identify security gaps and build proactive strategies to address them.
Flexible MDR pricing and packages that fit your unique security requirements.
Entry level foundational MDR coverage
Comprehensive Next Level eSentire MDR
Next Level eSentire MDR with Cyber Risk Advisors to continuously advance your security program
Stop ransomware before it spreads.
Identity ResponseStop identity-based cyberattacks.
Zero Day AttacksDetect and respond to zero-day exploits.
Cybersecurity ComplianceMeet regulatory compliance mandates.
Third-Party RiskDefend third-party and supply chain risk.
Cloud MisconfigurationEnd misconfigurations and policy violations.
Cyber RiskAdopt a risk-based security approach.
Mid-Market SecurityMid-market security essentials to prioritize.
Sensitive Data SecurityProtect your most sensitive data.
Cyber InsuranceMeet insurability requirements with MDR.
Cyber Threat IntelligenceOperationalize cyber threat intelligence.
Security LeadershipBuild a proven security program.
On February 3rd, 2026, CISA added a recently disclosed critical vulnerability in SolarWinds Web Help Desk (WHD) to its Known Exploited Vulnerabilities (KEV) catalog. The flaw, tracked as…
On January 29th, 2026, Ivanti disclosed two critical zero-day vulnerabilities impacting the Ivanti Endpoint Manager Mobile (EPMM) product. The vulnerabilities are tracked as CVE-2026-1281…
eSentire is The Authority in Managed Detection and Response Services, protecting the critical data and applications of 2000+ organizations in 80+ countries from known and unknown cyber threats. Founded in 2001, the company’s mission is to hunt, investigate and stop cyber threats before they become business disrupting events.
About Us Leadership Careers Event Calendar → Newsroom → Aston Villa Football Club →We provide sophisticated cybersecurity solutions for Managed Security Service Providers (MSSPs), Managed Service Providers (MSPs), and Value-Added Resellers (VARs). Find out why you should partner with eSentire, the Authority in Managed Detection and Response, today.
Search our site
Multi-Signal MDR with 300+ technology integrations to support your existing investments.
24/7 SOC-as-a-Service with unlimited threat hunting and incident handling.
We offer three flexible MDR pricing packages that can be customized to your unique needs.
The latest security advisories, blogs, reports, industry publications and webinars published by TRU.
Compare eSentire to other Managed Detection and Response vendors to see how we stack up against the competition.
See why 2000+ organizations globally have chosen eSentire for their MDR Solution.
In January 2026, eSentire's Threat Response Unit (TRU) detected a malicious command attempting to deploy Prometei on a Windows Server belonging to a customer in the Construction industry.
Prometei is a botnet suspected to be of Russian origin and has been active since 2016. It features extensive capabilities, including remote control functionality, credential harvesting, crypto-mining (Monero), lateral movement, Command and Control (C2) over both the clearweb and TOR network, and self-preservation measures that harden compromised systems against other threat actors, to maintain exclusive access.
This blog provides a comprehensive breakdown of Prometei's technical operations including its installation process, persistence mechanisms, encryption methods, C2 communication protocols, and the additional modules it employs.
We share detailed technical artifacts including process trees, network traffic analysis insights, CyberChef recipes for decrypting communications, Yara rules for detection, and utilities to aid security researchers and defenders in analyzing and mitigating this threat.
The initial access vector for this incident remains undetermined due to insufficient logging and the absence of Endpoint Detection and Response (EDR) capabilities on the compromised system.
Based on analysis of modules deployed by Prometei, it is hypothesized that the threat actors gained entry by leveraging commonly used or default credentials against Remote Desktop Protocol (RDP) services. Following initial access, threat actors executed the following command in an elevated command prompt.
The command works by using both a Command Prompt command to write an "XOR key file" at C:\Windows\mshlpda32.dll, and a PowerShell command to download, decrypt, and execute the Prometei payload.
This is described in depth as follows:
Note: The XOR Key File is not used in this process, this file is specific to the unpacking routine for the Prometei payload.
The HTTP request/response associated with the command can be seen in the figure below, where the victim's computer name is transmitted in the request URL following "_AMD64,". The response contains the base64 encoded/XOR encrypted Prometei payload.
This same rolling XOR key-based algorithm is also used in decrypting additional modules like netdefender.exe (RDP brute force protection module), rdpcIip.exe (lateral movement module), etc., however they are not returned as a base64 encoded string from the download C2. The following python psuedo-code can be used to decrypt the response.
import base64
ciphertext = base64.b64decode('<BASE64_RESPONSE>')
plaintext = bytearray(len(ciphertext))
j = 0
for i in range(len(ciphertext)):
j += 66
plaintext.append(((ciphertext[i] ^ ((i*3) & 0xFF)) - j) & 0xFF)
print(plaintext)
A truncated view of the attack chain illustrates how the attack progressed, where threat actors likely gained initial access via a compromised Remote Desktop account, followed by running the malicious Command Prompt/PowerShell command, resulting in the download/execution of Prometei.
The malware then added exceptions to the Windows Firewall, copied itself C:\Windows\sqhost.exe, and used this path in creating/starting itself as a Windows service.
This was followed by collecting system information via several LOLBins like wmic.exe, sending the collected information to the C2 server for registration purposes, and adding a Microsoft Defender exclusion for the "additional modules" directory at C:\Windows\dell.
The process tree illustrated in the figure below depicts the sequential relationship of processes, command lines, and their corresponding descriptions relevant to this incident.
SHA256: 8d6f833656638f8c1941244c0d1bc88d9a6b2622a4f06b1d5340eac522793321
Unpacking
The entrypoint/main routine for Prometei is in the .stub section. This routine reads the first byte of the XOR Key File at C:\Windows\mshlpda32.dll and uses it in a rolling XOR key-based cipher to decrypt the .text (e.g. code) and .data (e.g. strings) sections.
Execution is transferred to the Original Entry-Point (OEP) in the decrypted .text section at the end of the main routine.
Key characteristics:
Two components:
For each iteration through the encrypted buffer, the XOR key is calculated as (shift + counter):
The following python code reproduces the rolling XOR key-based cipher, given the first byte "\x31" or "1" from the XOR Key File:
def xor_decrypt(data: bytes, constant: int) -> bytes:
"""
XOR decrypt with rolling key
args:
data: a bytes object representing the encrypted data
constant: a magic number used to transform the XOR key,
e.g. "1" or \x31
returns:
a bytes object representing the decrypted data
"""
result = bytearray()
shift = 0
counter = 0
for byte in data:
result.append(((shift + counter) & 0xFF) ^ byte)
shift = (shift + constant) & 0xFF
counter = (counter - 1) & 0xFF
return bytes(result)
On the other hand, if the XOR Key File is not present, the malware intentionally executes a series of innocuous behaviors "decoy actions" before exiting. This involves creating a text file at C:\Windows\temp\setup_gitlog.txt and appends both the string "PaiAuganMai Diag Utility - Setup" and output from systeminfo/ping commands.
Prometei performs the following actions as part of its "installation" process:
The Windows Service is configured to ignore errors (ErrorControl == 0x00), act as a Win32 process (Type == 0x10), and start automatically during system startup (Start == 0x02).
As previously mentioned, during the installation process, Prometei stores values needed for subsequent C2 communication in the Windows Registry. An export with example values of this registry key is shown below.
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Intel\Support]
"CommId"="3NKWKZSI6D498N41"
"MachineKeyId"="zRb5X7SYNtFbwCrl"
"EncryptedMachineKeyId"="XL7W5ask+3cqXv2kZjZDJJMoEprBMzse1OlO17t+2JNoUv9U9MGxsrGuPxaj9g8XQxcaXJfHOe0KmlRv2QzVvVTdmWDg2gS6FZW+ZTt1AIWO0DREkke21HcFecFBXcd0kehypyfJTLDZ+coKRWi+kiN4MuIZa1zqGw5J1Im9lL0="
Each registry value is described as follows:
The RSA-1024 key we identified in our analysis is as follows:
-----BEGIN CERTIFICATE-----
MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQDCdFn/8lWoEazvqsV7kmEgV6T9ikbEFMPlCqFjQzIhg+cNO/az/JZIJjVRpZDsZAZD11C1PeYv9Ym2zFhZQkhFbU2RMV/QcvgN08mdqNjwfbToUa3+3Qhdy18/5crohM1M7Ls6C24P7QvMTXtsvMSqyAn1NTJdOz8FgrVzkJdOXQIDAQABq6urq6urq6vu/u7+7v4AAAAAAAAAAFE21TE=
-----END CERTIFICATE-----
Both the CommId and MachineKeyId (RC4 key) are generated through a random string/byte generator routine at offset 0x6AAB. This routine generates a byte array with a fixed length of 16 bytes and supporting the following character set options:
The figure below displays pseudo-code of the routine (offset 0x7799) used in RC4 encryption. While attempting to identify crypto-algorithms in code, it is worth noting RC4 makes use of an initialization loop and specific constants like 0x100 or 256.
Prometei establishes communication with the C2 only if it is executing as a Windows service. This presents a challenge in dynamic analysis, as debuggers can only be attached after the Service Control Manager (SCM) has started the service.
An effective approach to debugging Windows services involves patching non-critical instructions, and in the case of Prometei, the instructions corresponding to Prometei's "decoy actions" are a prime candidate.
First, we must overwrite these instructions with a NOP sled '0x90' bytes, followed by an indirect function call to Sleep, and finally an interrupt instruction (0xCC).
After this modification, simply:
The figure below shows the NOP sled, followed by the call to Sleep and interrupt instruction.
Prometei communites with the C2 server over HTTP. For the sample specific to this incident, the primary C2 server is at 103.176.111.176 (AS 63737 VIETSERVER SERVICES TECHNOLOGY COMPANY LIMITED).
Harvested information from the victim machine is RC4 encrypted, base64 encoded, and sent via HTTP GET query parameters. Optionally, collected information is compressed via LZNT1 following RC4 encryption/base64 encoding.
A breakdown of query parameters, how they are generated, and their purpose is described in the table below.
| Parameter | Description |
| i | Generated via the random string generator routine and matches the regex: [A-Z0-9]{16}. This identifier serves as a unique client fingerprint that allows the server to recognize individual machines during communications. |
| r | Number representing CPU usage delta from the last measurement, where negative delta indicates reduced load and positive indicates increased load. This query parameter is required in all requests to the C2 except in the registration request and is calculated by calls to NtQueryInformationProcess + GetSystemTimes, which are used in the formula: (1.0 - (IdleTime / (KernelTime + UserTime))) x 100.0 |
| add | Comprehensive system information (RC4 encrypted), used exclusively in the registration process with the C2. |
| h | Victim computer name (RC4 encrypted), used exclusively in the registration process with the C2. |
| enckey | RSA-1024 encrypted RC4 key, used exclusively in the registration process with the C2. |
| answ | Used in transmitting any requested information to the C2, e.g. running processes. This information is LZNT1 compressed, base64 encoded, RC4 encrypted, and base64 encoded again. |
Initial contact with the C2 is shown in the figure below, where the C2 responds with the sysinfo command.
As a means of registering with the C2, Prometei sends victim device information (collected from registry keys/values, LOLBins like wmic.exe, COM, etc.) via the "add" query parameter as a base64 string containing RC4-encrypted plaintext.
The victim computer name is sent via the "h" query parameter using the same encryption, while the "enckey" parameter contains a base64 encoded RSA-1024 encrypted RC4 key - enabling secure key exchange with the C2 since it possesses the private key needed to reveal the plaintext RC4 key.
Note, hooking the Random String Generator routine or dumping from registry are both effective techniques to retrieve the same plaintext RC4 key.
The following table lists LOLBins/associated command lines and descriptions that are used in the fingerprinting process:
| Command Line | Description |
| wmic baseboard get Manufacturer | Get motherboard manufacturer |
| wmic baseboard get product | Get motherboard product name |
| wmic ComputerSystem get Model | Get computer model name |
| cmd.exe /c ver | Get OS version |
| wmic os get caption | Get OS name |
The figure below shows how the malware uses COM to retrieve installed antivirus, first by initializing COM via CoInitializeEx, then creating a WbemLocator object via CoCreateInstance, and uses either the ROOT\SecurityCenter or ROOT\SecurityCenter2 namespace depending on whether the OS is considered legacy or not.
It calls the IWbemLocator::ConnectServer method to create a connection to the namespace, executes the query "SELECT * FROM AntiVirusProduct" via the IWbemServices::ExecQuery method, and finally retrieves the displayName property.
Note that it doesn't enumerate over all objects returned by ExecQuery, but rather only gets the displayName property from the first object. This can be seen in the figure, where the IEnumWbemClassObject::Next method is called with the uCount parameter (number of requested objects) set to 1.
After the harvested system information is sent to the C2, it responds with "ok!" to indicate successful registration. Interestingly, the C2 response also contains a duplicate Content-Type header value that was erroneously added to the response body. As a result, the Content-Length header value does not accurately reflect the actual response body size.
Decoding the base64 blob from the query parameter reveals another base64 encoded string in the format: info {E$<BASE64>}. Note, the usage of the "E$" prefix marker signifies that the data following it is RC4 encrypted.
The next figure illustrates the full series of operations needed in CyberChef to reveal the plaintext. This involves first dropping bytes (effectively extracting only the base64 blob), decoding it from base64, dropping bytes again (ignoring the preceeding E$ prefix marker), and decrypting via the randomly generated RC4 key, i.e. the "MachineKeyId".
The plaintext contains the following victim device information:
We have included the CyberChef recipe for decrypting information transmitted via the "add" parameter in the code snippet below.
From_Base64('A-Za-z0-9+/=',false,false)
Drop_bytes(0,8,false)
Drop_bytes(-1,1,false)
From_Base64('A-Za-z0-9+/=',false,false)
Drop_bytes(0,2,false)
To_Hex('Space',0)
RC4({'option':'Latin1','string':'Ya2lT9cERZYlw0g5'},'Hex','Latin1')
The next figure displays a request to the C2 containing the "answ" query parameter. This parameter is used in transmitting harvested information from the victim machine and is base64 encoded/LZNT1 compressed/RC4 encrypted.
To reveal the plaintext, we must understand the steps taken by the malware to yield the ciphertext:
And use it's inverse to reveal the plaintext:
Note: "Prefix bytes" refers to Prometei's use of different prefixes to enable the C2 to distinguish between encrypted and compressed data:
We have included the CyberChef recipe that performs the aforementioned actions in the code snippet below.
Find_/_Replace({'option':'Simple string','string':'-'},'+',true,false,true,false)
Find_/_Replace({'option':'Regex','string':'_'},'/',true,false,true,false)
From_Base64('A-Za-z0-9+/=',false,false)
Drop_bytes(0,2,false)
To_Hex('None',0)
RC4({'option':'Latin1','string':'Ya2lT9cERZYlw0g5'},'Hex','Base64')
From_Base64('A-Za-z0-9+/=',false,false)
Drop_bytes(0,2,false)
LZNT1_Decompress()
Using this recipe on two captured requests containing the "answ" parameter, we can see the malware transmits both a list of running processes and the IP configuration from the victim machine to the C2.
If the C2 returns "no" in the response body, Prometei continues polling the C2 for additional commands.
For a full list of C2 commands and associated purpose, see Talos' blog Prometei botnet and its quest for Monero or Trend Micro's blog Unmasking Prometei: A Deep Dive Into Our MXDR Findings.
We observed Prometei download several additional modules that we have described below. Modules were downloaded through a batch script Prometei created at "C:\Windows\dell\walker_updater.cmd".
This script downloads 7-Zip from 23.248.230[.]26/dwn.php?d=7z32.exe and additional modules from 23.248.230[.]26/update.7z.
The modules are decrypted using 7-Zip with the password "horhor123" - the same password reported in previous malware analysis reports on Prometei.
netdefender.exe - Subscribes to Event ID 4625 via the Windows API EvtSubscribe and monitors for failed logins. If a remote or local IP fails to login several times, the remote/local IP is blocked via the Windows Firewall.
This provides Prometei operator(s) with exclusive access to the victim machine by safeguarding it from further RDP brute-force attacks.
The commands used by this module are as follows:
"C:\Windows\System32\cmd.exe" /C netsh advfirewall firewall delete rule name="Banned brute IPs"
"C:\Windows\System32\cmd.exe" /C Auditpol /set /subcategory:"Logon" /failure:enable
netsh advfirewall firewall add rule name="Banned brute IPs" dir=in interface=any action=block localip=<BANNED_IP>
netsh advfirewall firewall add rule name="Banned brute IPs" dir=in interface=any action=block remoteip=<BANNED_IP>
rdpcIip.exe - Used in executing miWalk, lateral movement with default/weak passwords. Sets an exclusion for the staging path:
powershell -inputformat none -outputformat none -NonInteractive -Command Add-MpPreference -ExclusionPath "C:\Windows\Dell"
msdtc.exe - Proxies requests over TOR for the C2 server "hxxps://gb7ni5rgeexdcncj[.]onion/cgi-bin/prometei.cgi"
smcard.exe - Proxies requests over TOR via SOCKS
miWalk32.exe - Mimikatz, collects stolen credentials into C:\Windows\dell\slldata2.dll
miWalk64.exe - Mimikatz x64, collects stolen credentials into C:\Windows\dell\slldata2.dll
windrlver.exe - SSH spreader
The Yara rule included below can be used to detect the Prometei payload.
rule Prometei
{
meta:
description = "Detects Prometei Botnet installer"
author = "YungBinary"
strings:
$xor_key_dll = {
C6 80 [4] 5C
C6 80 [4] 6D
C6 80 [4] 73
C6 80 [4] 68
C6 80 [4] 6C
C6 80 [4] 70
C6 80 [4] 64
C6 80 [4] 61
}
$decrypt = { BF ?? ?? ?? ?? 8A 4D ?? 02 C8 30 0F }
$bogus_log = {
C6 05 [4] 73
C6 05 [4] 65
C6 05 [4] 74
C6 05 [4] 75
C6 05 [4] 70
C6 05 [4] 5F
C6 05 [4] 67
C6 05 [4] 69
}
$systeminfo = { C6 05 [4] 73
C6 05 [4] 79
C6 05 [4] 73
C6 05 [4] 74
C6 05 [4] 65
C6 05 [4] 6D
C6 05 [4] 69
C6 05 [4] 6E
C6 05 [4] 66
C6 05 [4] 6F
}
$cpuid = {
0D 00 00 20 00
50
9D
9C
58
25 00 00 20 00
3D 00 00 20 00
74
}
$rdtsc = {
F6 45 ?? 10
59
59
5F
74 ??
0F 31
C9
C3
}
condition:
3 of them
}
eSentire has created two python script-based utilities to aid security researchers in the analysis of Prometei and its modules:
A list of Indicators of Compromise can be found in the table below. For additional indicators, please see eSentire's Github repository here.
| Type | Value | Description |
| IPv4 | 103.91.90.182 | Prometei stager IP and download server for additional modules |
| IPv4 | 103.176.111.176 | Prometei C2 |
| IPv4 | 23.248.230.26 | Prometei download server for additional modules |
| SHA-256 | 9a6f5a55f5048bd8b0c80fd6da979fc6d7b5e589c7e65ad1c21c861b87855151 | Prometei payload (sqhost.exe) |
| SHA-256 | 8d6f833656638f8c1941244c0d1bc88d9a6b2622a4f06b1d5340eac522793321 | Prometei payload (sqhost.exe) |
| SHA-256 | 8c6d0728e65864923a9dd9cf1cb512ab65c3d80b69505818a52563a1efe4b59f | Prometei payload (sqhost_new.exe) |
| SHA-256 | e5819085c1d8bf668ca0737f6d288bd1d5d3ede5658c11be0c51a6c48fb0f60d | update.7z (additional modules, password: horhor123) |
| SHA-256 | c5f76cb93d2f3fd68b46c6ae8e5ca98d3b58eca0964025ef67af109cecf60c49 | netdefender.exe |
| SHA-256 | c9fd9d54834f0a08597aa952e4265a25dcb248d552facd37cda967f32fc9cc7f | walker_updater.cmd |
| SHA-256 | 33f4cbf0292c4e957f894269d2d9411fed7ed9b2be4c858ac20418ee36a8b595 | rdpcIip.exe |
| SHA-256 | db1576a9cb41e351930b758965b3a886b8647d880d20724184db31880601db5 | rdpcIip_new.exe |
| SHA-256 | 314d2f1cb70c025ab0ba9de8c13914bda674b8f0a23e54454374d14d57fd2786 | miWalk32.exe (Mimikatz) |
| SHA-256 | af000bc9f397975604ec0ffd36ff414005ea49ca97ec176eadd14072ceccac00 | miWalk64.exe (Mimikatz) |
| SHA-256 | 38fee2445532a4cf120226ff175e0fff55601cc36ff1b8eb7006c2b3f6955831 | windrlver.exe |
| SHA-256 | c0f71e86d71f799ef6fc493e85bf1db5b1202b8ead301718d55544e8151cb4c2 | msdtc.exe |
| SHA-256 | 01bee3bb01f34f8da926c6b83980958166f1b10d00a923deb87361e9f34bcd83 | smcard.exe |
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 STARTEDThe 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.