我将分享 Windows 功能的(滥用)使用,该功能可导致绕过用户组策略(以及其他一些有趣的事情)。绕过用户组策略并不是世界末日,但也不应允许这样做,并且根据用户组策略设置,可能会导致不幸的安全情况。此技术已针对 Windows 7 和 Windows 10 Enterprise x64(10.18363 1909)进行了测试,不需要管理员访问权限。利用此技巧与登录时如何加载用户帐户注册表有关,因此让我们从了解用户登录 Windows 帐户时发生的情况开始。
当您登录时
登录 Windows 帐户时会发生许多事情,其中之一就是为帐户加载用户定义的设置。这些设置从“用户注册表配置单元”加载,当您打开 regedit 时,您可能知道它是 HKEY_CURRENT_USER。此配置单元包含操作系统和可能安装的各种应用程序的用户相关设置。此“配置单元”实际上是存储在文件系统上的文件,可在“%USERPROFILE%ntuser.dat”中找到。登录后,ProfSvc(用户配置文件服务)找到此文件并调用NtLoadKeyEx以加载注册表配置单元。如果用户希望在登录会话期间修改注册表项,则必须通过适当的 Microsoft API,这些 API 反过来会检查您要修改的项的权限(就好像它本身就是一个微型文件系统一样)。
问题
如果我们在启用“启动日志记录”的情况下启动 ProcMon,当我们登录到机器时,ProfSvc 服务中会出现有趣的行为。
用户登录时 ProfSvc 的 Procmon 输出
ProfSvc 在加载“%USERPROFILE%ntuser.dat”之前,只是检查了“%USERPROFILE%ntuser.man”文件是否存在。什么是“ntuser.man”?它与 ntuser.dat 完全一样(它是一个用户配置文件注册表配置单元),但是,它适用于您想要建立“强制配置文件”的情况。我们当然知道 %USERPROFILE% 路径可由非管理员写入,因此我们可以通过删除我们自己制作的“ntuser.man”来实现一些有趣的结果。
绕过用户组策略
组策略是 Microsoft 的一项功能,允许域管理员管理其网络上用户的设置和执行。管理员可以在计算机级别和/或用户级别配置这些组策略设置。对于用户策略,这些设置在登录时推送到域用户的帐户,并存储在“%USERPROFILE%ntuser.dat”配置单元中。这些用户策略对于域用户是只读的,以防止它们被更改。
域用户对“Policies”注册表项具有只读访问权限
由于我们可以换出一个全新的配置单元,因此我们可以绕过或修改任何这些“受保护”的用户组策略实施。
我们只需要:
-
制作我们自己的名为“ntuser.man”的用户注册表配置单元,
-
删除或应用我们在配置单元中想要的任何策略键/值。
-
将文件放入目标机器的 %USERPROFILE% 路径中
-
注销并重新登录。
但是 Windows 将重新同步组策略规则并覆盖这些更改……对吗?
熟悉用户组策略的人都知道,策略会在登录时重新同步并重新应用(以及登录后定期同步),从而覆盖可能已修改的任何策略。即使我们试图通过从我们制作的密钥的 ACL 中删除“SYSTEM”来阻止这种覆盖,GpSvc(Windows 组策略客户端)也会检测到这一点,并在登录时更正 ACL 以重新获得可写权限,然后重写组策略设置。
但是……有一种方法可以解决这个问题。我查看了 GpSvc 内部是如何进行 ACL 修改的。当 GpSvc 遇到我们的“Policies”子项时,它会调用其内部函数ForceRegCreateKeyEx,该函数尝试使用可写权限打开我们的一个“Policy”子项,如果失败,则调用AddPolicyPermissionOnKey来获取密钥的所有权并恢复密钥上具有可写权限的“SYSTEM”,然后重新打开该密钥并覆盖组策略条目。
GpSvc.dll 中的 ForceRegCreateKeyEx 例程
查看AddPolicyPermissionOnKey例程,我注意到它修改了子项的 ACL 以添加“SYSTEM”,但它不会删除任何现有的 ACL 条目。这意味着如果我们将显式条目设置为“DENY”SYSTEM 可写权限,那么它将有效地阻止“SYSTEM”获取可写权限,因为我们的“DENY”规则将优先于它尝试添加的“ALLOW”规则。
有了这个额外的技巧,一切都变得非常简单,下面的 GIF 演示了这一点。
左边是右侧计算机所连接的域控制器。您可以在域控制器中看到,为用户组策略设置了“删除任务管理器”规则,右键单击任务栏时,我们可以看到该规则应用于域用户的计算机,其中“任务管理器”呈灰色显示。然而,在 %USERPROFILE% 中放置特制的“NTUSER.man”文件后,我们注销/登录,任务管理器规则不再适用。
其影响很大程度上取决于“策略配置”,虽然从恶意软件的角度来看这可能是一种威胁,但更有可能是来自恶意域用户试图突破域管理员施加的限制的威胁。
其他影响
值得一提的是,这个怪癖除了绕过用户组策略之外,还可能导致其他后果。
-
单文件代码执行—某些漏洞可能能够以非管理员身份将文件投放到 Windows 文件系统的某个位置。如果漏洞投放了“%USERPROFILEntuser.man”,其中包含一个自动启动注册表项,用于从远程 SMB 共享执行文件,那么漏洞现在只需投放一个不可执行文件即可获得可靠的代码执行。
-
防病毒/EDR 绕过— 某些防病毒/EDR 产品可能仅通过拦截注册表 API 或内核回调来监控注册表修改。如果您通过替换整个配置单元来更改注册表,这可能会绕过监控和检测。
-
拒绝服务——通过在 %userprofile% 中放置一个空的 ntuser.man 文件,ProfSvc 将无法加载注册表,从而阻止用户登录,需要安全模式启动或备份管理员帐户来删除有问题的 ntuser.man 文件。
概念验证
(注意 - 这可能会损坏 Windows 帐户,请勿在您不是管理员的域计算机上尝试此操作。如果您感兴趣,我建议您在测试虚拟机中尝试此操作。如果您最终在个人计算机上尝试此操作,请不要在管理员帐户上尝试,因为完成后将需要管理员帐户进入并删除 ntuser.man 文件:
1. 制作Ntuser.man
-
在一台您有管理员权限的完全独立的(相同版本)Windows 机器上,将任何用户的注册表配置单元从 %USERPROFILE%ntuser.dat 文件复制到另一个文件夹。请注意,您需要确保此用户未登录,这样您才能真正复制此文件。
-
在管理员帐户下,启动 regedit.exe,通过选择 HKEY_LOCAL_MACHINE 键来加载此复制的注册表配置单元,然后单击文件->加载配置单元…
-
在新加载的注册表配置单元下,清除或添加适当策略注册表路径下的任何策略,例如,许多用户策略存储在 SoftwareMicrosoftWindowsCurrentVersionPolicies 中。
-
在您用 regedit 加载的配置单元的根目录中,更改权限以允许“每个人”完全控制(读/写/等),并将这些权限传播到所有子项。
-
根据您想要覆盖或添加的“策略”,您需要找到与其相关的相应子项,因为它们并非全部存储在用户注册表中的一个键下。例如,在“删除任务管理器”场景中,定义此的值位于 SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem 键中。因此,“System”子项是您要添加“DENY”规则的地方,以拒绝该键的 SYSTEM“写入/创建”权限。这确保 GpSvc 无法覆盖它。
2. 删除 Ntuser.man
-
在继续之前,请确保您在计算机上有一个具有管理员权限的备份帐户,该帐户与您正在测试的帐户是分开的。如果没有 — 现在创建一个,因为删除 PoC 文件需要它。
-
将您制作的注册表配置单元作为“%USERPROFILE%ntuser.man”复制到您想要覆盖用户组策略的机器上。
-
注销并重新登录。您可能会看到一个 Windows 欢迎屏幕,让此操作完成,现在所有用户组策略都已被 ntuser.man 中的内容覆盖。
3. 删除 Ntuser.man
-
测试 PoC 后,注销并使用管理员帐户登录,从用户的配置文件路径中删除“ntuser.man”文件。
结论
根据我们的90 天披露政策,我们联系了 Microsoft 并报告了此问题。虽然他们能够完全复制此问题,但 Microsoft 认为这是预期行为,而不是安全问题。虽然我知道这不是一个关键问题,但我认为无论如何修改受保护的策略都会越过安全界限。
原文始发于微信公众号(Ots安全):使用这个奇怪的技巧绕过Windows 10用户组策略(及更多)
- 左青龙
- 微信扫一扫
- 右白虎
- 微信扫一扫
评论