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.
A critical authentication bypass vulnerability impacting Nginx-ui, CVE-2026-33032 (9.8), is being actively exploited in the wild. The flaw resides in Nginx-ui's Model Context Protocol (MCP)…
On April 11th, 2026, Adobe published a security advisory addressing a previously reported zero-day vulnerability impacting multiple versions of Acrobat Reader. The flaw, tracked as…
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 March 2026, eSentire's Threat Response Unit detected a sophisticated multi-stage malware campaign targeting Chinese-speaking developers and IT professionals through Search engine optimization (SEO) poisoning. Victims searching for popular Chinese developer tools including FinalShell SSH client, Xshell, QuickQ VPN, and Clash proxy, were redirected to convincing lookalike domains that delivered trojanized installers. TRU is tracking this threat as Kong RAT, named for its consistent use of the string "Kong" across registry keys/file paths used by the malware. The campaign's infrastructure consists of a network of spoofed Chinese software domains hosted on shared infrastructure, active from May 2025 through March 2026. Initial payloads were delivered via Alibaba Cloud Object Storage (Hong Kong region), and all stages consistently used oss-cn-hongkong.aliyuncs[.]com for payload hosting and C2 telemetry.

This campaign begins with Search Engine Optimization (SEO) poisoning targeting Chinese-speaking developers and system administrators searching for the legitimate FinalShell SSH client - a popular Chinese-language server management and SSH tool. Attackers registered lookalike domains and manipulated search rankings to position malicious sites above legitimate sites.

The fake site at finalshell-ssh.com is designed to imitate the FinalShell download page, written entirely in Chinese (Simplified) targeting the Chinese developer community.
Key observations:

DNS infrastructure analysis reveals this campaign operated a network of fake Chinese software sites all sharing the same hosting infrastructure (certificate ID 51LA-3JTC2JD0CXBQHRSX):
The threat actor systematically targets popular Chinese developer and network tools including SSH clients (FinalShell, Xshell), VPN tools (QuickQ, Clash), and media platforms (LeTV).

The download is served from Alibaba Cloud Object Storage (OSS) in Hong Kong - consistent with all subsequent payload hosting in this campaign using the same oss-cn-hongkong.aliyuncs.com infrastructure.
The PDB debug path embedded in Setup.exe is C:\Users\52pojie\Desktop\bin\bin\Release\net10.0\win-x64\native\APP3.pdb
Developer Username – 52pojie:
The Windows username 52pojie is a direct reference to 52破解 (52pojie.cn), a prominent Chinese-language cybersecurity and software cracking forum. While this may suggest a Chinese-speaking developer, PDB paths can be deliberately manipulated as false flags. This finding is considered alongside other indicators:
Compiler – net10.0\win-x64\native\:
The \native\ subdirectory is exclusively produced by the .NET NativeAOT compilation pipeline. Standard .NET builds never produce output in this folder. This confirms the binary was compiled using .NET 10.0 NativeAOT.
Upon execution, Setup.exe operates through four sequential stages as shown in Figure 5. Each stage is described in detail in the subsections below.

Before downloading the payload, Setup.exe checks whether it is running with administrative privileges by calling mw_IsRunningAsAdmin.

mw_IsRunningAsAdmin (Renamed function) implements the standard .NET WindowsPrincipal.IsInRole() check, opening the current process token with MAXIMUM_ALLOWED access and checking membership of the built-in Administrators group using RID 544 (DOMAIN_ALIAS_RID_ADMINS), which corresponds to SID S-1-5-32-544. This ultimately calls the Win32 CheckTokenMembership API.
If the process is not running as administrator, mw_ElevatePrivilegesViaRunas re-launches Setup.exe using ProcessStartInfo with UseShellExecute = true and Verb = "runas", triggering a Windows UAC elevation prompt to the victim. The original unelevated instance then terminates via ExitProcess()

