Windows计算机暴露给一个特权升级(EoP)漏洞类大约有60个

Windows 组策略对象机制有大约 60 个漏洞类别,专门针对策略更新步骤,允许域环境中的标准用户执行文件系统攻击,从而使恶意用户可以规避反恶意软件解决方案,绕过安全加固和可能导致对 Windows 2000 的严重攻击。组织的网络。这些漏洞会影响任何 Windows 计算机(2008 或更高版本)并提升其在域环境中的权限。

如果您对本研究的其他发现感兴趣,请查看详细信息(第 1 部分和第 2 部分)。

GPSVC 将所有加入域的 Windows 计算机暴露给特权升级 (EoP) 漏洞。通过运行 gpudate.exe,您可以通过文件操作攻击升级为特权用户。如果你知道 Windows 组策略,你就会知道系统会在用户登录时重新同步并应用当前修改的组策略,但此时我们修改的策略很可能会被覆盖。虽然我们可以通过从构造注册表项的 ACL 中删除“SYSTEM”来避免这种情况,但 Windows 组策略客户端 – GpSvc 将检测到这一点并在用户登录时修复 ACL 以获得写入权限,然后覆盖组策略。

通过分析GpSvc对这种ACL的处理,我发现当GpSvc检测到注册表中的组策略键值时,它会调用内部函数ForceRegCreateKeyEx,这个函数会尝试使用写权限打开我们的组策略key 值,如果失败,会调用 AddPolicyPermissionOnKey 获取注册表项的相应权限,恢复“SYSTEM”对该键的写权限,然后重新打开,然后覆盖组策略。

Windows 的组策略机制已经存在了很长时间,它是一种在域环境(从打印机到备份设备)中传播设置的相对安全的方式,即您可以随意命名。因此,它需要与许多组件进行交互。许多交互会产生许多潜在的漏洞,这就是我们要讨论的。

以下是漏洞的工作原理:

背景

组策略或 GPO 对象最初是在 Windows 2000 的上下文中使用的。已经有一段时间了,它们已经改变了,但它们本质上还是一样的。管理员使用 GPO 在托管环境中强制执行他们的策略,它非常强大。从禁用 Windows Defender 和防火墙到安装软件和打印机,管理员基本上可以对 GPO 做任何他们想做的事情。

在 Windows 中,每个用户都有一组本地组策略,可以由本地管理员修改,从而允许他们为本地计算机设置规则。在加入域环境的计算机上,域管理员经常对适用于您计算机的 GPO 感到困惑。

遵循最小权限原则是众所周知的安全最佳实践,该原则基于将用户的权限级别限制在最低限度。在这种情况下,这意味着不允许域用户成为本地管理员组的一部分。原因是本地管理员可以覆盖域管理员应用的每个组策略,这使得 GPO 成为在公司网络上强制执行设置的一种非常无效的方式。

有趣的是,本地非特权用户可以手动请求组策略更新。因此,如果您在组策略更新期间发现漏洞,您可以随时触发它,从而使潜在的攻击更容易。管理员无需等待 90 分钟(在域环境中推送组策略更新的默认间隔为 30 分钟),而是在默认时间在域环境中推送组策略更新,管理员可以立即强制执行。

我们的兴趣在于名为 gpsvc 的本地组策略服务。该服务需要特权才能执行,因此它在 NT AUTHORITY\SYSTEM 上下文中运行。这个环境很重要,因为如果我们设法找到它执行的不安全文件操作,我们大概可以使用文件操作攻击将其解析为另一个文件。

不出所料,gpsvc 托管在 Svchost.exe 中,通常在具有相似名称的 DLL 中实现 – C:\Windows\System32\gpsvc.dll。这个 DLL 有一个 RPC 接口,我使用 James Forshaw 创建的这个很棒的工具将其反编译为 C#。如下所示,我们有几个有趣的方法可供本地用户调用。

要查看运行 gpupdate 命令时 gpsvc 服务中调用了哪个方法,我弹出 windb.exe 并在每个暴露的 RPC 例程上设置断点,键入:

