LM-Hash与NTLM-Hash
在windows下通过SAMInside提取到的密码Hash时,可以看到有两条,分别是LM-Hash和NT-Hash,这是对同一个密码的两种不同的加密方式,下面对其生成原理做个实验。
Windows下LM-Hash生成原理
这里用实例展示LM-Hash的具体产生过程。
我使用的明文口令是“123993”,可以看到在使用SAMInside提取出来的LM-Password是 < Disabled >的形式,这里是因为win7系统禁用了LM方式。
使用如下方法启动:
依次打开:控制面板>>所有控制面板项>>管理工具>>本地安全策略,再依次打开>>本地策略>>安全选项
打开以下截图中的“策略”,并将“已启用”修改为“已禁用”。单击“应用”后再点击“确定”。
因为该策略要求修改密码后生效,所以我需要修改密码。
我将密码修改为123994,此时Administrator用户的LM-Password不再显示< Disabled >,并且获得其LM-Hash值FAE8BB9ECB799902AAD3B435B51404EE。
这种加密过程的第一步是将明文口令转换为其大写形式,接下来123994大写转换后仍为它本身,第二步是将字符串大写后转换为16进制字符串,
这里使用UltraEdit编辑器将123994转换为16进制字符串。
在UltraEdit编辑器输入123994后右键选择“十六进制编辑”选项,如下图所示。
【误区:使用win7自带的计算器并选择程序员模式,将十进制的123994转换为16进制,结果为1E45A,这里是把123994当作数值转换,没有按要求转换为16进制字符串。】
这种密码生成规则要求用户的密码最多仅能为14个字符,第三步是密码不足14字节要求用0补全。转换后的十六进制字符串按照二进制计算只有48bit(12*4),为了满足14字节(112bits)的要求,所以需要补全64bit(16*4)的二进制0,得最终补全后十六进制为:3132333939340000000000000000。
第四步是将上述编码分成2组7字节(56bits=14*4)的数据,分别为31323339393400和00000000000000。
第五步是将每一组7字节的十六进制转换为二进制,每7bit一组末尾加0,再转换成十六进制组成得到2组8字节的编码。
下图将31323339393400转换为二进制。
然后从左到右按照每7bit一组罗列如下:这里务必注意将最前面的11补全为0011
0011 000
1 0011 00
10 0011 0
011 0011
1001 001
1 1001 00
11 0100 0
000 0000
接下来在每7bits一组的末尾添0,再将其转换成16进制。
0011 0000 -> 3 0
1001 1000 -> 9 8
1000 1100 -> 8 C
0110 0110 -> 6 6
1001 0010 -> 9 2
1100 1000 -> C 8
1101 0000 -> D 0
0000 0000 -> 0 0
从上往下得到31323339393400对应的8字节编码:30988C6692C8D000
同理知00000000000000对应的8字节编码:
0000000000000000。
第六步将以上步骤得到的两组8字节编码,分别作为DES加密key为魔术字符串“KGS!@#$% ”进行加密。
该魔术字符串换算成16进制:4B47532140232425。
从网上下载到DES计算器,依次计算使用30988C6692C8D000和0000000000000000加密4B47532140232425后的密文。
第七步将两组DES加密后的编码拼接,
得到最终LM-Hash值为:
FAE8BB9ECB799902AAD3B435B51404EE
这与SAMInside中的LM-Hash值相同。
注意:这种加密方法对于输入明文密码是数字、字母或者数字与字母的组合,或者其他如&、%等常用符号均适用;使用UltraEdit获取明文的十六进制字符串
Windows下NTLM-Hash生成原理
IBM设计的LM Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,NTLM Hash便应运而生。
这里同样以上节的明文密码“123994”作为研究对象。首先在UltraEdit中输入123994,然后点击>>编辑>>十六进制函数>>十六进制编辑,
再点击>>文件>>转换>>ASCII转Unicode,如下图所示获得Unicode字符串为31003300390039003400,
开头的FF FE用于标识此文本文件为Unicode编码,参考链接:
/u/1024767/blog/351792?fromerr=KQ0hrIzn
/s/blog_815b7fb901010am3.html
对所获取的Unicode字符串进行标准MD4单向哈希加密,无论数据源有多少字节,MD4固定产生128-bit的哈希值,产生的哈希值就是最后的NTLM Hash。
从网上下载HashCalc工具,打开后将31003300390039003400输入数值框中,选择左侧数据格式为十六进制串,去掉HMAC前的对号。选中MD4加密,再点击计算,如下图所示。
获得MD4加密的哈希值为b648042caad9f1c0cbf5bb5cb66ee88f,
与SAMInside中的NT-Hash:B648042CAAD9F1C0CBF5BB5CB66EE88F相同。