域渗透基础知识(五)之OU组织单位、ACL、SeEnableDelegationPrivilege特权
目录
ACL(Access Control List)访问控制列表
寻找域中分配了SeEnableDelegationPrivilege的用户
指定用户添加SeEnableDelegationPrivilege
OU组织单位
OU,即组织单位(Organization Unit),是一个容器对象,将域中的对象组织成逻辑组,帮助网络管理员简化管理组。组织单位包含下列类型的对象:用户,计算机,工作组,打印机,安全策略以及其他组织单位等。可以在组织单位基础上部署组策略,统一管理组织单位中的域对象。 在企业域环境里面,我们经常可以看到按照部门划分的一个个 OU,如下图所示:
OU 与容器的区别
组织单位(OU)是专用容器,与常规容器的区别在于管理员可以将组策略应用于 OU,然后系统将其下推到 OU 中的所有计算机,但是你不能将组策略应用于容器。这也是 OU 与容器主要的区别。需要注意的是Domain Computers
是一个普通容器,而Domain Controllers
是一个 OU,因此可以可以将组策略应该于Domain Controllers
,而不可以将组策略应用于Domain Computers
。注意这里所说的Domain Computers
和Domain Controllers
特指根域的,而不是User
容器底下的那两个组:
OU跟组的区别
组织单位跟组是两个完全不同的概念。很多人经常会把这两个弄混。组是权限的集合。OU是管理对象的集合。举个前面举过的例子,运维需要对公司的网络进行管理,需要一些特殊的管理权限,我们就可以设置个组,对组配置权限。然后将运维拉近组里面,组里面的运维就拥有了该权限。比如我们需要对财务部里面的用户进行统一管理,那我们可以设置个OU,然后把财务部的用户拉近这个OU,这样就可以进行集中管理,比如说下发组策略。说通俗点,组是管理的集合,OU是被管理的集合。
组织单位的创建
在域控制器的 “管理工具” —> “Active Directory 用户和计算机”,选中你的域名后 “右键” —> “新建” —> “组织单位”:
填入需要创建的组织单位的名称后点击确定:
如下图所示,成功创建了一个名为 “行政部” 的组织单位:
向 OU 中添加对象
我们可以向新创建的 OU 中添加管理对象,比如用户,计算机,工作组,打印机等。选中你当创建的组织单位,然后 “右键” —> “新建”:
然后选择相应类型的对象即可。如下,我们向 “行政部” 这个组织单位中添加了一台计算机:
OU委派
考虑这样一种需求,如果我们想允许某个用户把其他用户拉入OU,而不赋予这个用户域管权限,我们可以在这个OU给这个用户委派 添加成员的权限。组织单位的委派其实就是赋予某个域内用户对OU的某些管理权限。这些权限体现在ACL里面。
右键 OU——>委派控制:
OU查询
所有的OU都是`organizationalUnit`类的实例,因此我们可以用`(objectClass=organizationalUnit)`或者`(objectCategory=organizationalUnit)`来过滤OU。
adfind.exe -s subtree -b dc=xie,dc=com -f "(objectClass=organizationalUnit)" -dn
或
adfind.exe -s subtree -b dc=xie,dc=com -f "(objectCategory=organizationalUnit)" -dn
要要查询OU里面的账户,可以指定BaseDN为OU就行
adfind.exe -s subtree -b "OU=技术部,DC=xie,DC=com" -dn
ACL(Access Control List)访问控制列表
Windows访问控制模型
简单来说,访问控制是指某 主体(subject) 允许或不被允许对某 实体(object) 执行读取、写入、删除、更改等操作。在Windows中,主体subject通常是进程;实体object通常指安全对象(securable object),可能是:
文件
目录
管道
服务
进程
Active Directory对象
注册表
打印机
共享等
访问控制即对访问行为是否具有合法权限进行判定并执行相应的策略,而访问行为实际上就是主体subject访问实体object的过程。Windows操作系统会为访问行为的主体(subject)创建访问令牌(Access Token),且当访问行为的实体(object)被创建时操作系统会为其创建一个安全描述符(Security Descriptor),ACL对权限的访问控制正是通过访问令牌和安全描述符来完成的。
Windows访问控制模型由如下两个部分组成:
访问令牌(Access Token):其中包含有关登录用户的信息。当用户登录时,系统会验证用户的帐户名称和密码。如果登录成功,系统将创建一个访问令牌。代表此用户执行的每个进程都将具有此访问令牌的副本。访问令牌包含安全标识符SID(Security Identifiers) ,用于标识用户的帐户和用户所属的所有组帐户。令牌还包含用户或用户组所持有的特权列表。当进程试图访问安全对象或执行需要特权的系统管理任务时,系统使用此访问令牌来标识关联用户。
安全描述符(Security Descriptor):包含保护安全对象的安全信息。当创建安全对象时,系统会为其分配一个安全描述符,安全描述符包含了该对象的属主对该对象所配置的一些安全属性和策略,安全描述符由4部分组成:
1. SID(Security Identifiers):标识该对象拥有的SID
2. DACL(Discretionary Access Control List):DACL定义对象的访问控制策略(允许或拒绝访问),DACL的ACE定义了哪些用户(组)对该对象具有怎样的访问权限,当请求访问该对象时,系统检查请求方的SID与对象DACL中的ACE配置策略,根据找到的ACE配置策略授予访问或拒绝访问。如果该对象没有设置DACL,系统默认允许所有访问操作,如果对象配置了DACL但是没有配置ACE条目,系统将拒绝所以访问操作;如果系统配置了DACL和ACE,系统将按顺序检查ACE,直到找到一个或多个允许所有请求访问权限的ACE,或者直到任何请求的访问权限被拒绝为止。3. SACL(System Access Control List):SACL定义对象的访问行为记录策略,SACL的ACE定义了对哪些用户(组)的哪些访问行为进行日志记录,例如对指定用户的访问成功、失败行为进行审计记录日志。
4. Flag:其他标志位信息
ACE
ACL访问控制列表由一系列访问控制实体(ACE,Access Control Entries)组成,每个ACE可以看作是配置的一条访问策略。每个ACE指定了一组访问权限,并包含一个SID,该ID标识了允许、拒绝或审计这些权利的委托人。委托人可以是用户帐户、群组帐户或_登录会话_。
可以把一条ACE归纳为四个方面:
1. 谁对你有权限
2. 有什么权限
3. 是允许权限还是拒绝权限
4. 这个权限能不能被继承
ACL的判断流程
ACL的解析流程如下:
1.明确定义的Deny ACE
2.明确定义的Allow ACE
3.继承的Deny ACE
4.继承的Allow ACE
当每条ACE都没匹配上的时候,是拒绝访问的。值得注意的是,这里有两种情况:
1. 有DACL,但是ACE条目的数量为0,这种情况是不允许任何用户访问的
2.没有DACL的情况,这种情况是允许任何用户访问的
我们接下来举个例子来说明:
主体subjectA:
sid=100
groupsid=110
groupsid=120
主体subjectB:
sid=200
groupsid=210
groupsid=220
主体subjectC:
sid=300
groupsid=310
groupsid=320
安全对象实体ObjectD:
ACE:拒绝sid=200的对象访问
ACE:允许sid=100和sid=210的对象访问
当主体subjectA访问安全对象实体ObjectD时,首先匹配第一条拒绝sid=200的访问,没匹配上,然后匹配第二条允许sid=100和sid=210的对象访问,匹配上了,所以允许主体A访问。
当主体subjectB访问安全对象实体ObjectD时,首先匹配第一条拒绝sid=200的访问,匹配上,拒绝主体A对D的访问。即使第二条ACE允许了sid=210的对象访问匹配上了,但是因为拒绝的ACE优先级大于允许的ACE,所以最后还是拒绝主体B访问。
当主体subjectC访问安全对象实体时,第一条ACE和第二条ACE都没匹配上,所以拒绝主体C访问。
SeEnableDelegationPrivilege权限
SeEnableDelegationPrivilege权限的作用是配置约束性委派。拥有SeEnableDelegationPrivilege权限的人可以配置任意一台主机的约束性委派,但这个权限一般情况下只有域控才有,如果在渗透过程中控制一个拥有SeEnableDelegationPrivilege权限的账户,那基本约等于控制了整个域。
寻找域中分配了SeEnableDelegationPrivilege的用户
GPO
域上一般默认有两个GPO:Default Domain Policy和Default Domain Controllers Policy,这只是他们显示的名称,他们实际名称为它们的GUID,分别为:{31B2F340-016D-11D2-945F-00C04FB984F9}和{6AC1786C-016F-11D2-945F-00C04fB984F9}
1.可以通过powerview枚举域中的所有GPO:
Get-DomainGPO
查找指定GPO:
Get-DomainGPO -Identity "Default Domain Controllers Policy"
2.其中gpcfilesyspath为该GPO策略文件的位置:
我们可以通过GPO为Default Domain Controllers Policy的GptTmpl.inf文件来寻找域中哪些用户(组)分配了SeEnableDelegationPrivilege。
GptTmpl.inf文件位于\\<domain>\SYSVOL\<domain>\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf
3.
Get-DomainPolicy -Source DC #第一条命令得到gpcfilesyspath的值
4.
type "\\test.local\SYSVOL\test.local\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf" #用第二条命令读gpcfilesyspath所指定的文件,查看SeEnableDelegationPrivilege对应的值
5.
"S-1-5-32-544"|Convert-SidToName #确定sid后跟第一步使用"S-1-5-32-544"|Convert-SidToName来获取sid对应的用户
secedit
还可以通过secedit来查看,和GPO一个道理
注: secedit为组策略的命令行版本
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS
参数:
/export
:导出组策略
/cfg
:指定安全模板的路径和名称
/areas
:指定允许系统的安全区域,我们这里是USER_RIGHTS
:指定登录用户的权限和允许特权
获得SeEnableDelegationPrivilege对应的值:
确定sid后跟GPO一样使用"S-1-5-32-544"|Convert-SidToName来获取sid对应的用户:
"S-1-5-32-544"|Convert-SidToName
指定用户添加SeEnableDelegationPrivilege
默认情况下,只有BUILTIN\Administrators的成员(即Domain Admins/Enterprise Admins/etc)拥有SeEnableDelegationPrivilege权限,普通用户是没有此权限的,所有下面将列举给普通用户添加SeEnableDelegationPrivilege权限的方法。
GPO
通过修改{6AC1786C-016F-11D2-945F-00C04fB984F9}
的GptTmpl.inf
文件就可以给指定用户添加SeEnableDelegationPrivilege
权限。
将用户SID或用户名添加到[Privilege Rights]
下的SeEnableDelegationPrivilege
中,当DC重启或者刷新其组策略时,该设置就会生效。
添加之后刷新组策略让其设置生效:
gpupdate /force
使用powerview验证是否成功添加:
$p = Get-DomainPolicy -Source DC
$p.PrivilegeRights
"S-1-5-21-662417213-3583657854-423750704-1001" |Convert-SidToName
secedit
导出配置文件:
secedit /export /cfg secpolicy.inf /areas USER_RIGHTS
导出之后,在[Privilege Rights]项下的SeEnableDelegationPrivilege添加用户的SID或者用户名:
将修改之后的配置覆盖掉当前设置:
secedit /configure /db secedit.sdb /cfg secpolicy.inf /overwrite /areas USER_RIGHTS