我们知道平常的Web系统有注册、登录是依赖数据库和后端的加密解密算法。那么Windows系统登录的时候是如何进行身份验证的呢,是否也有一个类似数据库的东西,或者就是一个单纯的文本呢?
- 为什么有这篇文章呢,因为我们知道平常的Web系统有注册、登录是依赖数据库和后端的加密解密算法。那么Windows系统登录的时候是如何进行身份验证的呢,是否也有一个类似数据库的东西,或者就是一个单纯的文本呢?
- 参考--Windows内网协议学习NTLM篇之NTLM基础介绍
- Windows也有一个类似于数据的东西,存放在
%SystemRoot%\system32\config\sam
,里面存放着用户的凭证信息,当然这肯定不是明文,不然Windows这么写也太不安全了。这里的加密算法不同于常见的MD5,加密后的数据有两种分别为LM Hash
和NTLM Hash
。
LM Hash
- LM Hash全称
LAN Manager Hash
,由IBM设计一般用于Windows XP
、Windows 2000
、Windows 2003
这一类系统中。加密算法如下。
- 密码长度不能超过14个字符。
- 密码转换为大写,再转换成16进制的字符串,没有28位长度的,在右边加0。
- 再将十六进制的字符串分为两组14位的字符串。
- 再将这两组14位的字符串进行十六进制转二进制,转换完成后不满足56位的在左边加0。
- 两部分分别划分为每组七位,在其末尾加0,再分别转换为十六进制。
- 最后将这两组数据作为DES加密所需的Key,
KGS!@#$%
作为需加密的字符,将DES加密后的数据依次拼接。
- 这里借用zjun的脚本。
| import binascii |
| import codecs |
| from pyDes import * |
| |
| def DesEncrypt(str, Key): |
| k = des(Key, ECB, pad=None) |
| EncryptStr = k.encrypt(str) |
| return binascii.b2a_hex(EncryptStr) |
| |
| def ZeroPadding(str): |
| b = [] |
| l = len(str) |
| num = 0 |
| for n in range(l): |
| if (num < 8) and n % 7 == 0: |
| b.append(str[n:n + 7] + '0') |
| num = num + 1 |
| return ''.join(b) |
| |
| if __name__ == "__main__": |
| passwd = sys.argv[1] |
| print('你的输入是:', passwd) |
| print('转化为大写:', passwd.upper()) |
| |
| |
| passwd = codecs.encode(passwd.upper().encode(), 'hex_codec') |
| print('转为 hex:', passwd.decode()) |
| |
| |
| passwd_len = len(passwd) |
| if passwd_len < 28: |
| passwd = passwd.decode().ljust(28, '0') |
| print('补齐 28 位:', passwd) |
| |
| |
| PartOne = passwd[0:14] |
| PartTwo = passwd[14:] |
| print('两组 14 位的部分:', PartOne, PartTwo) |
| |
| |
| PartOne = bin(int(PartOne, 16)).lstrip('0b').rjust(56, '0') |
| PartTwo = bin(int(PartTwo, 16)).lstrip('0b').rjust(56, '0') |
| print('两组 56 位比特流:', PartOne, PartTwo) |
| |
| |
| PartOne = ZeroPadding(PartOne) |
| PartTwo = ZeroPadding(PartTwo) |
| print('两组再 7 位一组末尾加 0:', PartOne, PartTwo) |
| |
| |
| PartOne = hex(int(PartOne, 2))[2:] |
| PartTwo = hex(int(PartTwo, 2))[2:] |
| if '0' == PartTwo: |
| PartTwo = "0000000000000000" |
| print('两组转为 hex:', PartOne, PartTwo) |
| |
| |
| LMOne = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartOne)).decode() |
| LMTwo = DesEncrypt("KGS!@#$%", binascii.a2b_hex(PartTwo)).decode() |
| print('两组 DES 加密结果:', LMOne, LMTwo) |
| |
| |
| LM = LMOne + LMTwo |
| print('LM hash:', LM) |
| |

- 可以看出密码长度小于7时,后面加密的数据是固定的,均为aad3b435b51404ee,因此其加密是不安全的。
NTML Hash
- NTML Hash全称
NT LAN Manager
, 目前 Windows 基本都使用 NTLM hash ,一个32
位长度的字符串。支持Net NTLM认证协议及本地认证过程中的关键凭据。加密算法如下:
- 密码转换为十六进制
Unicode
编码
MD4
加密
- Python脚本如下:
| import hashlib |
| import binascii |
| import sys |
| |
| print(binascii.hexlify(hashlib.new("md4", sys.argv[1].encode("utf-16le")).digest()).decode()) |

123456
经过加密后则为32ed87bdb5fdc5e9cba88547376818d4
。
Windows本地认证
winlogon.exe
-> 接收用户密码 -> lsass.exe
-> 比对sam表。
- winlogon就是登陆界面,接受用户密码之后会发送明文到
lsass.exe
,lsass.exe
会存储一份明文,然后加密明文和sam表的hash做比对,判断是否可以登陆。
- Windows Logon Process(即 winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。
- 这里注意如果打了补丁
KB2871997
,或者机器是win2012
之后,则不会保存明文密码了。
NTLM认证协议
- 什么是
NTLM
认证协议呢?和NTLM Hash
又有什么区别呢?NTLM
是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。NTLM 网络认证协议是以 NTLM Hash
作为根本凭证进行认证的协议。
- 在内网渗透中,经常遇到工作组环境,而工作组环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是比较落后的认证方式, 没有信托机构。
- 假设A主机与B主机属于同一个工作组环境,A想访问B主机上的资料,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能够访问B主机上的资源。
- 早期SMB协议在网络上传输明文口令。后来出现LAN Manager Challenge/Response验证机制,简称LM,它是如此简单以至很容易就被破解,现在又有了
NTLM
以及Kerberos
。
- 认证流程分为三部分,分别是:
协商
、质询
、身份验证
。

协商
- 客户端向服务器发送协商请求,包含用户名、密码、认证协议版本等信息。
质询
- 服务器接收到客户端发送到协商信息,这时服务器会生成一个随机数,叫做
challenge
,这里的不同的协议随机数长度不同,NTLM V1是8位,NTLM V2是16位。
- 服务器将登陆的用户对应的
NTLM Hash
加密challenge
,得到Net NTLM Hash
,和生成的challenge
一起发送给客户端。
验证
- 客户端收到challenge后,将用户的hash与challenge进行加密运算得到resposne,将username、response、challenge发送给服务器,最后服务器进行校验返回认证结果。
WireShark
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)