ESET researchers have discovered one of the payloads of the Wslink downloader that we uncovered back in 2021. We named this payload WinorDLL64 based on its filename WinorDLL64.dll. Wslink, which had the filename WinorLoaderDLL64.dll, is a loader for Windows binaries that, unlike other such loaders, runs as a server and executes received modules in memory. As the wording suggests, a loader serves as a tool to load a payload, or the actual malware, onto the already compromised system. The initial Wslink compromise vector has not been identified.
The initially unknown Wslink payload was uploaded to VirusTotal from South Korea shortly after the publication of our blogpost, and hit one of our YARA rules based on Wslink’s unique name WinorDLL64. Regarding Wslink, ESET telemetry has seen only a few detections - in Central Europe, North America, and the Middle East.
The WinorDLL64 payload serves as a backdoor that most notably acquires extensive system information, provides means for file manipulation, such as exfiltrating, overwriting, and removing files, and executes additional commands. Interestingly, it communicates over a connection that was already established by the Wslink loader.
In 2021, we did not find any data that would suggest Wslink is a tool from a known threat actor. However, after an extensive analysis of the payload, we have attributed WinorDLL64 to the Lazarus APT group with low confidence based on the targeted region and an overlap in both behavior and code with known Lazarus samples.
Active since at least 2009, this infamous North-Korea aligned group is responsible for high-profile incidents such as both the Sony Pictures Entertainment hack and tens-of-millions-of-dollar cyberheists in 2016, the WannaCryptor (aka WannaCry) outbreak in 2017, and a long history of disruptive attacks against South Korean public and critical infrastructure since at least 2011. US-CERT and the FBI call this group HIDDEN COBRA.
Based on our extensive knowledge of the activities and operations of this group, we believe that Lazarus consists of a large team that is systematically organized, well prepared, and is made up of several subgroups that utilize a large toolset. Last year, we discovered a Lazarus tool that took advantage of the CVE‑2021‑21551 vulnerability to target an employee of an aerospace company in the Netherlands, and a political journalist in Belgium. It was the first recorded abuse of the vulnerability; in combination, the tool and the vulnerability led to the blinding of the monitoring of all security solutions on compromised machines. We also provided an extensive description of the structure of the virtual machine used in samples of Wslink.
This blogpost explains the attribution of WinorDLL64 to Lazarus and provides an analysis of the payload.
Links to Lazarus
We have discovered overlaps in both behavior and code with Lazarus samples from Operation GhostSecret and the Bankshot implant described by McAfee. The description of the implants in both GhostSecret and Bankshot articles contains overlaps in the functionality with WinorDLL64 and we found some code overlap in the samples. In this blogpost we will only use the FE887FCAB66D7D7F79F05E0266C0649F0114BA7C sample from GhostSecret for comparison against WinorDLL64 (1BA443FDE984CEE85EBD4D4FA7EB1263A6F1257F), unless specified otherwise.
The following details summarize the supporting facts for our low confidence attribution to Lazarus:
1. Victimology
- Fellow researchers from AhnLab confirmed South Korean victims of Wslink in their telemetry, which is a relevant indicator considering the traditional Lazarus targets and that we have observed only a few hits.
Figure 1. Reported South Korean victim, where mstoned7 is the researcher from Ahnlab
2. Malware
- The latest GhostSecret sample reported by McAfee (FE887FCAB66D7D7F79F05E0266C0649F0114BA7C) is from February 2018; we spotted the first sample of Wslink in late 2018 and fellow researchers reported hits in August 2018, which they disclosed after our publication. Hence, these samples were spotted a relatively short period of time apart.
- The PE rich headers indicate that the same development environment and projects of similar size were used in several other known Lazarus samples (e.g., 70DE783E5D48C6FBB576BC494BAF0634BC304FD6; 8EC9219303953396E1CB7105CDB18ED6C568E962). We found this overlap using the following rules that cover only these Wslink and Lazarus samples, which is an indicator with a low weight. We tested them on VirusTotal’s retrohunt and our internal file corpus.
rich_signature.length == 80 and
pe.rich_signature.toolid(175, 30319) == 7 and
pe.rich_signature.toolid(155, 30319) == 1 and
pe.rich_signature.toolid(158, 30319) == 10 and
pe.rich_signature.toolid(170, 30319) >= 90 and
pe.rich_signature.toolid(170, 30319) <= 108
This rule can be translated to the following notation that is more readable and used by VirusTotal, where one can see the product version and build ID (VS2010 build 30319), number and type of source/object files used ([LTCG C++] where LTCG stands for Link Time Code Generation, [ASM], [ C ]), and number of exports ([EXP]) in the rule:
[LTCG C++] VS2010 build 30319 count=7
[EXP] VS2010 build 30319 count=1
[ASM] VS2010 build 30319 count=10
[ C ] VS2010 build 30319 count in [ 90 .. 108 ]
- The GhostSecret article described “a unique data-gathering and implant-installation component that listens on port 443 for inbound control server connections” that additionally ran as a service. This is an accurate description of Wslink downloader behavior, apart from the port number, which can vary based on the configuration. To sum it up, even though the implementation is different, both serve the same purpose.
- The loader is virtualized by Oreans’ Code Virtualizer, which is a commercial protector that is used frequently by Lazarus.
- The loader uses the MemoryModule library to load modules directly from memory. The library is not commonly used by malware, but it is quite popular among North Korea-aligned groups such as Lazarus and Kimsuky.
- Overlap in the code between WinorDLL64 and GhostSecret that we found during our analysis. The results and the significance in attribution are listed in Table 1.
Table 1. Similarities between WinorDLL64 and GhostSecret and their significance in attributing both to the same threat actor
Other similarities between WinorDLL64 and GhostSecret | Impact |
---|---|
Code overlap in code responsible to get processor architecture | Low |
Code overlap in current directory manipulation | Low |
Code overlap in getting the process list | Low |
Code overlap in file sending | Low |
Behavior overlap in listing processes | Low |
Behavior overlap in current directory manipulation | Low |
Behavior overlap in file and directory listing | Low |
Behavior overlap in listing volumes | Low |
Behavior overlap in reading/writing files | Low |
Behavior overlap in creating processes | Low |
Considerable behavior overlap in secure removal of files | Low |
Considerable behavior overlap in termination of processes | Low |
Considerable behavior overlap in collecting system information | Low |
Code overlap in the file sending functionality is highlighted in Figure 2 and Figure 3.
Figure 2. GhostSecret sending a file
Figure 3. Wslink sending a file
Technical analysis
WinorDLL64 serves as a backdoor that most notably acquires extensive system information, provides means for file manipulation, and executes additional commands. Interestingly, it communicates over a TCP connection that was already established by its loader and uses some of the loader’s functions.
Figure 4. Visualization of Wslink's communication
The backdoor is a DLL with a single unnamed export that accepts one parameter – a structure for communication that was already described in our previous blogpost. The structure contains a TLS-context – socket, key, IV – and callbacks for sending and receiving messages encrypted with 256-bit AES-CBC that enable WinorDLL64 to exchange data securely with the operator over an already established connection.
The following facts lead us to believe with high confidence that the library is indeed part of Wslink:
- The unique structure is used everywhere in the expected way, e.g., the TLS-context and other meaningful parameters are supplied in the anticipated order to the correct callbacks.
- The name of the DLL is WinorDLL64.dll and Wslink’s name was WinorLoaderDLL64.dll.
WinorDLL64 accepts several commands. Figure 5 displays the loop that receives and handles commands. Each command is bound to a unique ID and accepts a configuration that contains additional parameters.
Figure 5. The main part of the backdoor’s command-receiving loop
The command list, with our labels, is in Figure 6.
Figure 6. The command list
Table 2 contains a summary of the WinorDLL64 commands, where modified, and old categories refer to the relationship to the previously documented GhostSecret functionality. We highlight only significant changes in the modified category.
Table 2. Overview of backdoor commands
Category | Command ID | Functionality | Description |
---|---|---|---|
New | 0x03 | Execute a PowerShell command | WinorDLL64 instructs the PowerShell interpreter to run unrestricted and to read commands from standard input. Afterwards, the backdoor passes the specified command to the interpreter and sends the output to the operator. |
0x09 | Compress and download a directory | WinorDLL64 recursively iterates over a specified directory. The content of each file and directory is compressed separately and written to a temporary file that is afterwards sent to the operator and then removed securely. | |
0x0D | Disconnect a session | Disconnects a specified logged-on user from the user’s Remote Desktop Services session. The command can also perform different functionality based on the parameter. | |
0x0D | List sessions | Acquires various details about all sessions on the victim’s device and sends them to the operator. The command can also perform different functionality based on the parameter. | |
0x0E | Measure connection time | Uses the Windows API GetTickCount to measure the time required to connect to a specified host. | |
Modified | 0x01 | Get system info | Acquires comprehensive details about the victim’s system and sends them to the operator. |
0x0A | Remove files securely | Overwrites specified files with a block of random data, renames each file to a random name, and finally securely removes them one by one. | |
0x0C | Kill processes | Terminates all processes whose names match a supplied pattern and/or with a specific PID. | |
Old | 0x02/0x0B | Create a process | Creates a process either as the current or specified user and optionally sends its output to the operator. |
0x05 | Set/Get current directory | Attempts to set and subsequently acquire the path of the current working directory. | |
0x06 | List volumes | Iterates over drives from C: to Z: and acquires the drive type and volume name. The command can also perform different functionality based on the parameter. | |
0x06 | List files in a directory | Iterates over files in specified directory and acquires information such as names, attributes, etc. The command can also perform different functionality based on the parameter. | |
0x07 | Write to a file | Downloads and appends the stated amount of data to specified file. | |
0x08 | Read from a file | The specified file is read and sent to the operator. | |
0x0C | List processes | Acquires details about all running processes on the victim’s device and additionally sends ID of the current process. |
Conclusion
Wslink’s payload is dedicated to providing means for file manipulation, execution of further code, and obtaining extensive information about the underlying system that possibly can be leveraged later for lateral movement, due to specific interest in network sessions. The Wslink loader listens on a port specified in the configuration and can serve additional connecting clients, and even load various payloads.
WinorDLL64 contains an overlap in the development environment, behavior, and code with several Lazarus samples, which indicates that it might be a tool from the vast arsenal of this North-Korea aligned APT group.
ESET Research offers private APT intelligence reports and data feeds. For any inquiries about this service, visit the ESET Threat Intelligence page.
IoCs
SHA-1 | ESET detection name | Description |
---|---|---|
1BA443FDE984CEE85EBD4D4FA7EB1263A6F1257F | Win64/Wslink.A | Memory dump of discovered Wslink payload WinorDll64. |
MITRE ATT&CK techniques
This table was built using version 12 of the ATT&CK framework. We do not mention techniques from the loader again, only the payload.
Tactic | ID | Name | Description |
---|---|---|---|
Resource Development | T1587.001 | Develop Capabilities: Malware | WinorDLL64 is a custom tool. |
Execution | T1059.001 | Command and Scripting Interpreter: PowerShell | WinorDLL64 can execute arbitrary PowerShell commands. |
T1106 | Native API | WinorDLL64 can execute further processes using the CreateProcessW and CreateProcessAsUserW APIs. | |
Defense Evasion | T1134.002 | Access Token Manipulation: Create Process with Token | WinorDLL64 can call APIs WTSQueryUserToken and CreateProcessAsUserW to create a process under an impersonated user. |
T1070.004 | Indicator Removal: File Deletion | WinorDLL64 can securely remove arbitrary files. | |
Discovery | T1087.001 | Account Discovery: Local Account | WinorDLL64 can enumerate sessions and list associated user, and client names, among other details. |
T1087.002 | Account Discovery: Domain Account | WinorDLL64 can enumerate sessions and list associated domain names –among other details. | |
T1083 | File and Directory Discovery | WinorDLL64 can obtain file and directory listings. | |
T1135 | Network Share Discovery | WinorDLL64 can discover shared network drives. | |
T1057 | Process Discovery | WinorDLL64 can collect information about running processes. | |
T1012 | Query Registry | WinorDLL64 can query the Windows registry to gather system information. | |
T1082 | System Information Discovery | WinorDLL64 can obtain information such as computer name, OS and latest service pack version, processor architecture, processor name, and amount of space on fixed drives. | |
T1614 | System Location Discovery | WinorDLL64 can obtain the victim’s default country name using the GetLocaleInfoW API. | |
T1614.001 | System Location Discovery: System Language Discovery | WinorDLL64 can obtain the victim’s default language using the GetLocaleInfoW API. | |
T1016 | System Network Configuration Discovery | WinorDLL64 can enumerate network adapter information. | |
T1049 | System Network Connections Discovery | WinorDLL64 can collect a list of listening ports. | |
T1033 | System Owner/User Discovery | WinorDLL64 can enumerate sessions and list associated user, domain, and client names –among other details. | |
Collection | T1560.002 | Archive Collected Data: Archive via Library | WinorDLL64 can compress and exfiltrate directories using the quicklz library. |
T1005 | Data from Local System | WinorDLL64 can collect data on the victim’s device. | |
Impact | T1531 | Account Access Removal | WinorDLL64 can disconnect a logged-on user from specified sessions. |