文章总结: 本文披露利用Windows强制性用户配置文件实现隐蔽持久化的技术。通过伪造NTUSER.MAN文件写入用户目录,系统登录时自动加载恶意HKCU项,全程无注册表API调用,绕过依赖回调的EDR监控。此法仅需普通用户权限,隐蔽性极高。建议监控NTUSER.MAN文件的异常创建、修改及AD用户profile路径变更以进行防御。 综合评分: 93 文章分类: 红队,渗透测试,内网渗透,漏洞分析
无需注册表回调的 Windows 注册表持久化技术
Ots安全
2026年1月2日 22:58 广东
威胁简报
恶意软件
漏洞攻击
这篇文章详细披露了一种针对Windows域环境的隐蔽持久化技术——利用强制性用户配置文件(Mandatory User Profile)机制,通过在用户profile目录下放置伪造的NTUSER.MAN文件,实现HKCU(当前用户)注册表的恶意修改并在每次登录时自动加载。该技术最核心的特点是完全不经过常规注册表API(Reg*系列函数),因此绝大多数依赖CmRegisterCallbackEx等内核注册表回调的EDR产品无法感知到这一修改行为。攻击流程主要包括:
- 导出当前用户的正常HKCU hive(.reg格式)
- 注入想要实现的持久化键值(如Run键、Shell Folders修改等)
- 使用工具(如HiveSwarming等)将修改后的.reg文件转换为二进制hive格式
- 将生成的二进制文件以NTUSER.MAN文件名写入用户自己的profile路径
- 当系统加载强制性配置文件时,会优先读取并加载该MAN文件中的注册表内容
由于该技术只需要普通用户对自己profile目录的写权限(默认即可),且加载过程由系统Profile服务完成,整个操作链路几乎不产生任何可疑的注册表写操作记录,因此具有极高的隐蔽性。目前已知大部分主流EDR对该路径的检测能力非常有限。
推荐检测方向:
- 监控profile目录下NTUSER.MAN文件的新建/修改行为
- 监控AD中用户profilePath、centralProfile等属性的异常更改
- 关注大量用户profile目录突然出现MAN文件的告警
核心一句话总结
普通用户权限 → 修改自己profile目录下的NTUSER.MAN → 系统下次登录自动加载恶意HKCU → 完全绕过注册表API监控
注册表持久化仍然是确保系统重启后依然存在的最可靠方法之一。运行键、shell 扩展、COM 劫持:这些模式都有详细的文档记录,检测覆盖率也反映了这一点。
本文探讨了一种在不触发注册表回调的情况下,针对 HKCU 建立中等完整性的注册表持久性和注册表写入的技术。
注册回调
EDR 解决方案通过内核回调机制监控注册表修改CmRegisterCallbackEx。该机制允许驱动程序在注册表操作完成之前对其进行拦截。当进程调用 requireRegSetValue或 require 时RegCreateKey,已注册的回调会收到包含完整上下文的通知:键路径、正在写入的数据以及负责的进程。
内核补丁保护 (PatchGuard) 可防止厂商直接修改内核。CmRegisterCallbackEx它提供了一种受支持的替代方案,大多数终端安全产品都依赖它来实现注册表可见性。
检测覆盖率
Elastic 的“非常规注册表持久性变更”规则就是一个典型的例子。它会监控以下注册表路径:
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Shell
HKLM\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Winlogon\Userinit
HKLM\SYSTEM\ControlSet*\Control\Session Manager\BootExecute
HKEY_USERS\*\SOFTWARE\Microsoft\Windows NT\CurrentVersion\Windows\Load
HKEY_USERS\*\Environment\UserInitMprLogonScript
这些路径代表经典的持久化位置。检测逻辑会过滤掉已知的合法修改,并对其余路径发出警报。
这种方法之所以有效,是因为注册表写入操作会通过注册表 API 进行,这些 API 会触发回调函数,进而生成遥测数据。这条链中的每一步都经过了完善的监控。
该链假定注册表写入使用注册表 API。
必填资料
Windows 用户配置文件将注册表单元存储在用户的配置文件目录中。NTUSER.DAT其中包含用户的HKEY_CURRENT_USER注册表单元,并在登录时加载。NTUSER.MAN如果存在,则具有更高的优先级。
该.MAN扩展名表示一个必需的配置文件。最初是为自助服务终端和共享工作站场景设计的,Windows 会首先检查此文件并加载它,而不是加载标准.DAT配置单元。微软的文档描述了其预期用途:
强制用户配置文件是一种漫游用户配置文件,由管理员预先配置,用于指定用户的设置。
Active Directory 迁移工具 (ADMT) 提供了一个优先级处理的示例。在域迁移期间转换用户配置文件时,ADMT 必须找到正确的配置单元文件。源代码:https://github.com/selfrender/Windows-Server-2003/blob/5c6fe3db626b63a384230a1aa6b92ac416b0765f/admin/admt/workobj/regtrans.cpp#L1062展示了优先级逻辑:
// look for NTUser.MAN
_snwprintf(profileName, profileNameBufferSize, L"%s\\NTUser.MAN", targetPath);
profileName[profileNameBufferSize - 1] = L'\0';
hFind = FindFirstFile(profileName, &fDat);
if (hFind != INVALID_HANDLE_VALUE)
{
err.MsgWrite(0, DCT_MSG_TRANSLATING_NTUSER_MAN_S, targetAcctName);
rc = TranslateUserProfile(...);
FindClose(hFind);
}
else
{
// check for NTUser.DAT
_snwprintf(profileName, profileNameBufferSize, L"%s\\NTUser.DAT", targetPath);
// ...
}
如果该文件NTUSER.MAN存在,Windows 不会将其合并NTUSER.DAT。该.MAN文件将成为该会话的整个 HKCU 注册表单元。
Bypass
NTUSER.MAN精心构造的注册表单元会C:\Users\
CmRegisterCallbackEx监控注册表操作。Hive 加载并非注册表操作,因此不会调用回调函数。
文件系统事件将被触发。向配置文件目录写入文件的操作对任何 EDR 监控文件操作都是可见的。但基于注册表的检测仍然无法检测到。
该技术
中等完整性即可。目标是用户自己的配置文件目录,用户拥有该目录的写入权限。无需本地管理员权限。
配置文件子系统会NTUSER.MAN 代替现有 NTUSER.DAT注册表单元加载,而不是与其并列加载。目标用户现有的注册表单元是必需的,需要向其中添加持久化键。企业环境通过注册表配置应用程序设置、shell 首选项、环境变量和策略状态。完全替换注册表单元会导致会话明显中断。
注册表可以导出为两种格式:二进制格式(原始注册表单元)或.reg文本格式。二进制导出需要提升权限,而文本导出则不需要。
虽然您可以将任意注册表单元放到磁盘上,但一般推荐的工作流程如下:
- 将目标用户的 HKCU hive 导出为.reg特定格式(存在 BOF 格式可供使用)。
- .reg向文件中添加持久化条目
- 使用HiveSwarming等工具转换为二进制 Hive 格式
- 将修改后的 hive 写入NTUSER.MAN目标%USERPROFILE%目录
- 等待登录
下次登录时,Windows 会从NTUSER.MANHKCU 中加载注册表单元,其中包含您添加的注册表项,而无需调用注册表 API。
约束条件
用户注册表单元在会话活动期间保持锁定状态;Windows 会持有已加载注册表单元的句柄,以防止修改或替换。
NTUSER.MAN目标用户登录后无法进行交换。激活需要注销并重新登录,或者重启系统。因此,它是一种持久性机制,而非立即执行。
以其他用户或 SYSTEM 身份运行可以将文件暂存在目标用户的配置文件目录中,但该配置单元要等到下次会话开始时才会加载。删除配置单元的操作方法相同:以其他用户身份登录,这样配置单元就不会被锁定。
横向移动
可以通过 Active Directory 分配强制性配置文件。用户对象上的配置文件路径属性指向网络共享:
\\server\share\profile.v6
这开启了两条可能的道路:
- 修改配置文件路径。拥有对目标用户 AD 对象的写入权限,将其配置文件路径指向您控制的包含精心构造的配置文件的共享文件夹NTUSER.MAN。
下次登录时,Windows 会从您的共享文件夹中获取注册表单元。这需要对该profilePath属性拥有写入属性的权限——通常通过委派的组织单元管理权限或帐户操作员成员身份授予。
然而,由于无法接触到它们现有的蜂巢,构建一个功能完善的蜂巢模型NTUSER.MAN十分困难。我们不建议采用这种方法。
- 写入现有配置文件共享。权限较弱的漫游配置文件共享允许NTUSER.MAN按照之前的流程直接放置配置文件。目标用户下次登录时将加载您的配置单元,而不是他们现有的配置文件。
漫游配置文件的情况还有额外的注意事项。微软的文档指出,当配置文件服务器不可用时,如果存在本地缓存副本,Windows 会回退到该副本。通常在本地工作但偶尔远程连接的目标用户可能仅在连接到公司网络时才会加载您的配置单元。
检测
本地持久性的唯一指标是文件写入。注册表遥测数据为空,因为注册表 API 没有被调用。
监测项目:
- 文件写入NTUSER.MAN任何配置文件目录
- 文件写入NTUSER.MAN漫游配置文件共享
- 存在未.MAN在预期强制配置文件部署范围内的文件
- profilePath对AD 用户对象的属性进行修改
- .MAN与意外文件相关的 Hive 加载事件
强制性配置文件在现代环境中已较为罕见。除自助服务终端或共享工作站配置外,其存在值得调查。
致谢
感谢 Windows 安全研究员Jonas L指出了这一“预期功能”。
值得质疑的问题
- 这套技术本质上是“利用系统特性”还是“功能滥用”?微软是否应该修补/限制这种行为?
- 强制性用户配置文件在现代企业中实际使用率有多高?这项技术对实际攻击面影响大吗?
- 目前主流EDR厂商中有哪些已经或即将支持对NTUSER.MAN的监控?响应速度如何?
- 如果把检测点前移到“hive文件内容被修改后仍能被系统加载”这个环节,是否会有比较可靠的检测方法?
- 除了持久化,这套技术还能被用来实现哪些其他隐蔽目的?(如权限维持、横向移动、信息窃取等)
- 在非域环境(本地强制配置文件)下,这套技术是否同样可行?区别在哪里?
- 微软有没有可能在未来Windows版本中改变Mandatory Profile的加载逻辑,让这项技术失效?
- 从红蓝对抗角度看,这属于“高级”持久化手法吗?还是属于“中低难度但高隐蔽”的技巧?
END
公众号内容都来自国外平台-所有文章可通过点击阅读原文到达原文地址或参考地址
排版 编辑 | Ots 小安
采集 翻译 | Ots Ai牛马
公众号 | AnQuan7 (Ots安全)
免责声明:
本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。
任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。
本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我。
本文转载自:Ots安全 《无需注册表回调的 Windows 注册表持久化技术》
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论