Windows安全-密码口令
在 Windows 系统中,登录密码(或称为“口令”)不会以纯文本形式存储,而是以经过哈希处理的形式存储在一个系统文件中。具体来说,Windows 使用 SAM (Security Account Manager) 数据库来存储本地用户的密码哈希值。
1. SAM 文件
- 位置:
C:\Windows\System32\config\SAM
- 作用:SAM 文件包含所有本地用户的账户信息和密码哈希。为了安全,SAM 文件受到系统保护,正常情况下即使是管理员也无法直接访问或读取。
我们首先要获取 SAM 文件内关于口令密码的值,于是用到了 mimikatz 工具。 这个工具会被 Windows 的防火墙或者其它一些杀毒软件识别出病毒,因此需要先将其关闭,我在此使用了 Win10 的虚拟机进行操作,但其一直阻止我下载,每次加载后都会强制删除,后来将 Windows 安全中心里的病毒和威胁防护功能关闭就可以了。
然后我们以管理员身份打开工具,并输入下面的命令提升自己的权限为 system
privilege::debug
之后执行下面的命令,即可看到 SAM 文件中的密码,但其被使用 NTLM 进行加密了
sekurlsa::logonpasswords
结果如图所示:
其加密逻辑为:数据 hex(16 进制编码)—>Unicode 编码—>MD4 编码,最终得到的就是 NTLM 编码后的数据
书写 python 脚本进行验证:
def string_to_hex_unicode(input_string):
# 将字符串转为16进制格式
hex_string = ''.join(f'{ord(c):02x}' for c in input_string)
print(f"Hexadecimal format: {hex_string}")
# 将16进制格式转为Unicode格式
unicode_string = ''.join(f'{ord(c):04x}' for c in input_string)
print(f"Unicode format: {unicode_string}")
return unicode_string
# 示例用法
input_string = "1708639" #测试数据
unicode_result = string_to_hex_unicode(input_string)
print("Final Unicode result:", unicode_result) # 0031003700300038003600330039
细节处理:得到的串需要将前两位移到最后变成 3100370030003800360033003900,然后使用 HashCalc 进行 md4 加密即可得到最终结果。
2. NTLM 认证方式
-
客户端发送用户名到服务器
-
服务器判断本地用户名是否存在,没有则失败,有的话生成 challenge(挑战与响应机制),查找该用户的 NTLM-hash,使用 NTLM-hash 加密 challenge,生成 net-ntlm hash 存在内存中,将 challenge 发给客户端
-
客户端接收到 challenge 后,将自己的密码转换成 NTLM-hash,再用 NTLM-hash 加密 challenge,生成 response 发送给服务器
-
服务器对比 net-ntlm hash 和 response,成功即可链接