2023年11月26日发(作者:)
看我如何绕过Windows10的⽤户组策略
在这篇⽂章中,我们将教⼤家如何利⽤Windows系统中的⼀个功能来绕过Windows 10的⽤户组策略。虽然绕过⽤户组
策略并不意味着就是“世界末⽇”了,但是这毕竟是⼀种违规的危险操作,⽽且根据不同的⽤户组策略配置,这种绕过⾏
为也会产⽣不同的安全后果。⽬前,我们已在Windows 7和Windows 10 64位企业版(10.18363 1909)中进⾏了测
试,⽽且利⽤过程不需要管理员权限。这种技术跟系统在⽤户登录时对⽤户账号注册表的加载过程有关,因此我们⾸先
需要了解Windows账号的登录过程。
⽤户登录
当⽤户登录⼀个Windows账号时会发⽣很多事情,其中⼀个就是为该账号加载⽤户定义的设置。这些设置是从⽤户的注
册表配置单元中加载的,也就是HKEY_CURRENT_USER下的⼦项。这个注册表项中包含的都是操作系统以及各种已
安装应⽤程序中与⽤户相关的配置。这个注册表项其实是存储在⽂件系统中的⼀个⽂件,路径
为“%USERPROFILE%”。当⽤户登录时,ProfSvc(⽤户属性服务)会定位这个⽂件,并调⽤
NtLoadKeyEx来加载注册表配置单元。如果⽤户想要在登录会话期间修改注册表键,则必须通过相应的微软API来实
现,⽽且还会检测相应注册表键的修改权限。
问题分析
如果我们在启⽤了”boot logging”功能之后运⾏ProcMon,就会发现⽬标设备的ProcMon服务有⼀个⾮常有趣的⾏为:
ProfSvc在加载“%USERPROFILE%”之前,只会检测 “%USERPROFILE%”⽂件是否存
在。那么,“”是什么呢?它其实跟“”类似,但它主要针对的是“”。因为⾮管理员账号拥
有“%USERPROFILE%”路径的写⼊权限,因此我们可以通过⾃⼰构造的“”来实现我们的⽬的。
绕过⽤户组策略
是Windows系统提供的⼀种功能,它允许域管理员在主机级别或⽤户级别配置⽤户组策略。针对⽤户策略,相关设置会
被在⽤户登录时推送⾄⼀个域⽤户的账号中,并存储在“%USERPROFILE%”中。这些⽤户策略对域⽤户
只读,以避免被篡改。
因为我们可以直接替换整个相关的注册表项,所以就可以绕过或者修改“被保护的”强制⽤户组策略了。
为了实现这个⽬的,我们只需要做以下⼏件事情:
1、制作我们⾃⼰的⽤户相关注册表项-“”;
2、移除或替换注册表项中相应策略的键值;
3、将该⽂件存放到⽬标主机的“%USERPROFILE%”⽬录中;
4、注销并重新登录;
组策略规则更新与覆盖修改
如果你了解Windows的组策略,你就会知道系统在⽤户登录时会重新同步并应⽤当前已修改的组策略,但此时我们修改
过的策略很可能会被覆盖掉。虽然我们可以通过将“SYSTEM”从构造注册表键值的ACL中移除来避免这种情况,但是
Windows组策略客户端-GpSvc将会检测到这种操作,并在⽤户登录时修复ACL以便获取到写⼊权限,然后重写组策
略。
通过分析GpSvc对这种ACL的处理过程,我发现当GpSvc在检测到注册表中的组策略键值时,会调⽤内部函数
ForceRegCreateKeyEx,这个函数会尝试利⽤写⼊权限来打开我们的组策略键值,如果失败,则会调⽤
AddPolicyPermissionOnKey来获取该注册表项的相应权限,以恢复“SYSTEM”在该表项上的写⼊权限,并重新打开它
然后覆盖组策略。
通过分析AddPolicyPermissionOnKey函数,我们发现该函数会修改注册表⼦项的ACL并添加“SYSTEM”⾓⾊,不过并
不会删除已有的ACL项。这样的话⼀切就很明朗了,整个利⽤过程如下:
上图中左侧为域控制器,右侧为该控制器所连接的主机。我们可以看到,域控制器在⽤户组策略中设置了“Remove
Task Manager”规则,并且应⽤到了我们的域⽤户主机中。接下来,当我们在“%USERPROFILE%”⽬录中存放了特制
的“”⽂件后,⽤户的注销或登录操作将不会再让这个规则⽣效。
漏洞利⽤PoC
注意事项:漏洞利⽤PoC可能会损坏你现有的Windows账号,请不要在拥有管理员权限的域主机中执⾏。除此之外,我
们也不建议⼤家在个⼈PC上测试,⽽且不要使⽤Administrator账号测试,因为测试完成后我们需要使⽤该账号来删
除“”⽂件。
第⼀步:构造
1、准备⼀台测试⽤的Windwos主机,然后拿到⼀个拥有管理员权限的账号,把任意⽤户对应
的“%USERPROFILE%”⽂件拷贝到另⼀个⽬录中。
2、在Administrator账号中打开注册表编辑器(),将注册表项“HKEY_LOCAL_MACHIN”备份好,然后点
击“⽂件”-“加载配置单元”。
3、打开新加载的注册表项,在响应的策略注册表项路径下清除或者添加任意策略。⽐如说,很多的⽤户策略会存放
在“SoftwareMicrosoftWindowsCurrentVersionPolicies”路径下。
4、在注册表配置单元的根节点,将权限修改为“Everyone”,即提供完整权限,并应⽤到该表项下的所有⼦项。
5、针对我们希望覆盖或添加的“策略”,我们需要找到与之相关的⼦键,这些⼦键可能不会都在同⼀个表项下。⽐如,
在“Remove Task Manager”的场景中,定义该策略的值位
于“SoftwareMicrosoftWindowsCurrentVersionPoliciesSystem”键中,因此我们需要在“System”⼦键中添加⼀
个“DENY”规则,阻⽌SYSTEM获取该键的“写⼊/创建”权限,确保GpSvc⽆法执⾏覆盖操作。
第⼆步:存放
1、接下来,我们要确保已创建好备份的拥有管理员权限的账号。
2、将构造的注册表配置单元拷贝到⽬标主机的“%USERPROFILE%”路径下,然后覆盖⽤户组策略。
3、注销并重新登录,现在所有的⽤户组策略都已经被我们在“”中定义的配置给替换掉了。
第三步:删除
测试完成后,我们需要注销当前账户,然后使⽤Administrator账号来删除⽤户配置⽬录中的“”⽂件。
总结
我们在发现了该后,便⽴刻将信息上报给了,但微软⽅⾯认为这是⼀种“预期”的⾏为,并不属于安全漏洞的范畴。不过
我们认为,虽然这并⾮⼀个⾮常严重的安全问题,但这种允许他⼈随意修改⽤户组策略的情况,早就已经超出了所
谓“预期”的安全边界了。
发布评论