


Executive Summary
We tracked a campaign by the Kimsuky group targeting South Korean groupware vendors from 2025 through early 2026.
Kimsuky compromised vendor infrastructure by exploiting vulnerabilities in internet-facing mail servers or by conducting spear-phishing against employees.
We identified two new malware strains based on Gomir/HttpTroy, which we tracked as BirdTroy and DriveTroy.
Even after the initial compromise, Kimsuky aggressively pursued lateral movement, including compromising customer groupware servers and stealing the vendors’ infrastructure credentials.
We identified notable similarities with past Kimsuky campaigns across malware characteristics, attack infrastructure, and tooling.
1. Overview
The ENKI WhiteHat Threat Research Team tracked a campaign by Kimsuky, a North Korea-linked threat group, that infiltrated the internal networks of South Korean groupware vendors between 2025 and early 2026. Our analysis revealed that Kimsuky gained control of internet-facing servers through vulnerability exploitation and spear-phishing, and deployed Gomir and its variants.
Kimsuky developed Gomir variants with significantly altered C2 communication methods to evade detection, including leveraging Google Drive as a C2 channel and implementing a new custom protocol. We also observed indicators of aggressive lateral movement, including compromising customer servers that used the affected vendors' groupware and tampering with groupware login pages to harvest employee credentials.
This report also provides Indicators of Compromise(IoCs) and YARA rules to detect the Gomir, BirdTroy, and DriveTroy malware used in this campaign.
2. Background
The Gomir malware family analyzed in this report was first reported in Kimsuky's earlier TrollStealer campaign. In a 2024 report by S2W, Kimsuky was observed distributing TrollStealer and GoBear, both written in Go. AhnLab reported the same malware family under the name Endoor. A later report by Symantec then analyzed Gomir, a Linux variant of the Windows-based GoBear backdoor
Kimsuky has historically targeted South Korean corporate infrastructure. AhnLab's 2024 SmallTiger report documented attacks against South Korean enterprises, where malware previously attributed to Kimsuky was also observed. In the TrollStealer campaign mentioned earlier, Kimsuky also trojanized a security software installer distributed through the website of a South Korean construction industry association.
3. Initial Access
In the compromise of groupware vendor A, identified in November 2025, Gomir was installed through a remote code execution vulnerability in an externally accessible mail server. It remains unclear how Kimsuky acquired prior knowledge of this vulnerability.

caption - Gomir installation via vulnerability exploitation
In the compromise of groupware vendor B, identified in December 2025, initial access to the internal infrastructure was achieved via an employee's PC. The installed malware was identified as a variant of HttpTroy, which Gen Digital reported in September 2025. For a detailed analysis of HttpTroy’s behavior, refer to Gen Digital's report. Based on past HttpTroy distribution cases, we assess that Kimsuky installed the malware on the employee's PC using social engineering techniques such as spear-phishing. Key information on the HttpTroy variant used in this attack is shown in the table below.
caption - Key information on the HttpTroy variant used in the attack
Kimsuky used HttpTroy to install additional tools, including DWAgent and a proxy tool. DWAgent is an open-source remote access tool for remote desktop and system management, which Kimsuky abused to remotely control the victim's Windows PC through its web UI. Kimsuky recorded their account credentials in config.json, compressed all DWAgent components into a zip archive, and installed and run it on the victim's server. The config.json used in the attack is shown below.
Kimsuky also installed a proxy tool in the victim environment to facilitate lateral movement into isolated network segments. The proxy tool is built on the yamux (TCP session multiplexer) library. After connecting to a relay address and accepting yamux streams, it opens a TCP connection to a target address for each stream and relays data bidirectionally.
4. Malware Analysis
4.1. Gomir
Throughout this campaign, Kimsuky installed Gomir first, immediately after gaining initial access to internal infrastructure. The analyzed Gomir sample is packed with UPX 3.96, and its Go module path is shown below.
Go module path:
local[.]github[.]com/Github-Lin/Main

caption - Gomir binary showing Go module path strings
On execution, it checks the command-line arguments. If the argument is install, it first executes the persistence routine. The persistence routine checks the effective group ID via getegid and registers a systemd service if running as root, or a cron job if not. When running as root, it establishes persistence as a systemd service through the following steps.
Copies itself to
/var/log/rsyslogdwith permission 0777Writes a unit file to
/etc/systemd/system/rsyslogd.servicesystemctl daemon-reload→systemctl reenable rsyslogd→systemctl start rsyslogdDeletes the original
When not running as root, it uses crontab instead through the following steps.
Reads the existing content with
crontab -l, appends a/10 * * * * <own path>entry, and writes it tocron.txtRuns
crontab cron.txtDeletes
cron.txtand re-executes
After establishing persistence (or immediately, if install is not specified), it enters the C&C communication loop and generates a bot ID. The bot ID follows the format XX-[0-9a-f]{10}, where the hex portion is the first 5 bytes of the MD5 hash of the username, hostname, and MAC address.

