十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

pwdump+hashcat:Windows密码哈希提取与离线破解实战

pwdump+hashcat:Windows密码哈希提取与离线破解实战 先把话说清楚这篇文章不是教你去偷谁的密码也不是什么黑产入门。它讲的是正经的安全测试和密码恢复场景比如老机器管理员密码忘了、企业做内部账号安全审计、或者做取证分析时需要验证一个hash对应的明文。我自己是在VMware虚拟机里搭了一台Win7 SP1做实验用pwdump导出系统账号的NTLM哈希再交给hashcat跑GPU爆破走完整条链路。顺便把原理也讲明白免得你只会敲命令换个环境就抓瞎。1. 为什么是pwdump加hashcat破解链路中的分工逻辑1.1 Windows密码到底存在哪里Win7的本地账号密码不是以明文存在系统里的也不会以加密后的密文这种形式放在一个文件里。准确地说Windows把用户密码的哈希值存放在SAMSecurity Account Manager文件里路径是C:\Windows\System32\config\SAM。这个文件在系统运行时被内核锁定普通状态下你没法直接复制它即使复制出来了也需要特殊工具去解析里面的二进制结构。这里有个很关键的概念要厘清Windows存储的不是密码本身而是密码的哈希。Win7时代主要涉及两类哈希LM Hash早期遗留的老算法把密码转成大写、分割成两组7个字符再做DES加密。安全性很差但从Vista开始系统默认不再生成LM HashWin7里你看到的多半是空值。NT HashNTLM Hash把密码转成UTF-16LE编码然后做一次MD4运算得到一个32位的十六进制字符串。这才是Win7真实校验密码时用的东西。用一个生活类比帮你理解哈希就像是你把一张纸塞进碎纸机之后得到的碎纸条。碎纸条不能还原成原来的纸但如果你有一台机器能不停地尝试不同的纸塞进去是不是刚好能出同样的碎纸条那你就能反推出原来那张纸上的内容。pwdump负责取出碎纸条hashcat负责暴力试纸。1.2 pwdump和hashcat各自干哪一段活pwdump系列工具解决的是怎么从运行中的系统里把SAM中的哈希安全地导出来这个问题。它利用的是注册表中HKLM\SAM的访问接口在拥有管理员权限的前提下枚举本地用户并把每个用户的RID、LM哈希、NT哈希按固定格式打印出来。hashcat解决的是拿到哈希之后怎么把它变回明文密码这个问题。它支持CPU和GPU通过OpenCL或CUDA驱动调用显卡的并行计算能力把海量的密码候选值换算成哈希和你的目标哈希比对。NTLM哈希属于MD4家族的变种计算量小非常适合GPU并行这也是为什么它能跑到每秒几十亿次甚至上百亿次尝试。这两者是一种典型的互补关系pwdump负责从封闭系统里把密码的指纹拿出来hashcat负责用算力把指纹还原成人话。缺了前者你手上没有目标缺了后者你拿到哈希也只能干瞪眼。1.3 为什么说离线破解比对着登录框试密码聪明一个量级很多人一想到破解密码第一反应是拿个工具去登录界面不断试密码。这其实是效率最低、动静最大、最容易把账号锁定的办法专业话术叫在线爆破。Win7默认有账户锁定策略的情况下连续输错几次就锁账号了。离线破解的思路完全不同先把哈希导出来回到自己的机器上慢慢算。系统完全不知道你在算不存在锁定问题也没有网络超时延迟GPU可以全速运转。用一个数据说明差距在线爆破一秒试10次密码已经算很快了但hashcat跑NTLM哈希一张中端显卡一秒能试几十亿次。中间隔着9个数量级这已经不是快慢的区别而是能不能做的区别。2. 搭建取证沙箱VMware里装Win7的细节和坑2.1 为什么要用虚拟机能不能直接用物理机我强烈建议用虚拟机做这个实验理由有三个。第一安全隔离pwdump这类工具会被杀毒软件高度警惕在虚拟机里即使报毒也不影响宿主机环境。第二快照能力你在Win7里怎么折腾都行出问题回滚一个快照就回到干净状态。第三文件交换方便导出的hash文件能通过共享目录直接拖到宿主机省去U盘拷贝的麻烦。VMware Workstation Pro或者Player都行我用的是Workstation Pro因为创建快照和调整虚拟机配置更方便。如果你用的是VirtualBox流程也完全一样只是共享文件夹设置路径略有差异。2.2 新建虚拟机的关键配置创建虚拟机时有几个配置会影响后面的实验体验值得注意操作系统版本选择Windows 7位数建议64位后面装的工具兼容性更好。内存2GB就够Win7老系统1GB也能跑但2GB更顺畅。CPU给2核即可虚拟机性能不是重点重点在宿主机显卡。硬盘40GB够用Win7安装包也就几个GB加上工具和缓存完全足够。网络NAT模式即可虚拟机不需要暴露到外部网络只需要能联网下载系统更新和工具。VMware Tools装完系统第一件事就是装VMware Tools否则共享文件夹和拖拽文件都用不了。Win7 iso镜像网上很好找下载时需要认准SP1版本。装系统阶段跟普通电脑装系统没有区别一路下一步就行中间可能要求输入密钥实验用途随便填一个能过的版本即可或者选择跳过。装完后进系统你看到那个熟悉的经典桌面整个沙箱环境的基础就算搭好了。2.3 创建测试账号和密码时的策略实验前建议规划好测试账号而不是直接拿Administrator练手。我在虚拟机里做了两个账号账号密码设计意图Administrator12345678演示8位纯数字掩码秒破labusersunshine演示rockyou字典命中这里有个经验之谈密码设置一定不要脱离实际否则演示效果会失真。如果你只测试123456这种密码破解结果虽然快但说服力不够。我的策略是覆盖两类高发场景——纯数字弱口令和常见英文单词这样后面跑hashcat时两种攻击模式都能直观呈现。密码设好后创建快照。这一步至关重要后面万一pwdump跑挂了或者系统搞坏了一键恢复不用从头装系统。快照命名建议写成clean-install-with-test-accounts方便辨认。3. 提取哈希pwdump在Win7上的实际使用细节3.1 pwdump系列版本选择pwdump工具在安全圈里是个老字号迭代过多个版本。最初的pwdump是2002年前后的产物后来发展出pwdump6、pwdump7、pwdump8。Win7 SP1下我测试过pwdump7和pwdump8都能正常工作但pwdump7的兼容性最广网上资料也最多。值得注意的是pwdump7的发布时间很早部分杀毒软件会直接把它识别为黑客工具并拦截运行。我在实验里用的是干净虚拟机没有装第三方杀毒Windows Defender也临时关闭了。如果你的虚拟机里装了杀毒建议先把虚拟机的共享目录和下载目录加白否则文件刚下载下来就被吞了。3.2 在Win7里运行pwdump的完整过程双击或命令行进入pwdump7的解压目录注意必须右键以管理员身份运行cmd否则会提示权限不足。Win7有UAC机制普通权限下pwdump7无法访问注册表SAM键值。执行命令cd C:\pwdump7 pwdump7.exe C:\share\hashes.txt运行结束后查看hashes.txt输出格式长这样Administrator:500:NO PASSWORD*********************:31d6cfe0d16ae931b73c59d7e0c089c0::: Guest:501:NO PASSWORD*********************:31d6cfe0d16ae931b73c59d7e0c089c0::: labuser:1001:NO PASSWORD*********************:2d20d252a479f485cdf4e171d8213d2f:::这里要解读一下这个格式。第一个冒号段是用户名第二个是RIDRelative Identifier即用户在系统内的唯一编号Administrator固定是500第三个是LM哈希第四个是NT哈希后面两段是注释位。细心的你会发现LM哈希位置显示的是NO PASSWORD*********************而不是一串十六进制。这是因为Win7默认禁用了LM哈希所以这个字段没有实际值。网上有些老教程显示LM位置是AAD3B435B51404EEAAD3B435B51404EE那是空LM哈希的标准表示法pwdump7用了一段带星号的文字来表达同一件事原样复制时要注意这个差异。另外我实验里Administrator的NT哈希是31d6cfe0d16ae931b73c59d7e0c089c0这是空密码的固定值因为我在实验里只给labuser设置了密码Administrator保持空密码。3.3 把hash交给hashcat前必须做的整理工作pwdump7输出的格式虽然信息完整但直接把整个文件扔给hashcat有时会因为它对LM段特殊字符的解析而产生干扰。实战中最稳妥的办法是只把NT哈希提取出来格式一行一个。在Win7的命令行里可以用for循环处理也可以在宿主机上用文本编辑器手动整理。手动整理虽然看起来原始但对理解哈希格式反而有好处。整理后的nt-hashes.txt内容应该是31d6cfe0d16ae931b73c59d7e0c089c0 2d20d252a479f485cdf4e171d8213d2f如果你一定要保留用户名映射hashcat也支持用户名:哈希的格式Administrator:31d6cfe0d16ae931b73c59d7e0c089c0 labuser:2d20d252a479f485cdf4e171d8213d2f我个人习惯用这种带用户名的格式因为破解出结果时hashcat的--show输出会直接告诉你哪个用户对应哪个密码不用再去对照RID猜人。整理完毕把文件放进VMware共享目录也就是我的实验里pwdump输出重定向到的C:\share宿主机这边就可以开工了。4. 真正耗时的部分hashcat模式选择、字典策略与性能调优4.1 hashcat安装和基础验证hashcat在Windows下的安装方式极其简单从GitHub官方仓库下载zip压缩包解压到一个路径里没有空格的目录我用的是C:\hashcat然后打开cmd进入该目录就能跑。它不需要安装步骤因为它本身就是一个带各种依赖的独立可执行文件集整个工具链都打包在目录里。运行前先确认GPU驱动正常hashcat依赖OpenCL运行时。NVIDIA显卡装上较新的驱动后一般自带OpenCL支持AMD同样。你可以在hashcat目录下执行hashcat.exe -I查看OpenCL设备列表。如果列表里能看到你的显卡说明环境正常。如果显示CPU是唯一设备说明GPU的OpenCL驱动没有装好这是Windows下最常见的问题NVIDIA用户去官网装Game Ready或Studio驱动都能解决。接着做一个基准测试这一步不是为了炫耀跑分而是帮你建立直觉——知道自己的设备每分钟能试多少密码组合后面设计破解策略时才知道什么方案可行hashcat.exe -b -m 1000-b是benchmark-m 1000是NTLM哈希模式。我实测中端显卡大致是GTX 1660 Super到RTX 3060这个区间NTLM哈希的跑速在每秒几十亿次量级。当你知道这个数字再算8位纯数字密码的破解时间就很简单了8位纯数字一共10的8次方也就是1亿种组合。用几十亿次每秒的算力去跑一秒钟都不要。4.2 8位纯数字掩码攻击演示掩码攻击对应hashcat的-a 3模式。它的思路是你事先告诉hashcat密码的字符集和长度结构hashcat按这个规则穷举所有排列组合。比如8位纯数字掩码就是八个?d?d代表0到9的数字。hashcat.exe -m 1000 -a 3 nt-hashes.txt ?d?d?d?d?d?d?d?d跑这个命令时注意看输出。hashcat会实时刷新当前尝试的密码、速度、耗时、已破解数量。8位纯数字在GPU下几乎是瞬间出结果我这边连截图反应时间都不太够。破解成功后用--show命令查看明文hashcat.exe -m 1000 -a 3 nt-hashes.txt ?d?d?d?d?d?d?d?d --show你会看到12345678赫然列在Administrator账号后面。到这里实验的第一个演示闭环就完成了。这里补充一个关键参数-w。它控制工作负载取值范围1到4默认是2。想让显卡全速跑就加-w 3代价是GPU温度升高、风扇噪音大甚至影响你用同一个显卡干其他事。特斯拉卡和服务器卡没有显示输出可以放心跑-w 4消费级显卡建议-w 3封顶。4.3 字典攻击rockyou的命中率为什么这么高字典攻击对应-a 0模式。它的核心假设是大量用户设置的密码不是真正随机的而是来自一个可预测的集合——常见单词、姓名、键盘序列、生日组合。把几千万个这样的常见密码整理成字典逐个尝试命中率远超你想象。安全圈最著名的字典是rockyou.txt它来源于2009年一次真实的密码泄露事件RockYou公司把用户密码明文存在数据库里后来被拖库整个文件公开。这份字典里有超过1400万条真实密码是安全测试的标准配置。从GitHub上搜rockyou.txt能下载到解压后大概100多MB放在hashcat目录下的dict文件夹里比较整齐。执行字典攻击hashcat.exe -m 1000 -a 0 nt-hashes.txt dict\rockyou.txt在对labuser账号的密码破解中sunshine在rockyou.txt里排在前几百名的位置几乎是秒破。如果这条密码在字典靠后位置就要看你的GPU跑速和字典大小来估算时间了。1400万条的字典按每秒几十亿次的速度哪怕密码排在最后一位也就几毫秒的事对NTLM哈希来说字典攻击永远是最先尝试的方案。4.4 复杂密码怎么办规则集和掩码组合如果用户的密码既不在字典里也不是纯数字而是类似Lab2025这种结构呢这时候就要引入两类手段。第一类是规则集对应参数-r。规则的作用是在字典基础上做变形把字典里的单词首字母大写后面加两位数字把o替换成0把a替换成。hashcat自带的rules\best64.rule包含了64条经实战验证的高命中率规则跑法如下hashcat.exe -m 1000 -a 0 nt-hashes.txt dict\rockyou.txt -r rules\best64.rule规则攻击的妙处在于它没有扩大字典本身的规模而是让字典活了。password可以变成Password、Password1、Pssword、PASSWORD2019一条字典记录衍生出几十上百条候选密码。我看过不少渗透测试报告里规则攻击的命中率比纯字典高出一大截就是因为现实中大多数看似复杂的密码底层仍然是字典词加规律变形。第二类是掩码组合。如果你知道目标密码的一部分规律——比如公司强制要求首字母大写、至少8位——就能把这个规律写成掩码。假设要破解Lab加6位数字这样的格式hashcat.exe -m 1000 -a 3 nt-hashes.txt Lab?d?d?d?d?d?d这个例子里的掩码长度是9位但实际候选空间只有10的6次方也就是100万种组合对GPU来说是一瞬间的事。掩码攻击的精髓不是随机硬撞而是把你知道的信息压缩进掩码规则大幅缩小搜索空间。4.5 一张表看懂三种模式的选择逻辑攻击模式参数适用场景示例命令字典攻击-a 0目标可能用了常见弱密码-a 0 hash.txt dict\rockyou.txt组合攻击-a 1密码由字典词拼接而成-a 1 hash.txt dict1.txt dict2.txt掩码攻击-a 3知道密码结构或强制策略-a 3 hash.txt ?u?l?l?d?d?d?d?d混合攻击-a 6 / -a 7单词加数字或数字加单词-a 6 hash.txt dict\rockyou.txt ?d?d?d?d规则攻击-r 规则文件字典命中不够时做变形扩展-a 0 hash.txt dict\rockyou.txt -r rules\best64.rule实际工作中我不建议把这几种模式当成单选题。标准的破解流程是先跑字典字典不出加规则跑规则不出再用掩码最后才考虑纯暴力。每一步都有明确的成本和收益考量而不是盲目堆算力。5. 踩坑记录杀毒拦截、格式不兼容和那些破解不出来的瞬间5.1 Windows杀毒软件与老工具的矛盾pwdump7下载下来那一刻你的宿主机杀毒软件就可能报警。这并不奇怪因为安全工具的检测逻辑是行为识别——读取SAM哈希的行为本身就容易被判定为恶意。我在实验前就做了防护措施把虚拟机的下载目录加入杀毒白名单并把pwdump7所在的文件夹列为排除项。但这里有个更隐蔽的问题值得提醒即使你关闭了杀毒Windows Defender的云保护和实时保护在某些情况下还是会秒删文件。做好虚拟机快照是一种成本最低的防护策略万一文件没了回滚快照重新下载再来一遍全程不超过五分钟。另外pwdump7运行时要求系统装了.NET Framework 2.0以上Win7 SP1自带更高版本一般不构成障碍。但我确实遇到过Win7精简镜像把.NET组件砍掉的情况这时pwdump7会弹出一个不友好的错误对话框。判断方法很简单运行pwdump7.exe不带参数如果它能打印出用法说明说明运行环境没问题再谈导出哈希的事。5.2 hashcat不认hash文件的格式问题这是新手最常遇到的坑。我把pwdump输出原样保存为hash文件后直接跑hashcat结果提示No hashes loaded。排查了半天问题出在三个方面按出现频率排序第一不可见字符。在Win7命令行里用重定向生成的txt文件默认是ANSI编码但hashcat期望UTF-8。如果你复制出来的哈希中夹带了一些不可见控制字符hashcat会认为这行不是合法哈希并跳过。解决办法是在宿主机上用文本编辑器重新整理一遍hash文件另存为UTF-8无BOM格式或者干脆手打哈希内容。第二pwdump7的NO PASSWORD星号字段。前面提过标准pwdump格式中LM段应该是一串十六进制但pwdump7用NO PASSWORD*********************来表示空LM。这个特殊字符串如果原样进hashcat部分版本的解析器会识别混乱。所以我在第3.3节强调了整理成纯NT哈希一行一个不要偷懒直接扔整个输出文件。第三空行和换行符。Windows的txt文件用CRLF换行Linux工具链对CR敏感hashcat在Windows下运行一般兼容但如果你把文件从虚拟机拖到宿主机再传到Linux服务器上跑hashcat\r那个隐藏换行符就会让哈希失效。经验做法是在Linux下先执行dos2unix hashes.txt。5.3 显卡驱动和hashcat的兼容性妖孽问题hashcat在Windows上有个经典报错大意是OpenCL设备初始化失败或者提示你的GPU compute capability太低。前者通常发生在驱动安装不完整时后者出现在特别老的显卡上。我实验用的虚拟机是给Win7用的但hashcat跑在宿主机Windows 10上两者没有关系所以这个问题不在实验主链路里。如果hashcat提示让你加--force我的建议是不要一股脑照做。要先搞清楚它为什么不爽。强行忽略警告可能让你在错误的设备上跑速度慢得离谱。报错信息里通常会写清楚原因比如驱动版本过旧、GPU不支持某种类型的内核优化等。对症下药该升级驱动就升级驱动不要用--force掩盖问题。另外多说一句hashcat的优化参数-O对NTLM哈希影响很大它会启用内核优化用更多的寄存器换取更少的指令跑速可能快一倍以上。在支持该优化的显卡上我都是默认带上-O。如果你的显卡是入门级或者老架构加-O反而可能编译失败报错后去掉它再跑就行。5.4 密码跑不出来时先怀疑方案而不是怀疑算力有一次我帮朋友恢复一台旧电脑的密码拿到的是个16位混合大小写数字符号的密码。我按惯性思路上了8位纯数字的掩码跑了半小时毫无进展才意识到自己搞错了方向。这一步可以反向验证先拿已知密码去生成一份正确的哈希确认工具链可以跑通再解真实目标。验证方法很简单。把已知密码的NT哈希和真实目标的哈希放在同一个文件里跑一遍字典攻击。如果已知密码的哈希能被破解出来而目标哈希破解不了说明工具链没问题是密码本身太强需要换策略。如果已知密码的哈希也破解不出那就说明你的攻击方案或者参数有误问题出在流程上而不是算力上。这个反向验证的思路是我做安全测试时最常用到的排错手段。很多人一遇到破解不出来就想着加大字典、加长掩码、上更强的卡其实方向错了应该先确认自己的流程是不是通的。哈希格式不对、模式选错、hash文件里有脏字符这些问题都不是算力能解决的。5.5 一次典型排错的过程复现我把整个实验过程中印象最深的一次排错记录贴出来你可以对照自己的情况。现象hashcat运行后进度条一直在跑但Recovered始终是0。 第一次排查怀疑字典没对上换了rockyou和多个常用字典跑出来一直是0。 第二次排查怀疑目标哈希有问题于是把一个已知明文密码的哈希比如admin:admin对应的NTLM混进文件里一起跑结果这个已知哈希也破解不出来。 定位问题出在命令模式或hash文件上不是密码强度问题。 最终原因hash文件是UTF-16编码。在Win7里我用记事本另存哈希不小心被存成了Unicode格式hashcat读取时哈希字符串中间夹杂了大量空字节导致每行哈希长度远超32个十六进制字符直接被判定为非法或者解析错误。 解决重新用Notepad或VS Code打开另存为UTF-8无BOM再跑一次秒破。5.6 一些值得保留的习惯给虚拟机里的Win7设共享目录之前先测试双向拷贝是否正常否则导出哈希文件时会卡在文件交换这一环。把原始pwdump输出文件保留一份不要只留整理后的NT hash文件。万一你需要确认某个哈希属于哪个用户或者怀疑自己整理时弄错了原始文件就是备份。破解完成后--show命令查看结果前不要删除potfile。hashcat的potfile是hashcat.potfile记录着已经破解出来的哈希和明文。如果中途跑挂了重启hashcat时它会自动跳过已破解的条目节省时间。但在校验结果时--show只显示potfile里的内容你要确保potfile和你的哈希文件对应得上。跑完破解实验后记得及时清理虚拟机快照中的共享文件hash文件本身并不敏感但和破解工具放在一起容易被杀毒软件误判为攻击行为。我个人的习惯是实验结束后删除含哈希的txt文件只保留pwdump原始输出的备份放在加密压缩包里。安全测试的合规性说到底就是从这些细节里做起的。6. 实验总结从这条链路到更复杂的真实场景我不打算给你一个Windows密码破解速成结论。这个实验真正有用的地方是帮你理解整条离线破解链路的运转逻辑目标系统的哈希从哪来、怎么导出、用什么形式交给计算设备、攻击策略有哪些、为什么某些策略比另一些快几个数量级。这套逻辑换到任何其他系统都通用——Linux的/etc/shadow、Windows域的NTDS.dit、各类应用的密码哈希都是同一个套路只是哈希算法和导出方式不同。我个人在实际操作中还有一个体会这类实验的价值不只是跑出几个密码的成就感而是你会从此对密码策略产生敬畏心。自己动手跑一次才会直观感受到一个8位纯数字密码在GPU面前有多脆弱才会理解为什么现在的等保要求都要强制16位以上的复杂密码、为什么要上多因素认证。安全测试工具本身是中性的它既能把弱密码暴露出来也能逼着我们构建更强的防线。最后分享一个小技巧。如果想继续练手可以给Win7装一个域环境导出域用户的哈希集合再试试用规则攻击跑一份真实业务场景下的复杂密码样本。你会发现同样的工具链从单机到域环境从破解一个账号到批量化评估一批账号威胁面和控制点都完全不同那又是另一层值得深入的内容了。
返回列表