windows认证之本地认证

登录过程

基础知识

Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。

LSASS用于微软Windows系统的安全机制,也是由很多组件组成的,其中一部分组件提供了身份认证的组件。

登录流程:

在登陆Windows操作系统时 winlogon.exe 会提示我们需要输入用户名和密码才能进入系统,winlogon.exe会将我们输入的内容发送给 lsass.exe ,此程序会将明文密码计算后得到的NT Hash 并去SAM( %SystemRoot%\system32\config\sam )数据库中进行查找, Windows本身不保存明文密码,只保留密码的Hash或加密密码。

  1. winlogon.exe程序运行。
  2. 用户输入密码
  3. lsass.exe
  4. 转化成NTLM HASH与sam文件对比
  5. 如果相同,则将user SID与 group SID发送给winlogon.exe,成功登录。

Windows Hash

LM HASH

Windows使用的最古老的密码存储,很容易破解,从Windows Vista和Windows Server 2008开始,LM已关闭(可以在SAM或者NTDS中找到它)。

生成规则

  1. 密码最多14个字符,如123456
  2. 密码转化为大写
  3. 转换为16进制字符串后,结果为313233343536
  4. 不足14字节采用0进行补全,补全结果为3132333435360000000000000000
  5. 分成两个7bytes部分,为31323334353600和00000000000000
  6. 先把31323334353600转换为比特流,比特流为110001001100100011001100110100001101010011011000000000 ,长度不足56bit使用0在左边补齐长度,补齐后为00110001001100100011001100110100001101010011011000000000
  7. 再分7bit为一组末尾加0,组成新的编码
  8. 对应的8字节16进制编码:30988C6692C8D000 (二进制直接转16进制结果)
  9. 将以上步骤得到的两组16进制字符串分别进行DES的ECB模式加密,key为魔术字符串 “KGS!@#$%”进行加密

可以发现,其最大长度为14,而且key值是一个固定值KGS!@#$%,所以容易被暴力破解,而且通过LM hash的生成机制,还能很清楚的看出来如果密码是否大于等于7位,因为当位数不足时,后面会用0来补全,所以当我们的密码位数小于7时,最终生成的LM hash的末尾字符是一个恒定不变的值:AA-D3-B4-35-B5-14-04-EE

NTLM HASH (NT LAN Manager)

通常是指Windows系统下Security Account Manager中保存的用户密码hash。这类Hash可以直接用于PtH,并且通常存在于lsass进程中,便于SSP使用。由数字与字母组合的32位的值。

加密流程

先后经过hex–>unicode–>md4加密便可得到NTLM HASH,依照该流程,可写如下脚本:

1
2
3
4
5
# NTLM hash
import hashlib
import binascii
hash = hashlib.new('md4', "lingwu".encode('utf-16le')).digest()
print(binascii.hexlify(hash))