caption - Gomir bot ID generation routine
Gomir spawns a TCP listener alongside the C2 loop on startup to prevent duplicate execution. Normal mode occupies TCP port 19838 and install mode TCP port 19837. If the port is already in use, it determines that another instance is running and exits.

caption - Gomir port-binding routine
Gomir uses HTTPS POST in its main communication loop with the C&C server. The C&C server URL is as follows.
C&C server:
hxxps://commit[.]hanbiro[.]o-r[.]kr/index.php
The POST parameters follow the format <prefix>[a-zA-Z0-9]{9} The parameters for the command-retrieval request are shown in the table below.
caption - Gomir command-retrieval request parameters
If the first byte of the server response is S (0x53), the remainder is decoded as URL-safe Base64, which uses "-_" instead of the "+/" of standard Base64. The first 4 bytes of the decoded result serve as the decryption key, and (ciphertext - key[i%4]) mod 255 is applied to the remaining data, leaving 0x00 bytes unchanged.
When sending command results, a random 4-byte key is generated and the operation (plaintext + key[i%4]) mod 255 is applied to each byte, leaving 0x00 bytes unchanged. The 4-byte encryption key is prepended to the ciphertext, and the combined result is then encoded as URL-safe Base64. The parameters for the result-submission request are shown in the table below.
caption - Gomir command-result submission request parameters
The handler functions Gomir invokes for each command code received from the C&C server, and the operations they perform, are shown in the table below. Note that the Upload and Download handlers are named from the C&C server's perspective.
caption - Gomir command code list
The proxy functions of 14 and 15 perform essentially the same role as the yamux-based proxy tool described earlier. The authentication key bf215181b5140522137b3d4f6b73544a is the MD5 hash of github. Combined with the Go module path (local.github.com), this suggests that github is a recurring indicator associated with this actor.

caption - Gomir proxy authentication key
A notable trait of the file transfer functions (30 and 31) is that the handler names Upload and Download are oriented to the C&C server. After receiving the command, Gomir generates a session token in the format [a-zA-Z0-9]{10} and sends it to the C&C server. Until the transfer completes, it communicates with the C&C server using the session token instead of the bot ID. The command codes used for the transfer are shown in the table below.
caption - Gomir file transfer command code list
4.2. BirdTroy
BirdTroy is a previously undocumented RAT that exhibits characteristics of both Gomir and HttpTroy. Its build module path is Bird/module, suggesting the threat actor used Bird as an internal project name. Since it shares command codes and functionality with HttpTroy, we named it BirdTroy.

caption - BirdTroy Go module path
On execution, it parses command-line arguments and uses them to control the malware's behavior. Each argument and its function are described in the table below.
caption - BirdTroy command-line argument list
For duplicate-execution prevention, it uses a file created by appending the .tmp extension to the executable's absolute path. It attempts an exclusive lock (LOCK_EX|LOCK_NB) on this file via syscall.Flock and exits if the lock cannot be acquired. The same file also serves as bot ID storage. If the file does not exist or is empty, it generates a bot ID in the format <[a-zA-Z0-9]{10}> and saves it to the file at that path.

caption - BirdTroy duplicate-execution prevention routine
When the -i flag is specified, it runs a persistence routine identical to Gomir's, which confirming that BirdTroy is a Gomir variant. After establishing persistence (or immediately, if -i is not specified), it enters the C&C communication loop.
BirdTroy communicates with the C&C server using custom packets. It encodes the entire packet as Base64 and sends it via HTTP POST with a Content-Type: application/json header. If http3 is specified as the transport protocol, it uses HTTP/3 (QUIC) transport based on the github.com/quic-go/quic-go library. HTTP/3 (QUIC) is a UDP-based protocol, so it can bypass inspection by network security appliances designed for TCP-based traffic. The structure of the packets used to communicate with the C&C server is shown below.
The checksum for the packet's Data field is the first 4 bytes of its MD5 hash, interpreted as a big-endian uint32. The packet type stored in the first byte of the packet is shown in the table below; type 3 is not defined.
caption - BirdTroy packet type information
For an overview of the entire communication flow, refer to the figure below.