The payload is downloaded from URL that is stored as a UTF-16LE encoded string via HTTP GET from:
hxxps://kkwinapp.oss-cn-hongkong.aliyuncs.com/dow/zj[.]mp4
.mp4 Extension Masquerading:
The payload (zj.mp4) uses the extension ".mp4" to masquerade as a MP4 file despite being a Windows DLL. This may evade network security controls, proxy inspection rules, and DLP policies that flag executable downloads, while appearing as benign media traffic.
The downloaded zj.mp4 Windows DLL is loaded in memory using a custom reflective PE loader. Five Win32 API wrappers are initialized before loading: VirtualAlloc (memory allocation), VirtualFree (cleanup), LoadLibraryA (dependency loading), GetProcAddress (import resolution), and FreeLibrary (post-load cleanup). The loader validates MZ/PE signatures, allocates memory, maps PE sections, processes base relocations, resolves imports, and sets correct memory protections before executing the payload.

Rather than using the standard PE entry point, the malware resolves a specific named export "run" from the loaded zj.mp4 DLL and executes it via a .NET delegate. The "run" export was confirmed present in the zj.mp4 export table, indicating a modular malware framework where each stage exposes a defined interface to its loader.
The DLL is loaded entirely in memory by Setup.exe's reflective PE loader and executed via the named export run which immediately calls run_0:
Upon execution, run_0 performs the following operations in sequence:

run_0 begins by constructing four download URLs using the same Alibaba Cloud base URL seen in Setup.exe:
run_0 uses CreateToolhelp32Snapshot with TH32CS_SNAPPROCESS (2) to enumerate all running processes, specifically searching for Telegram.exe. If found, and an internal flag is set, it executes the following deep link via ShellExecuteA
tg://setlanguage/?lang=classic-zh-cn

This deep link opens Telegram and silently switches the application language to Chinese (Classic). The purpose of this behavior is unclear - it may be for victim profiling, social engineering preparation, or to manipulate Telegram's interface for a subsequent attack stage.
Note: The internal flag (byte_180042DBA) controlling this behavior is never set in this build (contains 0, single read XREF). This functionality is dormant in this sample, suggesting it may be activated in a different build variant.
run_0 calls mw_GetOrCreateInstallDirectory (directory setup function) which uses SHGetKnownFolderPath with FOLDERID_LocalAppData ({F1B32785-6FBA-4FCF-9D55-7B8E7F157091}) to establish the installation directory:
%LOCALAPPDATA%\Programs\Bvasted\
Three file paths are then constructed within this directory as shown in the figure below.
Immediately after path construction, all three files are marked with SetFileAttributesA using attribute value 6:
6 = FILE_ATTRIBUTE_HIDDEN (2) | FILE_ATTRIBUTE_SYSTEM (4)
Setting both HIDDEN and SYSTEM attributes ensures the files are invisible in standard Windows Explorer views and require explicit filter changes to reveal.


The malware beacons installation progress back to the attacker using the same Alibaba Cloud infrastructure. The C2 endpoint is:
hxxps://kkwinapp[.]oss-cn-hongkong[.]aliyuncs[.]com/dow/upload?log=<data>
Data is URL-percent-encoded before transmission. Three beacon events are sent:
This means kkwinapp[.]oss-cn-hongkong[.]aliyuncs[.]com serves a dual purpose: payload hosting (/dow/ downloads) and C2 data collection (/dow/upload?log=). The attacker receives real-time installation telemetry for every victim.
For persistence, run_0 calls CreateAndExecuteTask which creates a Windows Scheduled Task using direct RPC calls via NdrClientCall3, bypassing higher-level Task Scheduler COM interfaces (ITaskService).
The task name is generated dynamically: SimpleActivityScheduleTimer_{<random GUID>}
A fresh GUID is generated via CoCreateGuid for each installation, making the exact task name non-deterministic. However the prefix SimpleActivityScheduleTimer_ is constant and serves as a reliable detection IOC.

