如何滥用 GPO 攻击活动目录 Part 2

正文

在我们真正开始修改GPO之前,我们需要尝试理解一些关于它们是如何在GPMC和AD中正常更新的复杂问题。因为请相信我,事情并没有看上去那么简单。

当你首先创建一个GPO并命名它,然后查看它的“Details”选项卡时,你会看到它有以下User和Computer版本字段:# (AD), # (SYSVOL)。

对于每个GPO,在硬盘的C:WindowsSYSVOLdomainPolicies<guid>上,也有相应的路径(称为组策略模板(Group Policy Template))。对于这个GPO,它会是C:WindowsSYSVOLdomainPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}。对于域成员,你还可以通过它的网络共享访问SYSVOL,例如,\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}

在GPT中,有一个Machine和User目录以及一个GPT.INI文件。

PS > ls "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}"


    Directory: \testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}


Mode                LastWriteTime         Length Name
----                -------------         ------ ----
d-----       13/01/2019     11:13                Machine
d-----       13/01/2019     11:13                User
-a----       13/01/2019     11:13             59 GPT.INI

很明显,Computer策略被放入Machine中而User策略被放在User中。

GPT.INI是一个非常简单的文件,它包含:

PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=0
displayName=New Group Policy Object

请注意,displayName参数不会改变¯_(ツ)_/¯

如果我们对GPO进行一些修改并刷新GPMC,我们可以看到Computer的AD和SYSVOL编号已经增大了。

每次修改后,它们似乎都在增大,但是由于GPMC在后台做了一些不可见的操作,除非你使用Process Monitor之类的方法进行监视,所以看起来很小的改动会导致很大的变化。

AD和SYSVOL值存储在不同的地方,但是理解它们非常重要。

SYSVOL保存在GPT.INI文件中。如果我们再次查看,就会发现版本已经变了。

PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=12
displayName=New Group Policy Object

如果你有一个同时应用Computer和User策略的GPO,它会变得更加复杂,因为GPT.INI的数字格式会发生变化。

PS > cat "\testlab.localSYSVOLtestlab.localPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}GPT.INI"
[General]
Version=65548
displayName=New Group Policy Object

version = [user verion][computer version],其中每个值都为16位。

要“翻译”它们,我们首先将十进制转换为十六进制。用科学模式的计算器,结果是1000C。但是因为它们是16位数字,所以实际上是0001000C,因为计算器不显示前导零。

所以0001是1,000C是12。

AD编号保存为AD中组策略对象的属性。可以通过Powerview查看它,如下所示:

PS > Get-DomainGPO -Identity "Test GPO" -Properties VersionNumber

versionnumber
-------------
       65548

它使用完全相同的格式。

在GPMC中修改GPO时,它将更新SYSVOL中的相应文件,更新GPT.INI中的值,然后更新它在AD中的versionnumber属性。

要修改不带GPMC的GPO,必须进入SYSVOL并手动修改文件。例如:如果我们想使用Restricted Groups部署一些新的本地管理员,我们必须修改C:WindowsSYSVOLdomainPolicies{F3003ADC-17E3-4FBE-A11E-6A41779ADD6E}MachineMicrosoftWindows NTSecEditGptTmpl.inf

更新文件而不增加AD或SYSVOL版本号的限制是:

  1. 客户端不会自动提取修改,因为他们认为自己已经拥有了最新的配置(除非存在代码执行,并且可以执行gpupdate /force)。
  2. 这些修改不会在域控制器之间复制。

要使所有客户端能够将修改作为其常规组策略更新计划的一部分,必须手动增加AD和SYSVOL版本号。

这对于GPT.INI来说很容易,因为它只是一个文本文件。versionnumber属性可以通过Powerview更新:

PS > Get-DomainGPO -Identity "Test GPO" | Set-DomainObject -Set @{'versionnumber'='1337'}
PS > Get-DomainGPO -Identity "Test GPO" -Properties VersionNumber

versionnumber
-------------
         1337

必须始终保持两个值相同,否则会导致AD / SYSVOL Version Mismatch错误。

上一篇:安全攻防信息不对等挑战加剧 金融行业如何高效进行态势感知

下一篇:“安全+”沙龙第十四期在上海成功举办/1月4日