WINDOWS系统密码破解全攻略

背景
要破解一个程序的密码,要先了解它的一些背景知识 。先来简单说一下系统密码的加密算法 。早期SMB协议在网络上传输明文口令 。后来出现"LAN/"验证机制,简称LM,它是如此简单以至很容易被破解 。微软提出了挑战/响应验证机制,称之为NTLM 。现在已经有了更新的以及验证体系 。加密过的密码口令,我们称之为hash(中文:哈希),的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash 。以下内容摘选自安全焦点:
--------------------------------------引文开始----------------------------------------------
一、如何从明文口令生成LM-Hash?
1、假设明文口令是"",首先全部转换成大写,再做如下变换:
“” ->
先把转换成十六进制形式,在明文口令不足14字节的情况下,后面添加0x00补足14字节 。有些书上介绍添加空格(0x20)补足14字节,这是错误的,我不清楚是原作者写错了,还是译者的问题 。
【WINDOWS系统密码破解全攻略】2、然后切割成两组7字节的数据,分别经()函数(代码已附光盘)处理得到两组8字节数据:
-()->
000 -()-> 00000
3、这两组8字节数据将做为对魔术字符串"KGS!@#$%"进行标准DES加密(代码已附光盘):
“KGS!@#$%” ->
-对进行标准DES加密->
00000 -对进行标准DES加密->
4、将加密后的这两组数据简单拼接,就得到了最后的LM-Hash

WINDOWS系统密码破解全攻略

文章插图
的LM-Hash:。
显然,由于明文口令一开始就全部转换成大写,导致多个明文口令对应一个LM-Hash 。反过来,在穷举破解LM-Hash时,得到的有可能不是原始口令,因为不可能确定大小写 。仔细观察前述SMB身份验证过程,即使这里得到的不是原始口令(大小写有差别),同样可以通过SMB身份验证 。这种转换成大写的行为减小了穷举破解难度 。
另一个弱点,当明文口令小于8字节时,LM-Hash后8字节的计算过程总是这样的:
000 -()-> 00000
对进行标准DES加密->
这也将减小穷举破解难度 。
IBM设计了这个LM-Hash算法,魔术字符串"KGS!@#$%"的意义无从考证 。这个算法称之为"哈希"不怎么妥当,由于是标准DES加密,完全是可逆的 。当然,由于要穷举的是本身,与传统所说的可逆有区别 。
二、如何从明文口令生成NTLM-Hash?
IBM设计的LM-Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,所以,NTLM-Hash应运而生 。
1、假设明文口令是"",首先转换成字符串,与LM-Hash算法不同,这次不需要添加0x00补足14字节:
“” -> 33
从ASCII串转换成串时,使用-序,微软在设计整个SMB协议时就没考虑过big-序,ntoh*()、hton*()函数不宜用在SMB报文解码中 。0x80之前的标准ASCII码转换成码,就是简单地从0x??变成0x00?? 。此类标准ASCII串按-序转换成串,就是简单地在原有每个字节之后添加0x00 。
2、对所获取的串进行标准MD4单向哈希(代码已附光盘),无论数据源有多少字节,MD4固定产生128-bit的哈希值,16字节:
33-进行标准MD4单向哈希->
3、就得到了最后的NTLM-Hash
的NTLM-Hash:。
NTLM-Hash与LM-Hash算法相比,明文口令大小写敏感,但无法根据NTLM-Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串"KGS!@#$%" 。
MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大 。问题在于,微软一味强调NTLM-Hash的强度高,却避而不谈一个事实,为了保持向后兼容性,NTLM-Hash缺省总是与LM-Hash一起使用的 。这意味着NTLM-Hash强调再高也是无助于安全的,相反潜在损害着安全性 。增加NTLM-Hash后,首先利用LM-Hash的弱点穷举出原始明文口令的大小写不敏感版本,再利用NTLM-Hash修正出原始明文口令的大小写敏感版本 。