Setupexe.exe is the legitimate Microsoft-signed binary Resource Compiler (rc.exe), a standard Windows SDK tool. Threat actors likely selected this binary due to the following characteristics:
When Setupexe.exe is executed (via the scheduled task SimpleActivityScheduleTimer_{GUID}), Windows resolves DLL dependencies by searching the executable's own directory first. Since rcdll.dll is present in %LOCALAPPDATA%\Programs\Bvasted\ alongside Setupexe.exe, Windows loads the malicious rcdll.dll instead of the legitimate version.
The installation directory %LOCALAPPDATA%\Programs\Bvasted\ contains four files:
DLL sideloading exploits the Windows DLL search order to load a malicious DLL into a trusted, Microsoft-signed executable. This causes the threat actor's code to run inside a legitimate signed process, significantly reducing the effectiveness of process-based detections.
The use of a signed Microsoft binary (rc.exe) for DLL sideloading is a deliberate evasion choice - security products that trust Microsoft-signed processes may not flag the execution, and any subsequent malicious activity appears to originate from a legitimate Microsoft executable.

rcdll.dll is loaded by Setupexe.exe via DLL sideloading. On DLL_PROCESS_ATTACH, the entry point schedules asynchronous shellcode execution and ultimately loads and executes the shellcode contained in oob.xml:
rcdll.dll executes through the following chain on DLL_PROCESS_ATTACH:

Rather than executing malicious code directly in DllMain, rcdll.dll schedules execution via QueueUserAPC. The malicious pfnAPC function only runs when the host thread enters an alertable wait state, deferring execution away from the DLL load event which is heavily monitored by security products.

When pfnAPC detects the process is not elevated, mw_RelaunchElevated combines two techniques to silently re-launch with administrative privileges:
COM Elevation Moniker UAC Bypass
Using the spoofed PEB identity, the function performs a silent UAC bypass using two well-known GUIDs:
CoGetObject with the elevation moniker obtains an elevated ICMLuaUtil interface. On unpatched systems ICMLuaUtil::ShellExec (vtable offset +72) then re-launches the current executable with full administrative privileges without displaying a UAC prompt to the victim.
pfnAPC searches the current directory (%LOCALAPPDATA%\Programs\Bvasted\) for any .xml file using FindFirstFileA("*.xml"), finding oob.xml. The file is read entirely into memory and executed using a callback-based shellcode execution technique

EnumWindows accepts a function pointer as its lpEnumFunc callback.
By passing the shellcode's address, Windows itself transfers execution to the first byte of oob.xml when enumerating windows. The shellcode is specifically crafted to begin with a valid x64 function prologue (sub rsp, 0x2C8) making it a valid callable function from Windows' perspective. This avoids CreateThread/CreateRemoteThread calls that are commonly monitored by EDR products
If no .xml file is found, the function sleeps for 100 minutes (Sleep(6,000,000ms)).

Despite its .xml extension, oob.xml contains two components:

The code snippet below describes the deobfuscation process, where each stack string byte is Caesar-shifted by 0x10. Each obfuscated byte is written to the stack one byte at a time, then decoded in place by subtracting 0x10 from each byte, leaving the plaintext string on the stack.
After resolving APIs and mapping the embedded PE, the shellcode calculates the entry point and transfers execution directly.
To locate the embedded PE in memory, the shellcode allocates RWX memory via VirtualAlloc and copies a small stub into it. When invoked, this stub effectively returns the caller's return address in RAX. It is not implemented in the most efficient way, since the initial call $+5 / pop rax sequence is redundant for this purpose. The important instruction is the second pop rax, which pops the caller's saved return address off the stack into RAX, after which the stub restores the return address (push rax) and returns. The shellcode then uses that returned address as the starting point for scanning forward to find the PE payload.
From that position, the shellcode scans up to 0x9C4000 bytes forward, checking each byte sequence against a 6-byte MZ signature pattern (4D 5A 90 00 03 00) to locate the embedded PE.

After resolving APIs via PEB walking and stack string decoding, and locating the embedded PE at offset 0x12E9, the shellcode calculates the entry point via OptionalHeader.AddressOfEntryPoint, and transfers execution directly.

Upon execution, the embedded EXE performs the following operations:

The mutex name is not hardcoded - it is dynamically generated using a DJB2 hash of the full executable path (lowercased), combined with the process integrity level obtained via GetTokenInformation(TokenIntegrityLevel),and formatted as:
Including the integrity level in the hash ensures that the unelevated and elevated instances of the process generate different mutex names, preventing them from blocking each other during the UAC elevation chain. While the exact mutex value varies per victim, the prefix Local\ClientMutex_ is constant and serves as a detection IOC.
The figure below displays the pseudocode responsible for preventing Windows from entering sleep or turning off the display during operation, ensuring the malware continues running on idle victim machines.

The malware checks for the environment variable KONG_SKIP_KEYLOGGER. If not set to "1", a dedicated keylogger thread is spawned via beginthreadex. This environment variable acts as a developer/operator kill switch - its name directly references the malware family: Kong.

![Figure 25 – mw_KeyloggerThread capturing active window title via GetForegroundWindow + GetWindowTextW and writing timestamped log header [ YYYY-MM-DD HH:MM:SS ] WindowTitle ###](https://esentire-dot-com-assets.s3.amazonaws.com/assetsV3/Blog/Blog-Images/Multi-Stage-SEO-Poisoning-Campaign-Deploys-Kong-RAT-image26.png)
The keylogger thread polls all virtual key codes from 8 to 255 using GetAsyncKeyState at 10ms intervals (100Hz). Key states are tracked in a std::map<int, bool> (C++ red-black tree) to prevent duplicate logging. Modifier keys (Shift, Control, Alt) are handled by checking left and right variants explicitly (VK_LSHIFT/VK_RSHIFT, VK_LCONTROL/VK_RCONTROL, VK_LMENU/VK_RMENU).
The active window is captured via GetForegroundWindow + GetWindowTextW on each polling cycle. When the foreground window changes, a timestamped header is written:
Captured keystrokes are written to C:\ProgramData\Kong\Keylogger\<YYYY-MM-DD>.txt where the filename is the current date obtained via GetLocalTime() formatted as YYYY-MM-DD, with the .txt extension appended as the DWORD constant 0x7478742E ('.txt' in little-endian).

Before writing, the directory C:\ProgramData\Kong\Keylogger\ is verified accessible via GetFileAttributesW - created recursively if absent. If the directory cannot be created or accessed, the function frees allocated buffers and returns without logging. On success, CreateFileW(OPEN_ALWAYS) + SetFilePointer(FILE_END) appends keystrokes to a single daily log file - a new file is created automatically each day. The log persists across reboots when the malware re-executes via the scheduled task.

Network traffic analysis confirms the malware communicates over TCP port 5947.
Before establishing C2 connectivity, the malware checks the following registry key/value for previously installed modules to avoid redundant re-downloads
Kong RAT uses a custom MPK1 protocol, which has been annotated in the figure below

The magic bytes 4D 50 4B 31 ("MPK1") are constructed byte-by-byte confirming this is a custom protocol implementation.

Payloads are compressed using LZ4 block compression confirmed by the presence of LZ4's characteristic hash constants in the compression implementation:
When compression is active (flag = 0x01), the original uncompressed size is stored at offset +9 - required by the LZ4 block decompression API.
The command processing loop polls at 10ms intervals. When the C2 server pushes a new module, Received DLLs are loaded and their "run" export executed with "x.x-x.icu" as parameter - following the same "run" export convention used throughout the entire campaign chain from zj.mp4 onwards. This architecture allows the attacker to extend victim functionality indefinitely by pushing new capability modules post-compromise.
The remote module is a 64-bit DLL pushed to the victim by the Kong RAT C2 server. Its "run" export is resolved via GetProcAddress and invoked with "x.x-x.icu" as the C2 configuration parameter - following the same "run" export convention used throughout the entire campaign chain.
The requirement for a valid C2 configuration parameter serves as an implicit sandbox evasion mechanism. When the DLL is executed without the parameter (as in automated sandbox analysis or manual execution), run_0 defaults to 127.0.0.1 as the C2 address, resulting in failed connectivity and no observable malicious behavior. Full capability is only activated when invoked through the complete infection chain with the legitimate C2 configuration - defeating automated behavioral analysis that executes DLLs in isolation.
The remote module run() immediately delegates to run_0(), which initializes and operates the C2 client through the following sequence:
The module maintains a persistent session cache in the registry key:
Previously established C2 sessions are stored here as registry values containing 208-byte LoginInfo structures with embedded expiry timestamps. On each execution, the module:
This ensures session continuity across process restarts - the module can restore active C2 connections without full re-registration.
On successful TCP connection, the module transmits a structured LoginInfo packet containing victim system information:
Note: The GROUP field is populated via luaL_addstring - confirming the module embeds a Lua scripting runtime for configurable campaign tagging.
The module implements a C++ std::unordered_map using FNV-1a hashing to manage plugin threads:
When a plugin thread needs termination, mw_KillPluginThread:
Each plugin receives its own dedicated thread via CreateThread with an independent TCP::TCPClient instance and reconnect=1 flag - maintaining separate persistent connections to x.x-x.icu:5947 per capability module.
The module includes a configurable expiry mechanism - if a timestamp is stored at config offset +152, the module automatically terminates all plugin threads and exits after that time. This enables time-limited deployments.
The remote module enumerates running processes to detect the presence of messaging and communication applications on the victim machine:
Detection results are stored as boolean flags. The focus on WeChat, QQ and WeCom highlights the campaign's targeting of Chinese-speaking users that heavily rely on applications in the Tencent ecosystem.

Kong RAT's C2 command dispatcher routes incoming packets by extracting the "T" (type) integer field and dispatching via a switch statement. All commands requiring elevated privileges check an internal elevation flag before execution - if not elevated, an "Insufficient Permissions" error response is returned to the C2 operator. The dispatcher supports 16 confirmed command types covering remote execution, plugin management, session control, system manipulation and self-destruct capabilities.

The a4 parameter acts as an elevation gate - commands 2, 11, 12, 15, 16, 19, 20, 21, 22 require elevated process context to execute. Commands 13, 14, 26 execute only when the process is not elevated. This ensures sensitive operations only execute in an elevated process context.




When the C2 server pushes a plugin, mw_Handle_RUN_PLUGIN (the plugin loader) processes it through the following steps:
Decoding the embedded xmmword constants reveals Chinese-language error messages sent to the C2 operator on failure:
These Chinese error messages provide additional confirmation of a Chinese-speaking developer, consistent with the 52pojie PDB username attribution.
The NOTE and GROUP fields in the LoginInfo registration packet are remotely configured by the C2 operator via a dedicated command handler:
This allows the operator to dynamically tag and categorize victims post-infection without redeploying the malware.

System Information Collection: This module also connects to ROOT\CIMV2 and executes the WMI query SELECT Caption FROM Win32_OperatingSystem, retrieving the victim's Windows version string (e.g., "Microsoft Windows 11 Pro"). This is transmitted as part of the DESC field in the LoginInfo registration packet sent to the C2.
Security Product Enumeration: connects to ROOT\SecurityCenter2 (with ROOT\SecurityCenter fallback) and executes WMI query SELECT displayName FROM AntiVirusProduct, collecting all registered security product names for victim profiling

The malware sends HTTP GET requests to https://g3.letv.com/r?format=1 using User-Agent: LetvClient/1.0, impersonating a LeTV (乐视) media player client. Confirmed via live testing, g3.letv.com/r?format=1 is a legitimate LeTV CDN geolocation API used for video streaming optimization - it returns the caller's public IP address and geographic location in JSON format.
The malware uses C++ std::regex to extract two fields from the response:
Code analysis of sub_180017B50 (ClientApp_SendLoginInfo) confirms the extracted "desc" value is directly incorporated into the DESC field of the LoginInfo registration packet transmitted to the C2 server. This gives the operator real-time victim geolocation for every new infection while disguising the collection as legitimate Chinese media streaming traffic.

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.