文章总结: CoolClient已从用户态后门演化为多阶段内核Rootkit,通过已签名驱动msagent.sys实现进程、文件、注册表隐藏及C2地址过滤。攻击链始于PlugX下发,经DLL侧载、UACbypass、服务安装最终加载驱动。驱动暴露33个IOCTL,常规执行仅使用三个用于登记可信进程、C2地址和保护路径。检测应关联wmic修改Defender排除项、synchost.exe进程及NsiproxyHook等行为信号。 综合评分: 85 文章分类: 恶意软件,渗透测试,红队,内网渗透,安全工具
CoolClient 内核 Rootkit 分析:多阶段注入、IOCTL 通信与隐匿机制
原创
Ti Ti
TIPFactory情报工厂
2026年8月18日 11:55 江苏
在小说阅读器读本章
去阅读
CoolClient 已从带插件体系的用户态后门,演化为能够部署已签名内核驱动的多阶段攻击组件。新的 msagent.sys 不负责替代后门本体,而是通过 IOCTL 接收用户态配置,在内核中隐藏或保护进程、文件、目录和注册表对象,并过滤特定 C2 地址对应的网络信息。PlugX 仍承担入侵后的初始落点,CoolClient 则作为第二阶段后门接管持久化、注入和隐匿。
CoolClient 新变种引入内核驱动,隐匿能力从用户态扩展到 Windows 内核。
从 PlugX 到内核驱动的执行链
在针对缅甸目标的入侵记录中,攻击者先用 PlugX 下发 CoolClient 组件,并通过 wmic 为伪造的 Windows Defender 目录和侧载程序添加 Microsoft Defender 排除项:
wmic /Node:localhost /Namespace:\\Root\Microsoft\Windows\Defender Path MSFT_MpPreference call Add ExclusionPath="$programfiles\Microsoft\Windows Defender"
wmic /Node:localhost /Namespace:\\Root\Microsoft\Windows\Defender Path MSFT_MpPreference call Add ExclusionPath="$programfiles\Microsoft\Windows Defender\defender.exe"
随后,攻击者把正常的 Sangfor 可执行文件 Sang.exe 重命名为 defender.exe,放入仿冒目录,用它侧载恶意 libngs.dll。启动持久化由一个名称高度仿真的计划任务完成:
schtasks /create /sc onstart /tn "\Microsoft\Windows\Windows Defender Advanced Threat Protection Service" /tr "\"$programfiles\Microsoft\Windows Defender\defender.exe\"" /ru "system" /F
整条链路由六个组件分工完成:
| 组件 | 作用 |
| — | — |
| defender.exe / Sang.exe | 被滥用的正常 Sangfor 程序,负责 DLL 侧载 |
| libsrapc.dll | Sangfor 程序正常运行所需的良性依赖 |
| libngs.dll | 第一阶段加载器,解密并内存加载下一阶段 |
| loadcert.ini | 加密 DLL,处理持久化、UAC bypass、进程注入和驱动部署 |
| cert.ini | 最终后门,负责 C2 通信和后门功能 |
| time.ini | CoolClient 配置文件 |
正常侧载程序、两级加密 DLL、配置文件、最终后门与 msagent.sys 的关系。
第一阶段:libngs.dll 解密并转入内存
libngs.dll 导出了大量无实际业务功能的函数。每个伪装导出只调用 OutputDebugStringA 输出函数名,随后执行 ExitProcess,目的是让导出表接近正常 DLL。真正的执行入口位于 DllMain(DllEntryPoint),其控制流被 flattening 和大量无条件跳转打乱。
伪装导出函数调用 OutputDebugStringA 后立即退出,恶意逻辑则隐藏在 DllMain。
还原控制流后,第一阶段的职责很集中:解析所需 Windows API、读取 loadcert.ini,再用由种子 0xA4 变换而来的 0x32 字节循环 XOR 密钥流解密。解密后的 DLL 不落地为新文件,而是直接装载到当前进程内存中。
第二阶段:持久化、注入与 UAC bypass
loadcert.ini 先检查当前模块是否运行在 synchost.exe 中,据此选择两条路径:原始侧载进程负责初始安装,注入后的 synchost.exe 负责驱动部署和最终后门加载。命令行参数进一步区分状态:install 执行初始设置,work 进入注入后的主要功能,passuac 承接提权后的执行。
在 install 路径中,样本写入以下 AutoRun 项,值名为 goopdate,使 Sang.exe 或 defender.exe 在用户登录时以 work 参数启动:
HKCU\Software\Microsoft\Windows\CurrentVersion\Run
随后,loadcert.ini 使用以 0x4D 为基础的 0x32 字节循环 XOR 密钥流解密自身副本,将 DLL 写入新建的挂起 synchost.exe:分配内存、写入载荷、修改线程上下文、恢复线程,最后退出原进程。这里使用的进程名是 synchost.exe,不要与 Windows 的 svchost.exe 混淆。
服务安装前,样本还会检查 360sd.exe、zhudongfangyu.exe 和 360desktopservice64.exe 是否运行。若能够完全访问 Service Control Manager 且未发现这些进程,它会从 time.ini 读取服务配置,重建 media_updaten 服务并以 work 参数启动侧载程序。
服务安装路径会先检查三个 360 Total Security 相关进程。
提权路径结合了本地 RPC 进程创建、调试对象复用与 PPID spoofing。样本连接 ncalrpc 端点 201ef99a-7fa0-444c-9399-19ba84f12a1a,通过 NdrAsyncClientCall 启动 winver.exe,再用 NtQueryInformationProcess 取得调试对象、调用 NtRemoveProcessDebug 脱离调试并终止该进程。
接下来,同一 RPC 机制用于启动 computerdefaults.exe。样本通过 DbgUiSetThreadDebugObject 绑定先前取得的调试对象,等待进程创建事件,再以 NtDuplicateObject 获取全访问句柄。最后,CreateProcessW 配合 PROC_THREAD_ATTRIBUTE_PARENT_PROCESS 创建 Sang.exe passuac,让提权后的实例呈现为由可信 Windows 进程派生。
本地 RPC 认证绑定是调试对象复用与 PPID spoofing 提权链的起点。
驱动部署与用户态通信
进入注入后的 synchost.exe 后,loadcert.ini 解密 time.ini,检查是否能够完全访问 SCM 且拥有 SeTcbPrivilege。满足条件时,它从自身提取 LZMA 压缩的驱动,解压为 msagent.sys,重建同名驱动服务并将其加载到内核。权限不足时,驱动阶段会被跳过,但 cert.ini 仍可继续注入新的 synchost.exe。
用户态组件完成驱动加载后,只在常规执行中发送三类 DeviceIoControl 请求:
| IOCTL | 常规执行中的用途 |
| — | — |
| 0x222120 | 把当前 CoolClient 进程登记为可信进程 |
| 0x2221E0 | 把 time.ini 中的 C2 IPv4 地址交给驱动 |
| 0x2220F0 | 登记需要隐藏或保护的文件系统与注册表路径 |
可信进程标记使 CoolClient 可以绕过驱动对其他进程施加的访问限制。路径登记则覆盖安装目录及 \Registry\Machine\SYSTEM\CurrentControlSet\Services\media_updaten。样本还会把安装目录追加到 HKLM\SYSTEM\RNG\Wid_H1deF5Dirs,供内核过滤逻辑使用。
cert.ini 的最终注入会枚举 WinStation 会话,选择交互式用户会话,复制访问令牌并更新 session ID,再通过 CreateProcessAsUserA 创建挂起的 synchost.exe。解密后的最终后门沿用内存分配、线程上下文修改与 ResumeThread 流程进入目标进程。
msagent.sys:配置驱动的内核 Rootkit
驱动包含以下 PDB 路径:
E:\work\南京实验室\2024项目\张雪杰云南m\研发\FTool\Tool\x64\Release\FTool.pdb
驱动内嵌 PDB 路径包含开发目录字符串,但这些字符串无法直接指向已知组织或开发者。
驱动使用颁发给 Nanjing Ranyi Technology Co., Ltd. 的证书签名,序列号为 3E 62 DC 5D 8D 61 2A 26 33 E7 6B DF D6 07 19 DD,证书有效期为 2013 年 8 月至 2014 年 9 月。同一证书还签过约 2013 年编译的其他恶意驱动,但现有证据不能把那些旧样本与本次 CoolClient 活动直接关联。
驱动从 \REGISTRY\MACHINE\SYSTEM\RNG 读取配置。Hid_State=1 启用 Rootkit 功能,Hid_StealthMode=0 控制附加隐匿分支;多个 REG_MULTI_SZ 值分别定义隐藏目录、隐藏文件、隐藏注册表键和值,以及忽略、保护或隐藏的进程映像。
SYSTEM\RNG 下的配置被转换为内部查找结构,供文件、注册表、进程与 IOCTL 逻辑共享。
进程隐藏与内核回调
为了跨 Windows 版本定位进程链表,驱动不只依赖硬编码偏移。它会先验证若干候选偏移,失败后线性扫描 EPROCESS,寻找符合结构特征的 ActiveProcessLinks。定位成功后,IOCTL 0x22219C 和 0x2221A0 分别负责从活动进程链表摘除与重新链接进程节点。
驱动验证候选 ActiveProcessLinks 布局,以适配不同 Windows 版本的 EPROCESS。
配置项被装入 AVL 树后,驱动注册三组回调:
- •
ObRegisterCallbacks拦截进程与线程句柄操作; - •
PsSetCreateProcessNotifyRoutineEx跟踪进程创建和退出; - •
PsSetLoadImageNotifyRoutine跟踪模块加载。
对象回调使用 altitude 1203。当目标是受保护的 CoolClient synchost.exe 时,驱动削减请求方得到的访问权限,从而阻止终止进程、注入代码等操作。进程与映像回调则持续维护忽略、保护和隐藏列表;初始化完成后还会枚举一次现有进程,补齐驱动加载前已经运行的对象。
三类内核回调共同维护受保护进程及其模块状态。
文件与注册表过滤
文件保护由 MiniFilter 完成。驱动读取 Wid_H1deF5Dirs 和 Wid_H1deF5Files,在 HKLM\SYSTEM\CurrentControlSet\Services\msagent\Instances 下创建实例配置。为避免 filter altitude 冲突,它会递增 altitude 并重试,直到 FltRegisterFilter 成功。
驱动递增 filter altitude,直到文件系统 MiniFilter 注册成功。
MiniFilter 将访问路径与内部列表比较,对命中项拒绝访问。IOCTL 0x2220F0、0x2220F4 和 0x2220F8 分别用于添加、删除和清空保护路径。
注册表保护通过 altitude 320000 的 CmRegisterCallbackEx 回调实现。枚举操作返回前,受保护键和值会从结果中被移除;直接打开、修改或删除命中对象时,回调返回 STATUS_ACCESS_DENIED。通过 0x222120 登记的可信进程不受这些限制。
CmRegisterCallbackEx 回调对枚举结果做过滤,并拒绝非可信进程直接操作受保护对象。
33 个 IOCTL 暴露的能力边界
驱动实现了 33 个 IOCTL handler,但不能把 handler 存在等同于本次样本已经调用。常规执行只确认 0x222120、0x2221E0 和 0x2220F0 三个请求。其余 handler 暴露的能力包括:
- • 通过
NtCreateThreadEx向目标进程注入 shellcode; - • 从
PsLoadedModuleList摘除内核模块; - • 隐藏、恢复进程及其模块;
- • 终止进程、移除 PPL 保护;
- • 枚举、禁用或恢复内核通知回调;
- • 手工加载第二个内核驱动;
- • 向任意内核地址写入数据;
- • 添加或删除需要过滤的 C2 IPv4 地址。
其中,0x222138 会定位 PsLoadedModuleList 中的目标模块,通过更新 Flink 和 Blink 把节点摘除,使标准内核模块枚举不再显示该模块。
驱动运行时解析非导出的 PsLoadedModuleList,为内核模块隐藏做准备。
Nsiproxy Hook 隐藏 C2 地址
0x2221E0 登记的 C2 IPv4 地址会进入网络过滤列表。驱动通过 ObReferenceObjectByName 获取 \Driver\Nsiproxy,保存原处理函数并替换其中一个 handler。返回网络信息时,自定义逻辑删除与已登记 C2 地址匹配的记录,再把结果交给用户态。
Nsiproxy Hook 在网络信息返回用户态前删除与 C2 地址匹配的条目。
这意味着依赖 Nsiproxy 返回数据的常规用户态网络检查工具可能看到不完整结果。调查疑似感染主机时,应把磁盘与注册表离线采集、内核内存分析、EDR 内核遥测和网络侧流量记录结合起来,避免只依据本机标准枚举作出结论。
检测与排查要点
行为链比单个文件名更稳定,可优先关联以下信号:
- • 使用
wmic修改MSFT_MpPreference,为仿冒 Windows Defender 目录或defender.exe添加排除项; - • 名为
Windows Defender Advanced Threat Protection Service的计划任务在开机时以SYSTEM启动非标准路径程序; - • 正常 Sangfor 可执行文件从伪造目录侧载
libngs.dll; - •
goopdateAutoRun 值、media_updaten用户态服务和msagent驱动服务同时出现; - •
Sang.exe、winver.exe、computerdefaults.exe与synchost.exe形成异常的 RPC、调试对象和父子进程关系; - •
HKLM\SYSTEM\RNG下出现Wid_H1deF5Dirs、Wid_H1deRegKeys、Hid_ProtectedImages等配置; - •
msagent.sys注册 MiniFilter、对象回调、进程回调、映像回调和注册表回调,并修改Nsiproxyhandler。
样本哈希:
2d7c8780e97409770a9d4f31c66c9d63 msagent.sys
9460E150E1981D5C165043520C5C12FE msagent.sys
9717F005C5FB98E08D2AD983D88F94EE libngs.dll
F518D8E5FE70D9090F6280C68A95998F libngs.dll
EB79558B037669792652A816E2C669DE ctxmui.dll
C2 域名:
cloudtroe.giize[.]com
employers.theworkpc[.]com
freeread.casacam[.]net
us.lenovoappstore[.]com
sundanish.freeddns[.]org
torinarlabs.webredirect[.]org
news.dursamjbataar[.]org
video.dursamjbataar[.]org
black-popular[.]com
whatismybestthing[.]com
样本分析还记录了多组可疑安装目录,包括 C:\Program Files\microsoft\windows defender\、C:\ProgramData\symantecdir\、C:\Windows\identitycrl\production\、C:\Users\<user>\AppData\Roaming\dsassistant\ 和 C:\programdata\msdn\。目录名本身不足以定性,应与侧载组件、服务、注册表配置及驱动行为联合判断。
结论
CoolClient 的变化不只是“增加一个驱动”。用户态后门负责部署、配置和选择目标,内核驱动则把同一份隐藏策略同时施加到进程、文件系统、注册表和网络枚举结果。三类常规 IOCTL 把用户态攻击链与内核隐匿面连接起来,而 33 个 handler 显示该驱动还具备更广的攻击能力,只是这些能力没有在已分析样本的常规执行中全部触发。
归因也需要分层处理:PlugX→CoolClient 的部署顺序、既有 CoolClient 执行特征以及受害区域共同支持 HoneyMyte 关联;PDB 中的中文路径和旧签名证书只能作为开发环境与样本聚类线索,不能单独用于组织或个人归因。
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:TIPFactory情报工厂 Ti Ti《CoolClient 内核 Rootkit 分析:多阶段注入、IOCTL 通信与隐匿机制》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。











评论