Good in study, attitude and health

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

结果如图所示: alt text

其加密逻辑为:数据 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 加密即可得到最终结果。 alt text

2. NTLM 认证方式


  1. 客户端发送用户名到服务器

  2. 服务器判断本地用户名是否存在,没有则失败,有的话生成 challenge(挑战与响应机制),查找该用户的 NTLM-hash,使用 NTLM-hash 加密 challenge,生成 net-ntlm hash 存在内存中,将 challenge 发给客户端

  3. 客户端接收到 challenge 后,将自己的密码转换成 NTLM-hash,再用 NTLM-hash 加密 challenge,生成 response 发送给服务器

  4. 服务器对比 net-ntlm hash 和 response,成功即可链接