Windows系统密码破解全攻略
2009/06/30 04:49 by hackest 本站原创
题目:Windows系统密码破解全攻略
作者:hackest [H.S.T.]
来源:hackest's blog
此文章已发表在《黑客X档案》2009年第6期杂志上
后经作者发布在博客上,如转载请务必保留此信息!
引子
我一直在想,到底用什么样的方式才能较长时间地控制已经得到了权限的目标呢?留后门,种木马,甚至是Rootkit?留的Webshell痕迹太明显,哪怕是一句话的Webshell,都极容易被管理员清除。放了木马,也容易被有经验的管理员查出来,毕竟现在能做到无声无色的木马还是比较少。早期的是自己建个进程,结束掉进程就over了,后来有了注入进程的木马,再后来还有了以服务启动的木马,还有些是替换某些不要紧的系统自有服务来启动的……不过上述方法隐蔽性都太差了,不管你的后门留得如何完美,不管你的木马程序多么免杀,终究还是做不到不留任何痕迹。
是不是就没有办法了呢?非也,某前辈(凋凌玫瑰)的一句名言惊醒了N多彷徨的菜鸟(如我之流):我一般不喜欢在服务器留木马或是后门,我比较喜欢利用管理员进入的方式来管理服务器(凋凌玫瑰文章原话引用)。管理员的进入方式,怎么理解呢?换句话说就是,管理员是怎么进他服务器的,我们就怎么进他的服务器。如果他是3389终端进入的,我们就终端进入,当然前提是要想办法得到他的管理员用户的密码;如果他是Pcanywhere进入的,我们就想办法获取他的Pcanywhere密码进入;如果他是Radmin进入服务器的,我们也要想办法搞到他的Ramin密码进入。这样的话,隐蔽性就大大提高了,肉鸡自然就没有这么容易跑掉了。如果他这个密码是域管理员密码,如果他这个密码可以管理整个机房的机器,如果他这个密码可以通杀他的内网,如果这个密码还能登录他的QQ!夸张点说,甚至他重装系统了,还用的是这个密码,那你的肉鸡又复活了……后果真是太可怕了(擦下汗先)!废话少说,直入正题——Windows系统密码破解全攻略。本文所指均为无物理接触的系统密码破解,如果让黑客物理接触计算机,根本就没有什么系统进不去的,而且操作更加简单,速度更快,呵呵。
背景
要破解一个程序的密码,要先了解它的一些背景知识。先来简单说一下Windows系统密码的加密算法。早期SMB协议在网络上传输明文口令。后来出现"LAN Manager Challenge/Response"验证机制,简称LM,它是如此简单以至很容易被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。Windows加密过的密码口令,我们称之为hash(中文:哈希),Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash。以下内容摘选自安全焦点:
--------------------------------------引文开始----------------------------------------------
一、如何从明文口令生成LM-Hash?
1、假设明文口令是"Welcome",首先全部转换成大写WELCOME,再做如下变换:
"WELCOME" -> 57454C434F4D4500000000000000
先把WELCOME转换成十六进制形式,在明文口令不足14字节的情况下,后面添加0x00补足14字节。有些书上介绍添加空格(0x20)补足14字节,这是错误的,我不清楚是原作者写错了,还是译者的问题。
2、然后切割成两组7字节的数据,分别经str_to_key()函数(代码已附光盘)处理得到两组8字节数据:
57454C434F4D45 -str_to_key()-> 56A25288347A348A
00000000000000 -str_to_key()-> 0000000000000000
3、这两组8字节数据将做为DESKEY对魔术字符串"KGS!@#$%"进行标准DES加密(代码已附光盘):
"KGS!@#$%" -> 4B47532140232425
56A25288347A348A -对4B47532140232425进行标准DES加密-> C23413A8A1E7665F
0000000000000000 -对4B47532140232425进行标准DES加密-> AAD3B435B51404EE
4、将加密后的这两组数据简单拼接,就得到了最后的LM-Hash
Welcome的LM-Hash: C23413A8A1E7665FAAD3B435B51404EE。
显然,由于明文口令一开始就全部转换成大写,导致多个明文口令对应一个LM-Hash。反过来,在穷举破解LM-Hash时,得到的有可能不是原始口令,因为不可能确定大小写。仔细观察前述SMB身份验证过程,即使这里得到的不是原始口令(大小写有差别),同样可以通过SMB身份验证。这种转换成大写的行为减小了穷举破解难度。
另一个弱点,当明文口令小于8字节时,LM-Hash后8字节的计算过程总是这样的:
00000000000000 -str_to_key()-> 0000000000000000
对4B47532140232425进行标准DES加密-> AAD3B435B51404EE
这也将减小穷举破解难度。
IBM设计了这个LM-Hash算法,魔术字符串"KGS!@#$%"的意义无从考证。这个算法称之为"哈希"不怎么妥当,由于是标准DES加密,完全是可逆的。当然,由于要穷举的是DESKEY本身,与传统所说的可逆有区别。
二、如何从明文口令生成NTLM-Hash?
IBM设计的LM-Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,所以,NTLM-Hash应运而生。
1、假设明文口令是"123456",首先转换成Unicode字符串,与LM-Hash算法不同,这次不需要添加0x00补足14字节:
"123456" -> 310032003300340035003600
从ASCII串转换成Unicode串时,使用little-endian序,微软在设计整个SMB协议时就没考虑过big-endian序,ntoh*()、hton*()函数不宜用在SMB报文解码中。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成0x00??。此类标准ASCII串按little-endian序转换成Unicode串,就是简单地在原有每个字节之后添加0x00。
2、对所获取的Unicode串进行标准MD4单向哈希(代码已附光盘),无论数据源有多少字节,MD4固定产生128-bit的哈希值,16字节:
310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
3、就得到了最后的NTLM-Hash
123456的NTLM-Hash: 32ED87BDB5FDC5E9CBA88547376818D4。
NTLM-Hash与LM-Hash算法相比,明文口令大小写敏感,但无法根据NTLM-Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串"KGS!@#$%"。
MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大。问题在于,微软一味强调NTLM-Hash的强度高,却避而不谈一个事实,为了保持向后兼容性,NTLM-Hash缺省总是与LM-Hash一起使用的。这意味着NTLM-Hash强调再高也是无助于安全的,相反潜在损害着安全性。增加NTLM-Hash后,首先利用LM-Hash的弱点穷举出原始明文口令的大小写不敏感版本,再利用NTLM-Hash修正出原始明文口令的大小写敏感版本。
--------------------------------------引文结束----------------------------------------------
实战
理论准备得差不多了,进入实战阶段。当你已经得到Windows的系统权限后,如何才能获得管理员的密码hash呢?不同版本的Windows的hash获取方法不一样。用到的工具有pwdump7.exe、GetHashes.exe、SAMInside.exe、LC5、Cain、Proactive Password Auditor、Ophcrack。下面将会详细介绍如何抓取各Windows版本的系统密码hash。
1、Windows 2000
比较老的一个Windows版本,同时也有好几个子版本,现在还在不少服务器上跑着,虽然性能和安全性都有点跟不上时代的脚步了,但是我们也不能放过。本文主要针对服务器目标,所以测试系统为Windows 2000 高级服务器版,打了SP4补丁的,已更新所有补丁,如图1。

