Windows密码凭证获取
1.Windows HASH
(1)什么是HASH
散列(Hash):是一种将任意长度的输入(或称消息)通过散列算法变换成固定长度的输出的方法。这种输出
通常被称为散列值或消息摘要。
散列函数具有以下几个特性:
1.确定性:相同的输入总是产生相同的输出。
2.压缩性:输出的长度固定,通常远小于输入的长度。
3.单向性:从输出很难(或不可行)推导出原始输入。
4.抗碰撞性:不同的输入产生相同输出的概率极低。
(2)Windows HASH简介
Windows Hash是指在Windows操作系统中,用户密码通过特定的加密算法生成的散列值。
Windows系统主要使用以下两种哈希算法:
1.LANManager(LM)哈希:一种较老的算法,安全性较低,容易受到暴力破解攻击。
2.NTLAN Manager (NTLM)哈希:较新的算法,安全性较高,是Windows系统中更为常用的密码哈希方式。
随着技术的发展,NTLMv2和Kerberos验证体系也逐渐被采用,提供了更高的安全性。
·LM哈希:密码最大长度为14个字符,超过14位的密码使用NTLM哈希。
·NTLM哈希:支持更长的密码,并提供更高的安全性。
(3)HASH格式
格式:
以冒号:分段,严格对应规则:用户名:RID:LM-HASH:NTLM-HASH:::
test:1003:E52CAC67419A9A22664345140A852F61:67A54E1C9058FCA16498061B96863248:::
AAD3B435B51404EEAAD3B435B51404EE
1、代表空密码
LM 哈希对空密码加密后,结果固定就是上面这串字符;抓取 SAM 看到该 LM 哈希,可直接判定该账号无登录密码。
2、系统禁用 LM 哈希
Win Vista 及之后系统(Win7/10/11、Server2008+)默认不再生成、存储 LM 哈希,此时导出的 LM 字段就会填充这个固定占位字符串,不是密码为空,只是系统弃用了老旧 LM 加密算法
(4)LM-HASH介绍
生成原理:

步骤 1:明文统一大写
明文:PASSWORD大写不变:PASSWORD字符数:8 个 ASCII 字符,8 字节,小于 14 字节,需要补 0。
步骤 2:ASCII 转十六进制,末尾补 0 至 14 字节
逐个字符查 ASCII 十六进制:
plaintext
P:0x50 A:0x41 S:0x53 S:0x53
W:0x57 O:0x4F R:0x52 D:0x44
原始 8 字节 HEX 串:50 41 53 53 57 4F 52 44
末尾填充 6 个 0x00 补齐到 14 字节:完整 14 字节:50415353574F52 44000000000000
步骤 3:14 字节切分成两个独立 7 字节分组
分组 A(前 7 字节):50 41 53 53 57 4F 52分组 B(后 7 字节):44 00 00 00 00 00 00
LM 致命缺陷:两组完全分开加密,可分开爆破。
步骤 4:每组 7 字节转为连续 56bit 二进制流
1 字节 = 8bit,7 字节 = 56bit,无需额外补位;把每组 16 进制逐字节翻译成 0/1 比特串。
以分组 A 50415353574F52 为例:每个字节展开 8 位二进制,拼接成一条连续 56 位比特流。
步骤 5:56bit → 64bit DES 合法密钥(插入奇校验位)
DES 规定:
- 每连续 7 个有效 bit 为 1 小组;
- 每组后面追加1 位奇校验位:该组 7 个 bit 里
1总数为偶数则校验位 = 1,奇数则校验位 = 0; - 56bit = 8 组 × 7bit;每组加 1 校验位,得到 8×8=64bit。
操作细节:
- 把 56bit 长串依次切成 8 段,每段 7bit;
- 每段独立计算奇校验位,拼在该段末尾;
- 8 段各自变成 8bit,依次拼接得到完整 64bit DES 密钥;
- 64bit 二进制转回 16 进制,得到 8 字节 DES 密钥。
本例结果:分组 A 扩展后 DES 密钥(8 字节 HEX):50 20 54 6a 34 ba 3c a4分组 B 同理做一模一样的校验扩展,得到第二组独立 8 字节 DES 密钥。
步骤 6:两组密钥分别 DES 加密固定常量串
LM 内置固定加密明文:KGS!@#$%
- 用【分组 A 扩展出的 64bit 密钥】对
KGS!@#$%执行 DES 加密,得到 8 字节密文 C1; - 用【分组 B 扩展出的 64bit 密钥】对
KGS!@#$%执行 DES 加密,得到 8 字节密文 C2。
步骤 7:两段密文直接拼接,得到最终 LM-Hash
C1(8 字节) + C2(8 字节) = 16 字节 = 32 位十六进制字符串这串字符就是最终导出 SAM 时看到的 LM-HASH 值。
使用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")
(5)HTLM-HASH介绍
NT LAN Manager(NTLM) 哈希是Windows系统认可的另一种算法,用于替代古老的LM-Hash,一般指 Windows系统下 Security Account Manager(SAM) 中保存的用户密码hash,在 Windows Vista/Windows 7/Windows Server 2008 以及后面的系统中,NTLM哈希算法默认启用。
# 假设用户密码为:123456
1. 首先将密码字符串转化为十进制ASCII字符串
字 符: 1 2 3 4 5 6
ASCII: 49 50 51 52 53 54
2. 十进制ASCII字符串再转换为十六进制字符串
十进制: 49 50 51 52 53 54
十六进制: 31 32 33 34 35 36
3. 十六进制字符串再转化为Unicode字符串
31 32 33 34 35 36 -> 310032003300340035003600
4. 使用MD4摘要算法对Unicode字符串进行Hash计算
310032003300340035003600 -> 32ed87bdb5fdc5e9cba88547376818d4
5. 产生一个16字节的值,即NTLM-HASH
32ed87bdb5fdc5e9cba88547376818d4
python3 -c "import
hashlib,binascii;print(binascii.hexlify(hashlib.new('md4','123456'.encode('utf
16le')).digest()).decode())"
2.Windows认证基础
Windows的认证包括三个部分:
本地认证:用户直接操作计算机登录账户
网络认证:远程连接到工作组中的某个设备
域认证:登陆到域环境中的某个设备
(1)Windows本地认证
- 用户输入密码:通过 winlogon.exe 进行用户界面交互。
- 密码处理:系统接收到密码后,由 lsass.exe 进程处理,将密码计算成 NTLM Hash。
- 哈希比对:计算得到的 NTLM Hash 与存储在 SAM 数据库(% SystemRoot%\system32\config\sam)中的哈希值进行比对。
- 登录结果:如果哈希值匹配,则登录成功;否则登录失败。
在本地认证中,lsass.exe 进程负责处理用户输入的密码,并将其转换为 NTLM Hash 用于比对。使用如 mimikatz 等工具可以读取 lsass.exe 进程中的明文密码。
winlogon 是用来管理用户登录和登出lsass 是用于本地安全和登陆策略
(2)网络认证
网络认证即在工作组环境下远程登陆另一台电脑所采用的认证机制 NTLM 协议的认证过程分为三步,也叫挑战相应机制:
1. 协商
双方确定使用的协议版本, NTLM 存在V1和V2两个版本,即 hash ,具体区别就是加密方式不同 在 NTLM 认证中, 同格式的 NTLM 响应分为 Challenge 和加密算法 Net NTLM v1 hash 、 Net NTLM v2 NTLM v1 , NTLMv2 , NTLM session v2 三种协议,不同协议使用不
2. 质询 挑战(Chalenge)/ 响应(Response)认证机制的核心
1. 客户端向服务器端发送用户信息(用户名)请求
2. 服务器接受到请求后,判断本地用户列表是否存在客户端发送的用户名,如果没有返回认证失败, 如果有,生成一个16位的随机数,被称之为" Challenge ", 然后使用登录用户名对应的 NTLM Hash 加密Challenge(16位随机字符), 生成 后,将 Challenge1 保存在内存中。同时,生成 Challenge1 Challenge (16位随机字符)明文发送给客户端。
3. 客户端接受到 Challenge 后,使用自己提供的账户的密码转换成对应的 NTLM Hash ,然后使用这 个NTLM Hash加密 Challenge 生成 Response ,然后将
3. 验证
在质询完成后,验证结果,是认证的最后一步。 服务端收到客户端发送的 Response 发送至服务器端。 Response 后,与之前保存在内存中的 Channelge1 比较,如果相等认证通过 其中,经过 NTLM Hash 加密 Challenge 的结果在网络协议中称之为 行哈希传递攻击,但可以通过暴力破解来获取明文密码) 其中的关键点在于:第二步中客户端发送的是 Net NTLM Hash (不能直接用来进 NTLM 哈希值与随机字符串加密的结果,而这个 希是由用户输入的密码本地计算得出的,所以在这个步骤中,只要能提供正确的 NTLM 哈 NTLM 哈希即使不知道 正确的密码也可通过认证

(3)Net-NTLM-Hash 破解
Net-NTLM-Hash 是在 NTLM 认证过程中,客户端使用其密码生成的 NTLM 哈希对服务端提供的 Challenge 进行加密后的结果。这种哈希虽然不能直接用于哈希传递攻击(Pass The Hash,PTH),但攻击者可以通过暴力破解尝试恢复原始密码。
格式:
username::domain:challenge:HMAC-MD5:blob
破解方法:
hashcat -m 5600 net-ntlm-hash /tmp/password.list -o found.txt --force
-m 5600:指定 hashcat 使用的哈希类型为 Net-NTLMv2。
-a 0:指定攻击模式为直接(dictionary attack)。
net-ntlm-hash:输入捕获的 Net-NTLM Hash。
/tmp/password.dict:指定包含密码的字典文件。
-o found.txt:指定破解成功后输出的文件
(4)Pass-The-Hash 攻击
1.PTH 攻击简介
- Pass-The-Hash(PTH),哈希传递攻击
- PTH 攻击利用了 NTLM 认证协议中的一个特性,即允许使用用户的密码哈希值进行认证,而不需要实际的密码。
2.PTH 攻击的关键步骤
- 获取 NTLM 哈希:攻击者首先需要获取目标用户的 NTLM 哈希值。这可以通过网络嗅探、利用系统漏洞或使用工具(如 Mimikatz)从本地系统提取。
- 模拟认证请求:攻击者使用获取的 NTLM 哈希值,模拟正常的用户认证请求,向目标系统发送认证请求。
- 建立会话:如果认证请求被接受,攻击者可以建立一个网络会话,执行远程命令或访问网络资源。
3.PTH 与 Windows 网络认证的关系
- 利用 NTLM 认证机制:PTH 攻击主要利用了 NTLM 认证协议的特性。在 NTLM 认证过程中,客户端和服务器通过交换加密的挑战和响应来验证用户身份。攻击者可以通过传递 NTLM 哈希值来绕过密码验证。
- 挑战 - 响应机制:在 NTLM 认证中,服务器生成一个随机的挑战(Challenge),客户端使用其密码哈希加密这个挑战,并将加密后的响应发送回服务器。PTH 攻击中,攻击者使用获取的 NTLM 哈希值来生成响应,从而绕过
openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构
更多推荐
所有评论(0)