windows密码获取凭证(微软)

一,Windows HASH

hash

Hash,一般翻译做散列、杂凑,或音译为哈希,是把任意长度的输入(又叫做预映射pre-image)通过散列算法变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来确定唯一的输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。

windows HASH简介

Windows 加密过的密码口令,我们称之为 hash

Windows 系统使用两种方法对用户的密码进行哈希处理,它们分别是 LAN Manager(LM) 哈希和 NT

LAN Manager(NTLM) 哈希。

现在已经有了更新的 NTLMv2 以及 Kerberos 验证体系。

二,Windows认证基础

Windows的认证包括三个部分:

本地认证:用户直接操作计算机登录账户

网络认证:远程连接到工作组中的某个设备

域认证:登陆到域环境中的某个设备

Windows本地认证

  1. 用户输入密码
  2. 系统收到密码后将用户输入的密码计算成NTLM Hash
  3. 与sam数据库(%SystemRoot%\system32\config\sam)中该用户的哈希比对
  4. 匹配则登陆成功,不匹配则登陆失败
    Windows本地认证采用sam hash比对的形式来判断用户密码是否正确,计算机本地用户的所有密码被加密存储在%SystemRoot%\system32\config\sam文件中,当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的密码进行比对,如果相同,证明认证成功.

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")
posted @ 2022-12-21 08:38  克隆窝  阅读(184)  评论(0编辑  收藏  举报