2000下可以用pwdump7.exe来抓取系统用户的hash,命令格式:pwdump7.exe >2000hash.txt,意思为抓取所有用户hash,并写入2000hash.txt这个文本文件,如图2。

也可以用SAMInside自带的小工具GetHashes.exe,命令格式:GetHashes.exe $local >2000.txt,意思是抓取所有用户hash并写入2000.txt这个文本文件,如图3。

还可以用图形界面的SAMInside,打开SAMInside,点击“File”,然后点击“Import local Users via Scheduler”,稍等一会就成功抓取到hash了,如图4、图5。


因为这个是利用Windows的计划任务来抓取的,所以Task Scheduler服务必须启动,否则抓不出来。抓到hash之后还要导出,以方便用其它更强大的破解工具进行破解工作。如果要导出所有用户的hash,就点击“File”,然后点击“Export Users to PWDUMP File...”,然后保存为txt文本即可。如果只需要其中一个用户的hash,就选“Export Selected Users to PWDUMP File...”,同样保存为txt文本即可,如图6。

操作都比较简单吧。SAMInside同时也是一个破解工具,可以对抓取的hash进行简单的破解工作,还自带了一个常用字典,还可以结合彩虹表进行破解,如果密码不是太复杂,在这里就可以得到密码明文了。
顺便提一下Windows 2000下的另一个得到管理员密码的方法,用aio.exe(aio是All In One的缩写,是一些小工具的集合)直接读取内存中的密码,Windows 2003 SP1、SP2补丁没有打的话,也可以这样读取出来密码明文。命令格式:aio.exe -findpassword,成功读出了密码,密码为2000,如图7。

