一、基本原理:
Windows密码的路径是:
%SystemRoot%\System32\config\sam
# 即”SAM路径“
当我们登陆系统时,系统会自动地读取SAM文件中的密码与我们输入的密码进行比对,密码会被转换为HTML HASH(NT LAN Manager)进行存储。
Windows本身不存储用户的明文密码,Windows会将用户的明文密码经过加密算法后存储在SAM数据库中,当用户登陆时,将用户输入的明文密码也加密成NTML HASH,与SAM数据库中的NTLM HASH进行比较 (NTLM Hash的前身是LM HASH,基本已淘汰,算法脆弱,但是xp2003内老系统仍旧存在)。
LM HASH
主要存在的安全问题是:密码不区分大小写(因为最开始会把密码统一转换为大写)、密码最长为14位、可通过加密后的值反推加密前的密码位数、DES加密强度较弱等。
二、NTML HASH生成原理三步骤详解
-
第一步:hex (16进制编码)
-
第二步:Unicode编码(ASCII转Unicode)
-
第三步:MD4加密得到NTML HASH
参考:MD4是麻省理工学院教授Ronald Rivest于1990年设计的一种信息摘要算法。它是一种用来测试信息完整性的密码散列函数的实行。其摘要长度为128位,一般128位长的MD4散列被表示为32位的十六进制数字。这个算法影响了后来的算法如MD5、SHA 家族和RIPEMD等。
三、Windows本地认证流程
注销或开机后:弹出输入账号密码的界面,用于接受用户输入 (实际会有个本地进程:winlogon.exe进程,用于管理用户的登陆和退出);
进程(1):winlogon.exe进程,将账号密码给lsass.exe进程进行处理,并将密码缓存在进程中;
进程(2):lsass.exe进程,将密码转换为NTML HASH,读取SAM数据库与用户名进行比较;
若比较结果相同,则将User SID与Group SID发给winlogon.exe,并准备登陆界面;若比较结果不同,则登陆失败。
四、Windows网络认证原理
局域网工作组:缺少信托机构(银行:两者之间进行交易所必须信任的中间人)
工作组的环境是一个逻辑上的网络环境(工作区),隶属于工作组的机器之间无法互相建立一个完美的信任机制,只能点对点,是较为落后的认证方式,没有信托机构。
假设A主机与B主机在一个工作主组环境,A想要访问B主机上的资源,需要将一个存在于B主机上的账户凭证发送至B主机,经过认证才能访问B主机上的资源。传输数据由协议来规范数据如何传递,最常见的服务:SMB服务 端口445。
五、NTLM协议——NT LAN Manager
认证如此简单因此需要协议来规范,于是就产生了NTLM协议。
-
SMB协议
:早期在网络上传输的是明文口令; -
LM协议
:后来出现了LAN Manager Challenge/Response挑战和验证机制,简称LM,较脆弱; -
NLTM协议
:后续微软提出WindowsNT挑战/响应验证机制“NTLM”,NTLM支持SMB(SMB是个服务,操作上的)。
六、挑战和响应机制 (NTLM V2)
第一步:协商
确认协议版本,是V1还是V2?
第二步:质询
质询的完整过程:
(1)服务器判断用户是否存在:
客户端向服务器端发送用户主机信息(必须包含用户名),服务器用客户端请求的用户名来判断服务器内是否有这个用户;
若没有这个用户,那么认证过程就是失败的;若有,则继续:
(2)服务器生成16位Challenge:
服务器接受到请求之后生成一个16位随机数Challenge,服务器使用登录用户名对应的NTLM HASH;
(3)服务器生成Net NTLM HASH:
服务器用本机SAM文件数据库内NTLM HASH 加密 16位随机数 Challenge生成Challenge1 即“Net NTML HASH”;
(4)服务器返回16位Challenge:
服务器将之前生成的16位随机数Challenge再发送给客户端;
(5)客户端生成Response:
客户端接受到Challenge之后,使用将要登陆到账户对应的NTLM HASH加密Challenge生成Response,然后将Response发送到服务端 ;
第三步:验证
(6)服务端比对Response是否等于Net NTLM HASH:
比对服务器端收到客户端的Response后,比对NET NTLM HASH与Response是否相等,相等则通过。
实战验证
(1)修改mdmin账户密码为vsrc@2020。
(2)通过Pythonnthash.hash函数能直接得出vsrc@2020对应的NTML HASH为:7b86d7692a8b1de47817434f08671229;
(3)根据NTML HASH的生成原理推算也同样得到7b86d7692a8b1de47817434f08671229;
第一步:将vsrc@2020进行十六进制的转换后输出结果如下;
第二步:将
转码为Unicode得到结果如下;
第三步:将760073007200630040003200300032003000进行MD4加密后得到结果如下;
(4)将lsass保存在内存中的信息dump成为本地lsass.dmp文件;
(5)获取lsass.dmp文件内容并查看mdmin账户密码的NTML HASH值:与分步骤推算的值一致,再一次得到7b86d7692a8b1de47817434f08671229;
验证完成。
参考🔗:
1、https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm
2、https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-kerberos
3、https://www.insecurity.be/blog/2018/01/21/retrieving-ntlm-hashes-and-what-changed-technical-writeup/