第一个函数是我们运行 GPUpdate.exe 时对我们很重要的函数;它将调用 Server_ProcessRefresh(),这将启动更新过程。但是,在此之前,让我们注意这种行为(客户端通过 RPC 从服务请求服务)是麻烦的根源,也是许多漏洞的根源。不幸的是,Windows 是基于不同组件之间的 RPC 通信,没有这种机制就无法工作。 Server_ProcessRefresh() 向域控制器询问 GPO 对象,“给我我的组策略,以便我可以更新它们”,并在获得结果后,为每个组策略调用 ProcessGPOList()。

这个方法有超过 600 行的反编译代码,并且使用了 COM 对象。如果我们查看它的签名,我们可以猜出它的作用:

并非所有参数都已正式记​​录,幸运的是 _GROUP_POLICY_OBJECTW 已记录在案,并且在 C++ 中创建 GPO 对象的开发人员可以创建它:

我们可以看到_GROUP_POLICY_OBJECTW是一个包含很多对象的链表结构。 *pPrev 和 *PNext 对象是指向 _GROUP_POLICY_OBJECTW 的指针,它们提供了一种简单的方法来遍历链表。本地服务现在遍历列表并相应地继续执行指针以确定对象是否填充了相同类型的 GPO 对象。因此,将为每个组策略调用 ProcessGPOList()。

我们看一下GPOLink和szGPONamewindows本地策略组,GPOLink参数可以设置为五个参数:

GPLinkUnknown:没有可用的链接信息;

GPLinkMachine:GPO 链接到计算机(本地或远程);

GPLinkSite:指向网站的 GPO 链接;

GPLinkDomain:GPO 链接到域;

GPLinkOrganizationalUnit:GPO 链接到一个组织单位;

事实证明,这个参数的值决定了本地服务将其写入组策略的位置。如果 GPO 链接到计算机,它将具有值 C:\ProgramData\Microsoft\Group Policy\History\\Machine\Preferernces\Applied-Object\Applied-Object.xml。

但是,如果 GPOLink 的值为 GPLinkOrganizationalUnit,它将应用于域中的每个用户和计算机,并且 GPSVC 会将策略复制到本地用户可以访问的路径。 Windows 使用 %localappdata% 路径执行任务:

C:\Users\eran\AppData\Local\Microsoft\Group Policy\History\USER-SID\Preferences\Applied-Object\Applied-Object.xml。 Applied-Object\Applied-Object.xml 被组策略应用的对象替换。例如,打印机策略将被转换为 Printers\Printers.xml

我在上面提到 gpsvc 可以将所有文件系统操作视为 NT AUTHORITY\SYSTEM,这意味着,如果服务不是模拟本地用户(这里就是这种情况),我们可以进行符号链接攻击,以利用允许的目录 ACL。当我们尝试执行文件操作攻击时,我们需要检查特权组件是否引用了模拟本地用户的 API,可以是:

RpcImpersonateClient

ImpersonateLoggedOnUser

CoImpersonateClient

这些 API 大约有 12 种不同的调用,不包括对 SetTokenInformation 的调用。由此可以推断,对于开发者来说,理解仿真是多么重要。但是,每个代码路径都需要正确模拟,这就是问题所在。在本文的示例中,漏洞位于模块 gpprefcl.dll 中,该模块将组策略写入磁盘,然后加载到 ProcessGPOList 例程中。

如果我们查看gpprefcl.dll的导出表(部分副本),我们可以得到一个提示:

74 0002E450 生成GroupPolicyApplications

85 0002EE10 生成GroupPolicyDataSources

96 0002F080 生成GroupPolicyDevices

10 7 0002D820 生成GroupPolicyDrives

11 8 0002D5B0 生成GroupPolicyEnviron

12 9 0002DD00 生成GroupPolicyFiles

13 A 0002F2F0 GenerateGroupPolicyFolderOptions

14B 0002DA90 生成GroupPolicyFolders

15C 0002DF70 生成GroupPolicyIniFile

21 12 0002E6C0 生成GroupPolicyPrinters