此方法只有在管理员登录了,而又没有注销的情况下才可以成功读出密码。
作者:hackest [H.S.T.]
来源:hackest's blog
此文章已发表在《黑客X档案》2009年第6期杂志上
后经作者发布在博客上,如转载请务必保留此信息!
引子
我一直在想,到底用什么样的方式才能较长时间地控制已经得到了权限的目标呢?留后门,种木马,甚至是Rootkit?留的Webshell痕迹太明显,哪怕是一句话的Webshell,都极容易被管理员清除。放了木马,也容易被有经验的管理员查出来,毕竟现在能做到无声无色的木马还是比较少。早期的是自己建个进程,结束掉进程就over了,后来有了注入进程的木马,再后来还有了以服务启动的木马,还有些是替换某些不要紧的系统自有服务来启动的……不过上述方法隐蔽性都太差了,不管你的后门留得如何完美,不管你的木马程序多么免杀,终究还是做不到不留任何痕迹。
是不是就没有办法了呢?非也,某前辈(凋凌玫瑰)的一句名言惊醒了N多彷徨的菜鸟(如我之流):我一般不喜欢在服务器留木马或是后门,我比较喜欢利用管理员进入的方式来管理服务器(凋凌玫瑰文章原话引用)。管理员的进入方式,怎么理解呢?换句话说就是,管理员是怎么进他服务器的,我们就怎么进他的服务器。如果他是3389终端进入的,我们就终端进入,当然前提是要想办法得到他的管理员用户的密码;如果他是Pcanywhere进入的,我们就想办法获取他的Pcanywhere密码进入;如果他是Radmin进入服务器的,我们也要想办法搞到他的Ramin密码进入。这样的话,隐蔽性就大大提高了,肉鸡自然就没有这么容易跑掉了。如果他这个密码是域管理员密码,如果他这个密码可以管理整个机房的机器,如果他这个密码可以通杀他的内网,如果这个密码还能登录他的QQ!夸张点说,甚至他重装系统了,还用的是这个密码,那你的肉鸡又复活了……后果真是太可怕了(擦下汗先)!废话少说,直入正题——Windows系统密码破解全攻略。本文所指均为无物理接触的系统密码破解,如果让黑客物理接触计算机,根本就没有什么系统进不去的,而且操作更加简单,速度更快,呵呵。
背景
要破解一个程序的密码,要先了解它的一些背景知识。先来简单说一下Windows系统密码的加密算法。早期SMB协议在网络上传输明文口令。后来出现"LAN Manager Challenge/Response"验证机制,简称LM,它是如此简单以至很容易被破解。微软提出了WindowsNT挑战/响应验证机制,称之为NTLM。现在已经有了更新的NTLMv2以及Kerberos验证体系。Windows加密过的密码口令,我们称之为hash(中文:哈希),Windows的系统密码hash默认情况下一般由两部分组成:第一部分是LM-hash,第二部分是NTLM-hash。以下内容摘选自安全焦点:
--------------------------------------引文开始----------------------------------------------
一、如何从明文口令生成LM-Hash?
1、假设明文口令是"Welcome",首先全部转换成大写WELCOME,再做如下变换:
"WELCOME" -> 57454C434F4D4500000000000000
先把WELCOME转换成十六进制形式,在明文口令不足14字节的情况下,后面添加0x00补足14字节。有些书上介绍添加空格(0x20)补足14字节,这是错误的,我不清楚是原作者写错了,还是译者的问题。
2、然后切割成两组7字节的数据,分别经str_to_key()函数(代码已附光盘)处理得到两组8字节数据:
57454C434F4D45 -str_to_key()-> 56A25288347A348A
00000000000000 -str_to_key()-> 0000000000000000
3、这两组8字节数据将做为DESKEY对魔术字符串"KGS!@#$%"进行标准DES加密(代码已附光盘):
"KGS!@#$%" -> 4B47532140232425
56A25288347A348A -对4B47532140232425进行标准DES加密-> C23413A8A1E7665F
0000000000000000 -对4B47532140232425进行标准DES加密-> AAD3B435B51404EE
4、将加密后的这两组数据简单拼接,就得到了最后的LM-Hash
Welcome的LM-Hash: C23413A8A1E7665FAAD3B435B51404EE。
显然,由于明文口令一开始就全部转换成大写,导致多个明文口令对应一个LM-Hash。反过来,在穷举破解LM-Hash时,得到的有可能不是原始口令,因为不可能确定大小写。仔细观察前述SMB身份验证过程,即使这里得到的不是原始口令(大小写有差别),同样可以通过SMB身份验证。这种转换成大写的行为减小了穷举破解难度。
另一个弱点,当明文口令小于8字节时,LM-Hash后8字节的计算过程总是这样的:
00000000000000 -str_to_key()-> 0000000000000000
对4B47532140232425进行标准DES加密-> AAD3B435B51404EE
这也将减小穷举破解难度。
IBM设计了这个LM-Hash算法,魔术字符串"KGS!@#$%"的意义无从考证。这个算法称之为"哈希"不怎么妥当,由于是标准DES加密,完全是可逆的。当然,由于要穷举的是DESKEY本身,与传统所说的可逆有区别。
二、如何从明文口令生成NTLM-Hash?
IBM设计的LM-Hash算法存在几个弱点,微软在保持向后兼容性的同时提出了自己的挑战响应机制,所以,NTLM-Hash应运而生。
1、假设明文口令是"123456",首先转换成Unicode字符串,与LM-Hash算法不同,这次不需要添加0x00补足14字节:
"123456" -> 310032003300340035003600
从ASCII串转换成Unicode串时,使用little-endian序,微软在设计整个SMB协议时就没考虑过big-endian序,ntoh*()、hton*()函数不宜用在SMB报文解码中。0x80之前的标准ASCII码转换成Unicode码,就是简单地从0x??变成0x00??。此类标准ASCII串按little-endian序转换成Unicode串,就是简单地在原有每个字节之后添加0x00。
2、对所获取的Unicode串进行标准MD4单向哈希(代码已附光盘),无论数据源有多少字节,MD4固定产生128-bit的哈希值,16字节:
310032003300340035003600 -进行标准MD4单向哈希-> 32ED87BDB5FDC5E9CBA88547376818D4
3、就得到了最后的NTLM-Hash
123456的NTLM-Hash: 32ED87BDB5FDC5E9CBA88547376818D4。
NTLM-Hash与LM-Hash算法相比,明文口令大小写敏感,但无法根据NTLM-Hash判断原始明文口令是否小于8字节,摆脱了魔术字符串"KGS!@#$%"。
MD4是真正的单向哈希函数,穷举做为数据源出现的明文,难度较大。问题在于,微软一味强调NTLM-Hash的强度高,却避而不谈一个事实,为了保持向后兼容性,NTLM-Hash缺省总是与LM-Hash一起使用的。这意味着NTLM-Hash强调再高也是无助于安全的,相反潜在损害着安全性。增加NTLM-Hash后,首先利用LM-Hash的弱点穷举出原始明文口令的大小写不敏感版本,再利用NTLM-Hash修正出原始明文口令的大小写敏感版本。
--------------------------------------引文结束----------------------------------------------
实战
理论准备得差不多了,进入实战阶段。当你已经得到Windows的系统权限后,如何才能获得管理员的密码hash呢?不同版本的Windows的hash获取方法不一样。用到的工具有pwdump7.exe、GetHashes.exe、SAMInside.exe、LC5、Cain、Proactive Password Auditor、Ophcrack。下面将会详细介绍如何抓取各Windows版本的系统密码hash。
1、Windows 2000
比较老的一个Windows版本,同时也有好几个子版本,现在还在不少服务器上跑着,虽然性能和安全性都有点跟不上时代的脚步了,但是我们也不能放过。本文主要针对服务器目标,所以测试系统为Windows 2000 高级服务器版,打了SP4补丁的,已更新所有补丁,如图1。

