【内网学习】windows之NTLM认证的学习

本文最后更新于:2021年11月28日晚上7点26分

什么是NTLM?

NTLM是一种网络认证协议,它是基于挑战(Chalenge)/响应(Response)认证机制的一种认证模式。(这个协议只支持Windows)

NTLM认证的方式

NTLM主要有两种认证的方式:

  • 本地认证
  • 网络认证

其中windows的本地登录认证的时候,是将用户的输入值经过一系列加密后与后端的“数据库”进行比对,如果比对成功了,则登录成功。

后端的“数据库”本身不是数据库,而是一个文件,该文件存放的地址为:C:\Windows\System32\config\SAM

image-20211127180313156

NTLM本地认证详细流程

winlogon.exe即Windows Logon Process,是Windows NT用户登陆程序,用于管理用户登录和退出。

LSASS用于微软Windows系统的安全机制。它用于本地安全和登陆策略。

  • 当用户注销、重启、锁屏后,操作系统会让winlogon.exe显示登陆界面

  • 当winlogon.exe接收到账号密码输入之后,会将密码交给lsass进程

  • 将明文密码加密成NTLM Hash

  • 与SAM数据库比较认证

NTLM hash是如何加密的?

假设密码为:admin123!@#

十六进制加密后为:61646d696e313233214023

再进行Unicode编码:610064006d0069006e00310032003300210040002300

最后进行MD4加密:8f909fdb472d0b85cddb3e36669a9b07

加密的脚本如下:

1
2
3
4
5
6
7
8
import binascii
import hashlib

password = input("Your Password:")
print("Your password is : " + password)
hash = hashlib.new('md4' , password.encode("utf-16le")).digest()
hash_hex = binascii.hexlify(hash)
print("NTLM answer is : " + str(hash_hex, 'UTF-8'))

image-20211128154506936

如何读取文件中的NTLM hash呢?

我们知道,NTLM的hash保存在C:\Windows\System32\config\SAM中,但是这个文件我们是无法直接打开的。

image-20211128160134344

因此我们需要借助一些工具读取NTLM中的hash值

Mimikatz

项目地址:https://github.com/gentilkiwi/mimikatz

介绍:这是一款可以帮助用户获取windows密码的软件

使用注意事项:

  • 需要管理员权限,

  • 当机器安装了KB2871997补丁或者系统版本大于windows server 2012时,系统的内存中就不再保存明文的密码,这样利用mimikatz就不能从内存中读出明文密码了。

执行

1
mimikatz.exe ""privilege::debug"" ""sekurlsa::logonpasswords""

可以得到NTLM值,当然,像我这个密码比较简单的,直接就爆出来了

image-20211128161443245

其中NTLM值与前文用到的python脚本运行生成的值一样:

image-20211128162003247

LaZagne

和上一个一样,同样需要管理员权限

1
lazagne.exe all

image-20211128163047097