caption - BirdTroy communication flow overview
A command string received in a type 5 packet is split on whitespace, and the first token is used as the command code. As in Gomir, the command codes and handler function names for the file transfer functions are written from the C&C server's perspective. The handler functions invoked for each command code, and the operations they perform, are shown in the table below.
caption - BirdTroy command code list
4.3. DriveTroy
DriveTroy is a backdoor that abuses Google Drive as its C&C server. It shares numerous similarities with Gomir, including the persistence mechanism and command codes. We therefore assess that it is a newly developed Gomir variant. Its build path is embedded as C:/Users/jira/go/src/jira/payload/.

caption - DriveTroy Go module path
DriveTroy extracts the configuration data used for Google Drive communication from the end of its own file. It reads the last 4 bytes of the file as an ASCII string to obtain the configuration size (in bytes), then moves back by that amount to read the encrypted configuration data. The configuration data is RC4-encrypted and then encoded with the URL-safe Base64 ("-_" instead of "+/") used in Gomir. The RC4 key and the decrypted configuration are shown below.
RC4 key:
@st34GMEgfesy4R#r21f
caption - DriveTroy Google account authentication information
The threat actor's Google account information, identified through these credentials, is shown in the table below.
caption - DriveTroy Google account information
After initializing the Engine, it sends an HTTP GET request to hxxps://api[.]ipify[.]org and looks up the victim system's external IP address. It encrypts the retrieved IP with RC4, encodes it as URL-safe Base64, and uploads it to Google Drive under the filename E8C46207.ses. The RC4 key used to encrypt communication data is the same as the one used to decrypt the configuration data.

caption - Session file upload routine
In the subsequent communication loop, it polls commands by downloading the E8C46207.cmd file from Google Drive every second. The received data is decoded from URL-safe Base64 and then decrypted with RC4. The first 2 bytes are the command code in ASCII, and the remainder is the command data. In the same way, it encrypts the execution result with RC4, encodes it as URL-safe Base64, and uploads it to Google Drive under the filename E8C46207.res.

caption - Google Drive polling routine
The command code structure is similar to Gomir's, but only 8 command are implemented in the analyzed sample. Unlike Gomir and BirdTroy, the Recv and Upload handlers are named from the victim system's perspective. The operations performed for each command code are shown in the table below.
caption - DriveTroy command code list
Upon receiving command 05, it performs the persistence securing operation. There are differences between the persistence securing routine of Gomir and BirdTroy and that of DriveTroy as shown in the table below.
caption - Persistence routine comparison
5. Post-Compromise Activity
5.1. Customer Compromise Cases
During our analysis, we identified multiple cases in which the threat actor exfiltrated internal information from a compromised groupware vendor and used it to compromise the infrastructure of customers using that vendor's products. These cases reveal that the threat actor made groupware vendors a primary target, obtaining internal configuration information or source code and then pivot to downstream organizations.
5.1.1. Case A
Groupware vendor A was the vendor whose mail server had been compromised via the vulnerability described in Section 3. We identified indications that Gomir had also been installed on the groupware server of one of vendor A's SaaS customers. Although we could not determine the exact intrusion path, we assess that the threat actor enumerated the vendor's infrastructure, obtained configuration information for the SaaS groupware server, and then carried out further intrusion. The timeline for this customer compromise case is shown below.

caption - Case A Timeline
5.1.2. Case B
While monitoring the threat actor’s Google Drive, where DriveTroy uploads its execution logs, we found indications that a customer of the compromised groupware vendor B had also been breached. The day after we confirmed DriveTroy installation, we observed the output of an id command executed on another victim server.

caption - Customer server information on the threat actor’s Google Drive
This username matched a directory name found in a VOC(Voice of Customer) server listing uploaded to the same Google Drive the previous day. The newly infected server was an on-premises customer running vendor B's products. We assess that the threat actors used customer server information or authentication keys from the VOC server to intrude into the customer's infrastructure, then installed DriveTroy and executed remote commands.

caption - Vendor VOC server directory information on the threat actor’s Google Drive
A few days later, the threat actors leveraged a compromised groupware account to access customer Z's email, which uses the same groupware product. The timeline for this customer compromise case is shown below.

caption - Case B Timeline
5.2. Groupware Login Page Tampering
During our analysis, we found code in the HTML of the internal groupware login page of one of the compromised groupware vendors that harvests user-submitted credentials to the C&C server via HTTPS POST.

caption - Original groupware login page