22 13 0002FCB0 GenerateGroupPolicyRegionOptions

29 1A 0002EED0 ProcessGroupPolicyDataSources

30 1B 0002F140 ProcessGroupPolicyDevices

31 1C 0002D8E0 ProcessGroupPolicyDrives

32 1D 0002D670 ProcessGroupPolicyEnviron

33 1E 0002E5E0 ProcessGroupPolicyExApplications

34 1F 0002EFA0​​ ​​​ProcessGroupPolicyExDataSources

35 20 0002F210 ProcessGroupPolicyExDevices

36 21 0002D9B0 ProcessGroupPolicyExDrives

38 23 0002DE90 ProcessGroupPolicyExFiles

39 24 0002F480 ProcessGroupPolicyExFolderOptions

40 25 0002DC20 ProcessGroupPolicyExFolders

41 26 0002E100 ProcessGroupPolicyExIniFile

42 27 0002EAC0 ProcessGroupPolicyExInternet

43 28 0002F6F0 ProcessGroupPolicyExLocUsAndGroups

图片[1]-Windows计算机暴露给一个特权升级(EoP)漏洞类大约有60个-老王博客

54 33 0002DDC0 ProcessGroupPolicyFiles

55 34 0002F3B0 ProcessGroupPolicyFolderOptions

56 35 0002DB50 ProcessGroupPolicyFolders

59 38 0002F620 ProcessGroupPolicyLocUsAndGroups

1 39 000407E0 ProcessGroupPolicyMitigationOptions

60 3A 00030730 ProcessGroupPolicyNetShares

61 3B 0002F890 ProcessGroupPolicyNetworkOptions

62 3C 0002FB00 ProcessGroupPolicyPowerOptions

63 3D 0002E780 ProcessGroupPolicyPrinters

2 3E 00040AC0 ProcessGroupPolicyProcessMitigationOptions

67 42 00030250 ProcessGroupPolicyServices

68 43 0002EC60 ProcessGroupPolicyShortcuts

69 44 000304C0 ProcessGroupPolicyStartMenu

每个导出的函数行为相同,每个例程都返回 apmCse::PolicyMain

返回 apmCse::PolicyMain(

a1,

(__int6<​​@4)&`GetCseVersionPrinters'::`2'::s_wVersion,

(__int6<​​@4)L"GenerateGroupPolicyPrinters",

(__int6<​​@4)L"组策略打印机");

常规 PolicyMain() 的工作是实际应用 GPO,每个不同的“应用程序对象”根据方法的第三个参数具有不同的行为。后面会在内部动态调用中用到windows本地策略组,gpprefcl.dll中有66个导出的方法,几乎​​都是这样实现的,唯一的区别就是第三个和第四个参数。

除此之外,我们在 PolicyMain() 中有多个调用。其中,有一个初始化主对象apmCSE的调用,已经用25个不同的参数进行了初始化。

之后,我们调用apmCse::StartClient

!静默; x gpprefcl!apm*; !igrep “DeleteFile|WriteFile|textfile”

结果:

00007ffd`ba4355f8 gpprefcl!apmDeleteFile(long __cdeclapmDeleteFile(unsigned short const *))

00007ffd`ba4333cc gpprefcl!apmWriteTextFile (long __cdecl apmWriteTextFile(class apmString const &,unsigned short const *,bool))

00007ffd`ba4332b8 gpprefcl!apmWriteFile(long __cdecl apmWriteFile(unsigned char *,unsigned long,unsigned short const *,bool))

00007ffd`ba407d74 gpprefcl!apmConfigFile::deleteFiles (private: long __cdecl apmConfigFile::deleteFiles(unsigned short const *,bool))

