说明
这俩Hash算法着重记录一下,因为SAM数据库中存储的信息就包含这俩,示例条目内容如下:
Administrator:500:AAD3B435B51404EEAAD3B435B51404EE:31D6CFE0D16AE931B73C59D7E0C089C0:::
AAD3B435B51404EEAAD3B435B51404EE
: LM Hash(空密码)31D6CFE0D16AE931B73C59D7E0C089C0
: NTLM Hash(空密码)
LM Hash
LM Hash(LAN Manager Hash)是Windows NT之前的版本中引入的的一种密码哈希算法。
计算过程
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。(28个16进制字符)。
- 密码的16进制字符串分成两个7字节(14个16进制字符)的部分。每个部分都会转换为比特流(二进制流如
0101
),长度为56位。如果比特流长度不足56位,则在左边使用0进行补齐。 - 将每个比特流分成8组,每组7位,并在每组的末尾添加一个0,形成8组长度为8位的比特流。
- 对上述步骤得到的两组比特流分别使用密钥"
KGS!@#$%
"进行DES加密。 - 最后将两组加密后的比特流拼接在一起,得到最终的LM Hash值。
from passlib.hash import lmhash
password = "123456"
lm_hash = lmhash.encrypt(password)
print("LM Hash: " + lm_hash) # 44efce164ab921caaad3b435b51404ee
安全问题
- 密码最多支持14个字符,并且将密码转换为大写形式,限制了密码的复杂性和强度。
- 使用固定的密钥"
KGS!@#$%
"进行DES加密,如果hash后16位是aad3b435b51404ee
,那么就说明明文长度小于等于7。 - DES密钥长度较短(56位),容易受到暴力破解和彩虹表攻击
NTLM Hash
NTLM Hash(NT LAN Manager Hash)是在Windows NT 操作系统中引入的,它是LM Hash的改进版本。
对比如下:
可见从Vista后,默认情况下不存储LM Hash,只存储NTLM Hash。这也是为什么后期我们抓到的LM Hash都是AAD3B435B51404EEAAD3B435B51404EE
(空密码)。
一些工具强制要求LM Hash: NTLM Hash
的格式,我们可以把LM Hash
部分全写成0,如00000000000000000000000000000000:31D6CFE0D16AE931B73C59D7E0C089C0
计算过程
- 将密码转换为十六进制
- 对结果进行unicode编码(即每个字节之后添加
0x00
) - 使用MD4摘要算法对Unicode编码数据进行Hash计算
python2 -c 'import hashlib,binascii; print binascii.hexlify(hashlib.new("md4", "admin".encode("utf-16le")).digest())'
# 1. admin => 61646D696E
# 2. 61646D696E => 610064006D0069006E00
# 3. 610064006D0069006E00 => 209c6174da490caeb422f3fa5a7ae634