@TOC
本地认证是Windows操作系统的一项重要功能,它涉及账号密码的存储与验证。本文将详细解析本地认证的概念、关键组件的运作方式、加密步骤以及相关安全问题,帮助读者全面理解这一关键机制。
第一部分 本地认证概述
本地认证是指在设备本地存储账号密码的认证机制,即使设备未联网,也可通过输入账号密码进行登录。Windows工作组环境通常采用这种方式。
本地认证流程
本地认证的流程如下:
- 电脑开机。
- 系统启动
winlogon.exe进程。 - 用户输入账号密码。
- 系统通过
lsass.exe进程对比用户输入的密码与存储在SAM文件中的加密密码。 - 验证成功后,用户登录。
核心组件解析
Windows登录进程(winlogon.exe)
winlogon.exe是Windows NT系统的用户登录程序,负责管理用户登录、注销、重启及锁屏等操作。
本地安全授权子系统服务(lsass.exe)
lsass.exe是Windows的核心系统进程,负责管理本地安全策略和认证机制,包括密码策略、账户策略、用户权限等。
安全帐户管理器(SAM文件)
SAM文件位于C:\Windows\System32\config\目录,用于存储本地用户的凭证信息。由于其重要性,普通用户无法直接查看、修改或复制此文件。
第二部分 SAM文件与lsass.exe进程详解
SAM文件
SAM文件是Windows用户账户的数据库,位于C\windows\system32\config\目录下,存储了用户名及其加密后的密码信息,
SAM 文件的格式及内容:
SAM 文件以记录条目(Record Entry)存储用户信息,每个条目包含用户名、RID(相对标识符)、LM 哈希值(如果存在)和 NTLM 哈希值等信息。格式如下:
用户名:RID:LM 哈希值:NTLM 哈希值
例如:
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0
- 用户名: 本地用户账户名称,如
Administrator或其他账户名。 - RID: 用于唯一标识用户的数字,例如
500通常表示系统管理员账户。 - LM 哈希值: 基于 LAN Manager 的加密方式,默认从 Windows Vista 及之后版本禁用。
- NTLM 哈希值: 基于 NTLM 协议的加密方式,是 Windows 的默认身份验证机制。
lsass.exe进程
lsass.exe在用户登录过程中主要负责以下任务:
- 对用户输入的明文密码加密,与SAM文件中的加密密码进行对比。
- 在内存中临时保留一份明文密码,便于后续使用。
登录验证流程
- 用户输入账号密码。
winlogon.exe将信息传递给lsass.exe。lsass.exe对密码加密并与SAM文件对比。- 验证成功后,允许用户登录。
第三部分 LM Hash加密
什么是LM Hash?
LM Hash(LAN Manager Hash)是一种基于DES加密的散列算法,早期Windows系统采用它进行密码存储。然而,LM Hash存在明显的安全弱点,从Windows Vista及Windows Server 2008版本起默认被禁用。LM Hash明文密码被限定在14位以内,也就是说,如果要停止使用 LM Hash,将用户的密码设置为14位以上即可。如果 LM Hash被禁用了,攻击者通过工具抓取的 LM Hash通常为aad3b435b51404eead3b435b51404ee(表示 LM Hash为空值或被禁用)
下面是各个版本对LM和NTLM的支持:

LM Hash加密步骤
-
将明文密码转换为大写
例如:Admin@123→ADMIN@123 -
转换为16进制字符串
ADMIN@123→41 44 4D 49 4E 40 31 32 33 -
不足14字节补全为0
41 44 4D 49 4E 40 31 32 33→41 44 4D 49 4E 40 31 32 33 00 00 00 00 00 -
分成两组,每组7字节
- 第一组:
41 44 4D 49 4E 40 31 - 第二组:
32 33 00 00 00 00 00
- 第一组:
-
每组进行DES加密
使用固定密钥KGS!@#$%加密,最终生成16字节的LM Hash值。
第四部分 NTLM Hash加密
什么是NTLM Hash?
NTLM Hash是一种基于MD4加密算法的散列算法,从Windows Vista和Windows Server 2003版本开始广泛应用于Windows认证。
NTLM Hash加密步骤
-
将明文密码转换为16进制字符串
例如:Admin@123→41646D696E40313233 -
转换为Unicode格式
在每个字节后添加0x00:
41646D696E40313233→410064006D0069006E004000310032003300 -
进行MD4加密
使用MD4算法加密,生成32位的十六进制字符串:
例如:570a9a65db8fba761c1008a51d4c95ab
第五部分 本地认证中的安全问题
尽管本地认证机制提供了基本的安全保障,但在渗透测试中我们仍需要关注以下问题:
1. 如果渗透人员想知道对方电脑的账号密码,怎么办?
分析: 渗透测试中获取对方电脑账号密码的方法主要基于对系统漏洞或错误配置的利用。例如:
- 针对lsass.exe特性: 利用工具(如 Mimikatz)从内存中提取凭证信息,包括明文密码或哈希值。
- 针对 SAM 文件: 提取 SAM 文件后,可以利用密码破解工具进行离线暴力破解或字典攻击。
- 键盘记录器: 在受控环境中安装键盘记录器,捕获用户输入。
- 替换 SAM 文件: 在 PE(预安装环境)模式下,将目标系统的
SAM文件替换为已知密码的文件,这也是脱机密码恢复的原理。
防护措施:
- 启用 BitLocker 等全盘加密功能,防止离线攻击。
- 使用强密码策略,避免简单密码被暴力破解。
- 限制管理员权限,减少凭证泄露的风险。
2. 内存中存储密码很不安全,微软肯定会修复,那我们如何拿到 Win10 及之后版本的明文账号密码?
面试常问:如何在 Windows Server 2012 及以后版本中获取明文密码?
分析:
尽管微软已针对内存中存储明文密码的安全问题进行了多次修复,但仍有一些方法可以重新启用明文密码的存储或从内存中提取它们。一种常见的方法是通过修改注册表强制存储明文密码,具体操作步骤如下:
- 打开注册表编辑器 (
regedit),定位到以下路径:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest - 确保存在
UseLogonCredential键,如果不存在则新建一个DWORD类型的键。 - 将
UseLogonCredential的值设置为1,以启用 WDigest 协议的凭据存储为明文的功能。 - 重启系统后,通过工具(如 Mimikatz)即可从内存中提取明文密码。
- 注意:
此方法仅在特定的安全测试环境中进行,实际操作需要具备目标系统的管理员权限。同时,自 Windows 8.1 和 Server 2012 R2 起,默认情况下 WDigest 协议已被禁用,此方法在安全性增强的系统中可能需要进一步调整环境。
防护措施:
- 配置 Secure Boot 和 TPM 芯片,增强系统可信链。
- 禁止 Lsass.exe 的调试权限,防止内存注入。
- 定期更新操作系统,修补已知漏洞。
3. 既然 Windows 是通过 Hash 值对比,那我能不能直接输入 Hash 值呢?
分析: 是的,这种攻击方法被称为 PTH(Pass-the-Hash) 攻击。攻击者可以通过以下方式利用:
- 获取哈希值后,将其直接用于身份验证,而无需知道明文密码。
- 利用工具(如 Impacket、Metasploit 模块)可以模拟身份验证协议并使用哈希值代替密码进行登录。
防护措施:
- 禁用 NTLM 身份验证: 使用 Kerberos 协议取代 NTLM,减少哈希值的滥用风险。
- 分隔权限: 限制高权限账户的访问范围,减少攻击面。
- 监控活动: 部署入侵检测系统(IDS),监控异常登录活动。
防范建议
- 禁用LM Hash,避免因其弱加密机制引发风险。
- 定期清理
lsass.exe中的明文密码缓存。 - 启用多因子认证,增强登录安全性。
- 限制对SAM文件的访问权限,定期更新账户密码。
原文 https://blog.csdn.net/2301_79518550/article/details/144836209