caption - Tampered groupware login page
Even with control of the groupware server, the threat actors could not recover plaintext passwords from the database alone, since employees' passwords are stored on the server in hashed form. They therefore tampered with the login page to exfiltrate employees' groupware login credentials, allowing them to log in to the groupware directly and continue their reconnaissance. Because the victim server's login process had no secondary authentication such as OTP at the time of the compromise, we assess that the stolen credentials would have provided the threat actor with broad access to internal systems.
6. Attribution
6.1. Malware Similarities
As mentioned in the Background section, the Gomir malware was first reported in Kimsuky's earlier TrollStealer campaign. BirdTroy and DriveTroy differ in their C&C infrastructure and detailed behavior, but they share several functional similarities with Gomir. The table below compares the similarities among the three malware families.
caption - Malware characteristics comparison
6.2. Attack Infrastructure Links
All C&C servers identified in this report used the same HTTPS certificate. This is the default XAMPP certificate, which has been repeatedly observed in recent Kimsuky campaigns. Details of this HTTPS certificate are shown in the table below.
caption - HTTPS certificate information
The C&C server IPs identified in this report all belong to ASN 19318 and ASN 26666, both of which have been historically favored by Kimsuky. Neither the default XAMPP certificate nor these ASNs are unique to Kimsuky in isolation, but their co-occurrence strengthens attribution to Kimsuky.
In addition, the Windows username jira found in DriveTroy's build path also appeared in the "Last saved by" field of the decoy document and in the PDB path of loadDll.dll, a malware from Kimsuky's HttpSpy distribution case [reported by ENKI WhiteHat in 2026](https://www.notion.so/...). This indicates either that the same operator is behind both campaigns, or that the two campaigns share a common development environment.

caption - Decoy document information from the HttpSpy distribution case
6.3. Attack Tools
DWAgent is a legitimate remote-control tool that North Korea-linked threat groups have long abused for easy remote access to compromised Windows environments. Kaspersky's analysis of the PebbleDash cluster also identified Kimsuky using this tool.
In addition, among the proxy tools obtained during our analysis, we identified a version that used dkanehahffk, the string produced by typing the Korean phrase '아무도몰라' ('nobody knows') on a QWERTY keyboard. This indicates that the tool's developer is familiar with Korean.

caption - Proxy tool Korean-conversion authentication key
7. Course of Action
In this case, some of the initial access occurred through a remote code execution vulnerability in an externally accessible mail server. To reduce this attack surface, organizations should use regular penetration testing to examine their external attack surface and lateral movement paths.
The threat actor also tampered with the login page to steal credentials and then used them for further intrusion; because no secondary authentication was in place at the time of the compromise, the stolen credentials could be used to log in immediately. Introducing secondary authentication such as TOTP can block this kind of internal intrusion even when credentials are leaked.
Finally, the threat actors used customer directory information stored on the VOC server as a foothold to pivot to customer infrastructure. Vendors that develop enterprise software should take the following measures to protect their customers' infrastructure:
Encrypt stored customer authentication keys and access credentials
Separate access between internal management systems and production servers
Implement comprehensive audit logging for access to customer servers
Establish procedures to notify customers when a breach occurs
Detection rules for the analyzed Gomir, BirdTroy, and DriveTroy are attached in Appendix D.
8. Conclusion
From 2025 through early 2026, a North Korea-linked threat actor breached South Korean corporate infrastructure and carried out lateral movement and downstream compromise. After gaining initial access through spear-phishing and vulnerability exploitation, the threat actors expanded into Linux server environments using Gomir and other malware. Most notably, they stole customer server information from a groupware vendor's server to reach downstream customers, and tampered with groupware login pages to harvest employee credentials.
The analyzed variants demonstrate a deliberate shift toward detection evasion, using Google Drive as a C&C channel and custom protocols. BirdTroy and DriveTroy share command structures and persistence routines with Gomir and HttpTroy, indicating that the same actor continues to develop its tooling.
9. Appendix
Appendix A. MITRE ATT&CK
caption - MITRE ATT&CK
Appendix B. IOCs
MD5
caption - MD5
IP
69[.]10[.]50[.]165
208[.]73[.]202[.]29
163[.]245[.]195[.]172
URLs
hxxps://auth[.]samecloud[.]o-r[.]kr/index.php
hxxps://commit[.]hanbiro[.]o-r[.]kr/index.php
hxxps://oobe[.]webjine[.]o-r[.]kr/index.php
hxxps://global[.]webjine[.]o-r[.]kr/index.php
hxxp://www[.]ilskdeid[.]o-r[.]kr:8000/
hxxps://oauth[.]shacloud[.]o-r[.]kr:8443
hxxps://69[.]10[.]50[.]165:8443
Appendix C. Metadata
Threat Actor’s Google Account Tokens and Information
caption - Threat Actor’s Google account tokens and information
RC4 Key
@st34GMEgfesy4R#r21f
Appendix D. YARA Rule

Popular Articles






