自己一直对一些底层的原理欠缺,最近一段时间弥补了一些基础的东西,但是一直没做记录。Windows的一个登录验证是必须要了解的,这里简单做个笔记记录一下。
概括
Windows本地认证采用sam hash比对的形式来判断用户密码是否正确,计算机本地用户的所有密码被加密存储在%SystemRoot%\system32\config\sam文件中,当我们登录系统的时候,系统会自动地读取SAM文件中的“密码”与我们输入的密码进行比对,如果相同,证明认证成功.
本地认证的过程其实就是Windows把用户输入的密码凭证和sam里的加密hash比对的过程。
Windows对用户的密码凭证有两种加密算法,也就是本文写的NTLM和LM。
也就是说从Windows Vista 和 Windows Server 2008开始,默认情况下只存储NTLM Hash,LM Hash将不再存在。
LM Hash
全称是LAN Manager Hash, windows最早用的加密算法,由IBM设计。
LM Hash的计算:
- 用户的密码转换为大写,密码转换为16进制字符串,不足14字节将会用0来再后面补全。
- 密码的16进制字符串被分成两个7byte部分。每部分转换成比特流,并且长度位56bit,长度不足使用0在左边补齐长度
- 再分7bit为一组,每组末尾加0,再组成一组
- 上步骤得到的二组,分别作为key 为 KGS!@#$%进行DES加密。
- 将加密后的两组拼接在一起,得到最终LM HASH值。
lm协议的脆弱之处在于
- des的key是固定的
- 可以根据hash判断密码长度是否大于7位,如果密码强度是小于7位,那么第二个分组加密后的结果肯定是aad3b435b51404ee
- 密码不区分大小写并且长度最大为14位
- 7+7字符分开加密明显复杂度降低14个字符整体加密 957+ 957 <95 14
NTLM Hash
LM Hash 的脆弱性显而易见,所以微软于1993年在Windows NT 3.1中引入了NTLM协议。NTLM Hash是支持Net NTLM认证协议及本地认证过程中的一个重要参与物,其长度为32位,由数字与字母组成。
• Windows本身不存储用户的明文密码,它会将用户的明文密码经过加密算法后存储在SAM数据库中。
• 当用户登录时,将用户输入的明文密码也加密成NTLM Hash,与SAM数据库中的NTLM Hash进行比较。NTLM Hash的前身是LMHash,目前基本淘汰,但是还是存在。
加密算法如下:
- 先将用户密码转换为十六进制格式。
- 将十六进制格式的密码进行Unicode编码。
- 使用MD4摘要算法对Unicode编码数据进行Hash计算
本地认证流程
• Windows Logon Process(即winlogon.exe),是Windows NT 用户登陆程序,用于管理用户登录和退出。
• LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。
lsass 与 SAM 文件
lsass.exe 程序
lsass.exe 是一个系统重要进程用于微软Windows系统的安全机制。它用于本地安全和登陆策略。而SAM的功能就固定于 lsass.exe 中但是 lsass.exe 不仅仅只进行本地身份认证所有正确通过本地、远程身份认证的用户信息都会保存在 lsass.exe 的内存中。
由于 WDigest 协议的存在在一些旧版本的 windows 操作系统中XP - win 8.0 和 server 2003 - server 2012 R1纯文本密码存储在 lsass.exe 进程中。
SAM文件
SAM 即“安全帐户管理器(Security Accounts Manager)”是 windows 操作系统管理用户帐户的安全所使用的一种机制。
安全帐户管理器对帐号的管理是通过安全标识进行的安全标识在帐号创建时就同时创建一旦帐号被删除安全标识也同时被删除。安全标识是唯一的即使是相同的用户名在每次创建时获得的安全标识都时完全不同的。因此一旦某个帐号被删除它的安全标识就不再存在了即使用相同的用户名重建帐号也会被赋予不同的安全标识不会保留原来的权限。
SAM 是用来存储 windows 操作系统密码的数据库文件为了避免明文密码泄漏SAM 文件中保存的是明文密码在经过一系列算法处理过的 Hash 值被保存的 Hash 分为 LM Hash 、 NTLM Hash 。当用户进行身份认证时会将输入的 Hash 值与 SAM 文件中保存的 Hash 值进行对比。在域控制器上 SAM 文件相当于活动目录数据库文件 ntds.dit。