2000下可以用pwdump7.exe来抓取系统用户的hash,命令格式:pwdump7.exe >2000hash.txt,意思为抓取所有用户hash,并写入2000hash.txt这个文本文件,如图2。

也可以用SAMInside自带的小工具GetHashes.exe,命令格式:GetHashes.exe $local >2000.txt,意思是抓取所有用户hash并写入2000.txt这个文本文件,如图3。

还可以用图形界面的SAMInside,打开SAMInside,点击“File”,然后点击“Import local Users via Scheduler”,稍等一会就成功抓取到hash了,如图4、图5。


因为这个是利用Windows的计划任务来抓取的,所以Task Scheduler服务必须启动,否则抓不出来。抓到hash之后还要导出,以方便用其它更强大的破解工具进行破解工作。如果要导出所有用户的hash,就点击“File”,然后点击“Export Users to PWDUMP File...”,然后保存为txt文本即可。如果只需要其中一个用户的hash,就选“Export Selected Users to PWDUMP File...”,同样保存为txt文本即可,如图6。

操作都比较简单吧。SAMInside同时也是一个破解工具,可以对抓取的hash进行简单的破解工作,还自带了一个常用字典,还可以结合彩虹表进行破解,如果密码不是太复杂,在这里就可以得到密码明文了。
顺便提一下Windows 2000下的另一个得到管理员密码的方法,用aio.exe(aio是All In One的缩写,是一些小工具的集合)直接读取内存中的密码,Windows 2003 SP1、SP2补丁没有打的话,也可以这样读取出来密码明文。命令格式:aio.exe -findpassword,成功读出了密码,密码为2000,如图7。

此方法只有在管理员登录了,而又没有注销的情况下才可以成功读出密码。
COMMENT[15]

论装逼
媳妇的游戏家族MV
![[H.S.T.]十六进制信息安全网官方讨论组](http://www.hackest.cn/logo1.gif)

给你点了两个~~~满意了吧.
感谢点击广告的朋友,嘿嘿……