打开记事本只会看见一片空白的系统配置文件,内里却藏着黑客远程控制服务器的完整域名。

近期安全研究员在一台企业内网 Windows7SP1 工作站上挖到一款设计极其精巧的定制后门程序,它没有复杂加密、没有臃肿代码,仅靠 UTF16LE 格式下的空格数量完成数据编码,全程伪装成 Realtek 声卡官方工具躲避查杀,整套攻击链路设计处处针对传统安全检测盲区。

绝大多数恶意 WMI(WindowsManagementInstrumentation)事件订阅都会设置开机自启,很容易被运维人员识别,这款后门的触发逻辑做了针对性伪装,它创建名为 Realtek 的事件过滤器与消费器,持续监控系统 Win32_LocalTime 本地时间,固定每天 19 点 50 分自动启动恶意程序。

"Filter":{
CLASS":"_EventFilter",
"Name":"Realtek",
"EventNamespace":"root\\cimv2",
"QueryLanguage":"WQL",
"Query": "SELECT * FROM
InstanceModificationEvent WITHIN 30
WHERE TargetInstance ISA 'Win32_LocalTime'
AND TargetInstance.Hour='19'
AND TargetInstance.Minute='50
GROUP WITHIN 60"
SERVER":"<REDACTED>"
"Consumer":{
_CLASS": "CommandLineEventConsumer"
"Name":"Realtek"
"CommandLineTemplate": "C: \\Progra~1\\Realtek\WAudio\\RtkNGUI64.exe",
SERVER":"<REDACTED>"
"FilterToConsumerBinding":{
"Filter":" EventFilter.Name=\"Realtek\"",
"Consumer": "CommandLineEventConsumer.Name=\"Realtek\""
SERVER":"<REDACTED>"

这种定时重启式触发有两层隐蔽效果,电脑白天重启不会唤醒后门,只有晚间固定时段才会运行,大幅拉长安全监控的排查窗口,整套订阅数据存储在 WMI 底层仓库,不受系统重启影响,普通杀毒软件仅扫描启动项很难发现异常。

后门本体文件名直接复用 Realtek 官方音频面板程序名 RtkNGUI64.exe,攻击者还特意采用 8.3 短路径格式 Progra~1 拼接执行命令行,进一步模仿正常声卡组件的运行特征,降低行为检测告警概率。

这里需要重点区分一个容易被忽略的安全误区,单台设备检出恶意样本不等于低危威胁,批量扩散的恶意程序往往是广撒网的垃圾攻击,而只在单一终端落地、无同源样本的定制后门,几乎可以判定为定向渗透行动,黑客目标明确只针对这一台设备窃取数据,风险等级反而更高。

研究员检索全网 VirusTotal 平台,没有找到任何同源样本痕迹,程序内部特征字符串 c% s% se/c% s、a=% s&r=none、/version/check.php、标准 UTF16 desktop.ini 头部加长段空格组合全部无匹配记录,说明这是黑客手写专属工具,没有用于大规模钓鱼投放。

黑客选用的 C2(CommandandControl 指挥控制)域名diagrtrack.com属于拼写仿冒域名,原型是 Windows 自带 DiagTrack 遥测服务,这类域名不会由自动化域名生成算法批量产出,只有熟悉 Windows 底层服务的攻击者才会刻意构造,侧面佐证这是针对性攻击而非通用木马。

后门程序本体仅 12KB,精确大小 12288 字节 64 位可执行文件,全程不依赖 msvcrt 运行库,没有加壳、无导入哈希、无反调试逻辑,所有依赖仅 KERNEL32、WININET、WS2_32、IPHLPAPI、SHLWAPI、ADVAPI32 六套系统原生动态链接库。

想要脱离微软标准运行库正常运行,攻击者做了大量替代适配,用 SHLWAPI 提供 wnsprintfA、StrStrA、StrToIntA 替换标准 sprintf、strstr、atoi 函数,KERNEL32 自带 lstrcpyA 系列接口处理字符串,memset 与 memcpy 内存拷贝函数完全自主编写,编译工具采用老旧 TDM-GCC4.9.2,编译时间戳锁定 2020 年 12 月 2 日 13 点 34 分 UTC。

程序内部没有完整 desktop.ini 字符串常量,代码把文件名拆分为 \DESKTOP. 与 ini 两段独立文本分散存储在.rdata 段,两段拼接代码中间还插入 16 行无关初始化逻辑,直接检索二进制文件无法匹配到 desktop.ini 关键词,绕过基于特征字符串的静态扫描。

这款后门最颠覆常规检测思路的设计,是把远程服务器域名全部藏在 C:\ProgramData\desktop.ini 文件的空白行里,我们先理清基础背景,ProgramData 目录自带原生 desktop.ini 系统模板,固定 174 字节 UTF16LE 头部,包含字节序标记、[.ShellClassInfo] 分区、LocalizedResourceName=@% SystemRoot%\system32\shell32.dll,-21781 配置文本与换行符,正常合法文件头部之后不会出现大量连续空白字符。

后门启动时会自动读取 PROGRAMDATA 环境变量拼接配置文件路径,调用 CreateFileA 以 OPEN_ALWAYS 模式打开文件,先跳过前 174 字节标准头部,从文件偏移 174 位置开始逐行统计每行 UTF16 空格数量,每一行空格总数对应域名单个字符的 ASCII 码,最后硬编码拼接.com 后缀还原完整 C2 地址,这种编码方式属于纯一元编码,不需要密钥、不需要解密算法,只靠空白字符计数传递关键数据。

文件存储采用 UTF16LE 双字节格式,读取时代码按步长 2 遍历文件内容,识别 0x0D 回车符判定单行结束,每一行空格统计数值存入数组,直接作为字符 ASCII 值转换,本次捕获样本一共 10 行空白内容,对应域名 diagrtrack 完整字母,对应规则如下:

  1. 第一行 100 个空格 = 字符 d

  2. 第二行 105 个空格 = 字符 i

  3. 第三行 97 个空格 = 字符 a

  4. 第四行 103 个空格 = 字符 g

  5. 第五行 114 个空格 = 字符 r

  6. 第六行 116 个空格 = 字符 t

  7. 第七行 114 个空格 = 字符 r

  8. 第八行 97 个空格 = 字符 a

  9. 第九行 99 个空格 = 字符 c

  10. 第十行 107 个空格 = 字符 k

组合后域名diagrtrack.com,整个配置文件总大小 2318 字节,文件体积和域名字符 ASCII 总和直接挂钩,安全人员可以通过文件大小快速筛查同类恶意配置文件。

研究员同步放出 20 行 Python 解码脚本,任意同格式恶意 desktop.ini 都能一键还原隐藏域名,核心逻辑就是跳过 174 字节标准头部,逐双字节统计每行空白数量,批量转换为字符拼接域名后缀。

程序内置容错崩溃机制,如果设备内没有提前部署带空白编码的 desktop.ini,OPEN_ALWAYS 参数会自动生成空配置文件,空文件减去 174 字节头部后数值溢出为超大负数,内存申请 4GB 零初始化内存失败,读取计数时触发空指针访问,后门直接退出进程,不会持续运行暴露自身。

普通运维人员用记事本打开这份文件只能看到系统模板加一片空白,基础自动化扫描工具只检索明文、加密二进制、高熵数据,会直接判定文件为空无风险,空白字符天然形成检测盲区。

后门会先计算本机唯一 8 位十六进制设备标识,拼接 USERNAME、USERDOMAIN、COMPUTERNAME 三段文本后做 CRC32 校验,校验值同时作为进程互斥锁名,避免多进程重复运行,系统每天 19 点 50 分触发时,第二个启动的进程会检测互斥锁存在直接退出,只有当日第一次重启后的触发能正常执行通信。

通信分为两步校验机制,第一步发送 32 字节 ICMP echo 请求数据包,数据包负载携带 8 位设备 ID,等待 1 秒接收服务器应答,只有 ICMP 连通成功才会发起第二步 HTTP 上报请求,减少无意义网络流量暴露。

HTTP 请求固定访问路径 /version/check.php,请求头 User-Agent 硬编码 Chrome78 版本标识,表单提交格式 a=<设备 ID>&r=none,无任务上报时 r 字段赋值 none,存在命令执行结果时将输出 Base64 编码后再做 URL 编码填入 r 参数。

服务器下发指令通过响应文本内 CMD = 标识匹配,黑客仅开放三类极简控制指令,没有截图、键盘记录、全盘文件检索功能,攻击目标高度聚焦:

  1. system:调用 cmd.exe 执行系统命令,管道捕获标准输出与错误信息,30 秒无响应直接返回 cmdtimeout 超时标记

  2. put:远程下发文件写入本地,写入前会修改 PE 文件 MZ 头两个字节规避实时文件扫描,写入临时文件 tempcache.tmp 完成改名后再修复文件头,文件落地初期不会被识别为可执行程序

  3. time:调整后门轮询上报间隔,程序默认 5 秒循环一次通信

程序内部还有一处规避检索的细节,执行 cmd 命令时不会直接存储完整 cmd.exe 字符串,拆分拼接 c% s% se 与 ex 两段文本组合完整执行路径,绕过针对 cmd.exe 字符串的静态特征拦截。

整套攻击时间线能直观体现定向后门的隐蔽危害,diagrtrack.com域名 2020 年 7 月 23 日通过隐私代理注册,后门程序 2020 年 12 月 2 日编译完成,3 小时内攻击者就在受害设备写入 desktop.ini 恶意配置文件,21 天后企业安全防护软件才部署上线,初始入侵全过程无安全日志留存。

该域名 DNS 解析记录最后更新于 2021 年 3 月,同年 7 月域名注册到期未续费,域名彻底失效无法解析,但 WMI 持久化订阅一直保留在设备底层,研究员在 2021 年 2 月、8 月、10 月三次扫描均捕获到这条恶意订阅,2022 年 6 月专属检测规则上线后,依旧能检出 C:\ProgramData\desktop.ini 恶意配置文件。

域名失效后的 11 个月里,后门每天固定时段照常启动,读取空白文件还原失效域名发起解析,解析失败后程序不会终止,每隔 5 秒读取栈内残留随机内存地址发送 ICMP 数据包,持续在后台静默运行,即便黑客早已放弃该域名,恶意程序依旧长期驻留设备。

传统基于文件哈希、域名黑名单的防御手段只能应对单一样本,这套后门的核心防御思路是针对文件结构做结构化检测,不受域名、程序二进制修改影响,四类低成本排查方案可直接落地:

  1. 检索 WMI 订阅组合,筛选绑定 Win32_LocalTime 时间监控的__EventFilter 与 CommandLineEventConsumer 配对规则,重点排查名称标注 Realtek、伪装声卡程序路径的订阅项

  2. 定点巡检 C:\ProgramData\desktop.ini,只要文件包含 shell32.dll,-21781 标准本地化字段,且 174 字节头部后仅存在 UTF16 空格、回车、换行字符,直接判定高风险文件,零字节该文件同样标记可疑,是后门未部署配置的崩溃残留痕迹

  3. 批量检索全终端 desktop.ini 文件,筛查头部合规、后半段仅填充 UTF16 空白字符的配置文件,该规则能拦截同编码逻辑的新型变种,不受域名修改影响

  4. 流量侧监控,识别固定时段先发 ICMP 探测包、再发起 POST 访问 /version/check.php 路径的内网终端,匹配 Chrome78 固定 UA 且表单携带 a=、r = 参数的网络行为

研究员 2022 年 6 月上线这套结构化检测规则,持续运行 5 个月期间全网仅命中本次涉事单一终端,证明该编码手法没有大规模扩散,但定向攻击场景下这套检测逻辑的不可替代性极强。

本次完整溯源过程全部来自单台企业域内 Windows7 工作站,没有捕获黑客下发的后续载荷,也无法还原最初入侵渠道,程序专属开发、无同源样本、单设备投放三大特征,让研究员判断这是一次针对性定向渗透而非批量垃圾攻击。

很多运维团队会按照病毒检出数量排序处置告警,低检出率样本往往被压在排查队列末尾,恰恰是这类只潜伏一台设备的定制后门,更容易完成核心业务数据窃取,传统只检索明文、加密字符串、恶意特征的检测体系,会被空白字符编码、拆分字符串存储、系统文件伪装三类手法完整绕过。

即便远程指挥域名过期失效,持久化 WMI 订阅依旧会长期留存于系统底层,定时唤醒恶意程序持续消耗终端资源,一旦黑客重新启用同编码逻辑更换新域名,就能立刻恢复远程控制权限,针对系统配置文件空白字符、底层定时订阅的结构化检测,是应对这类新型隐匿后门的核心防御方向。

附录:程序底层编译与 CRC 算法溯源细节

1. 刻意剔除运行库的编译适配逻辑

程序完全移除 msvcrt.dll 导入表,并非编译自带效果,是攻击者主动做的适配改造,编译器 TDM-GCC4.9.2 默认生成 mainCRTStartup 标准入口,攻击者手动修改程序入口指向自定义主循环,全部标准库函数替换为系统原生 API,内存操作函数自主实现,程序.rdata 段留存完整编译器标识字符串 GCC:(tdm64-1) 4.9.2。

2. CRC32 多项式的底层来源

后门校验设备 ID 的 CRC32 算法没有直接写入常量 0xEDB88320,而是内置 14 位比特位置数组运行时拼接多项式,数组数值 0、1、2、4、5、7、8、10、11、12、16、22、23、26 对应 CRC32 标准多项式 14 个置 1 比特位。

这套动态生成多项式的代码并非黑客原创,完整复刻 zlib1996 至 2004 年间版本的 crc32.c 源码,启用 DYNAMIC_CRC_TABLE 编译选项,运行时动态生成校验表,没有内置千字节静态常量表规避扫描,2022 年 3 月 zlib1.2.12 版本重构算法后才取消这套动态生成逻辑,说明攻击者直接复用了十几年前的老旧开源代码片段。

程序.data 段仅初始化单一变量 dd1,对应 zlib 原生 crc_table_empty 空表标记,缺少 2004 年 9 月新增的线程安全标识,进一步锁定源码截取的时间区间,这套设计只是老旧开源代码复用,并非攻击者独创的对抗技巧。

威胁指标 IOC 清单

  1. C2 域名:diagrtrack.com(已过期,无解析记录)

  2. 后门程序 RtkNGUI64.exe 哈希:

    d411d93f358128c77aed0be91365b18cfb7575ecd188d22a216cbaeaa51c5e11

  3. 恶意 desktop.ini 配置文件哈希:

    1cc5a4be7f2e41086b53e698b487e43426e5e572bc99e5de62eada9baf83bdcd

  4. 恶意程序伪装路径:

    C:\ProgramFiles\Realtek\Audio\RtkNGUI64.exe

  5. 恶意配置固定路径:C:\ProgramData\desktop.ini

  6. C2 通信接口路径:/version/check.php

  7. 恶意持久化标识:WMI 过滤器、消费器、绑定项统一命名 Realtek