00007ffd`ba434008 gpprefcl!apmDeleteFileSystemItem (long __cdecl apmDeleteFileSystemItem(unsigned short const *,unsigned short const *,struct _WIN32_FIND_DATAW *,bool,bool,bool,bool))

过滤结果后,可以在这些方法中设置断点,因为它们执行文件系统操作的概率很高,这可能使我们容易受到文件系统攻击。

输出看起来很有希望,每个例程似乎都在执行文件系统操作。除了在每个例程中放置断点外,我们还可以检查线程是否模拟了对 api 的调用。如果没有,我们就成功了。

事实证明,apmClientContext 类有一个 impersonateLoggedOnUser() 的包装函数,称为 apmClientContext::impersonate()。通过继续这条路径,我们应该在上述文件系统例程中检查对 apmClientContext::impersonate() 的引用。

在许多情况下,现在应该在 gpprefcl.dll 模块中按原样使用此模拟例程。但是,如果我们检查此例程的外部参照,我们看不到对上述例程的引用。我们需要更进一步,例如检查 gpprefcl! apmWriteFile() 及其调用者 gpprefcl! apmDeleteFile() 的调用例程:

apmClient::cseApplyGpoPolicies() apmClient::UpdateGph() gpprefcl!apmWriteFile()

apmClient::cseRemoveLastGpoPolicies() apmClient::PurgeGph() gpprefcl!apmDeleteFile()

上述方法都不会调用 apmClientContext::impersonate()。应用 GPO 的方法是 apmClient::cseApplyGpoPolicies() 和 apmClient::cseRemoveLastGpoPolicies()。当 Windbg 达到 gpprefcl! ApmWriteFile() 的断点,我是看调用栈才意识到的:

00 000000dd`d27fc3a8 00007ffd`ba3f413f gpprefcl!apmWriteFile01

000000dd`d27fc3b0 00007ffd`ba3f2867 gpprefcl!apmClient::UpdateGph+0x13702

000000dd`d27fc490 00007ffd`ba3f54ee

gpprefcl!apmClient::cseApplyGpoPolicies+0x2a703 000000dd`d27fc5a0

00007ffd`ba3f3e3a gpprefcl!apmClient::processGpoLists+0x4ca04

000000dd`d27fc710 00007ffd`ba41d49a gpprefcl!apmClient::Main+0x1a05

000000dd`d27fc740 00007ffd`ba41d310

gpprefcl!apmCse::StartClient+0xee06 000000dd`d27fdc00

00007ffd`ba41e911 gpprefcl!apmCse::PolicyMain+0x25007

000000dd`d27fdf40 00007ffd`c9c89ce2

gpprefcl!ProcessGroupPolicyExPrinters+0xc108 000000dd`d27fe010

00007ffd`c9c50b25 gpsvc!ProcessGPOList+0x88209 000000dd`d27fe3d0

00007ffd`c9c5caf5 gpsvc!ProcessGPOs+0x227c5

唯一剩下的就是漏洞利用了。

剥削

流程如下:

1. 在 C:\Users\user\AppData\Local\Microsoft\Group Policy\History\ 中列出您的组策略 GUID;

2. 如果您有多个 GUID,请检查最近更新的目录;

3.进入目录,进入子目录,即用户SID;

4. 查看最新修改的目录;这取决于您的环境。就我而言,它是打印机;

5.删除打印机目录下的xml文件;

6. 创建一个指向 \RPC Control 的 NTFS 挂载点和一个带有 xml 的对象管理器符号链接到 C:\Windows\System32\whatever.dll。

7. 打开你喜欢的终端并运行 gpupdate;

在任意位置任意创建,也可以利用这个漏洞来删除和修改系统保护的文件。根据您的 GPO 对象(打印机、设备、驱动器),漏洞利用会略有不同。

总结

组策略的体系结构很复杂,Windows 支持许多旧代码和自定义选项,包括不同的 GPOLink 类型,尽管在几乎所有代码路径中都多次调用线程仿真 API,但这些选项仍然缺失。当您将策略应用于组织单位时,服务将 GPO 写入磁盘就是这种情况。

此漏洞机制的存在意味着如果不更新数百万 Windows 计算机可能会受到影响,但未来微软可能会提供需要管理员权限来创建连接\挂载点的缓解措施,这将完全保护文件系统免受攻击.

© 版权声明
THE END
喜欢就支持一下吧
点赞0
分享
评论 抢沙发

请登录后发表评论