资讯动态

crunch密码字典生成实战:5个定向口令爆破技巧详解

发布时间:2026/10/20 15:44:41 来源:尧图企业网站定制
做渗透测试或者内网口令评估的人应该都有这种体会手头的字典攒了一堆真正对上目标账号的没几条。尤其是碰到那种“有安全意识但不多”的目标——密码不是123456也不是Tr0ub4dor3而是姓名首字母加生日再拼个符号。通用字典基本只能靠运气真正有效的出路是现场生成一份贴着目标习惯的定向字典。crunch是Kali Linux里最老牌、最稳的密码字典生成工具之一体积小、参数全、生成速度快。这篇文章我把自己常用的5个实战技巧完整写一遍从字符集指定、模式匹配、过滤去重到挂hashcat规则链、输出控制和断点续传每个技巧都会给出命令示例和背后的思路。适合刚接触口令安全的新手也适合想把手头字典流程化、定制化的老手。注意以下内容仅用于授权范围内的渗透测试、漏洞评估、CTF比赛或者自己的实验环境任何针对真实系统的口令测试都必须先获得书面授权。1. 技巧一自定义字符集准确指定别让字典生成无意义的组合1.1 先搞懂crunch最基础的参数crunch的核心用法一句话就能讲清crunch 最小长度 最大长度 [字符集] [选项]不指定字符集时crunch默认使用26个小写字母abcdefghijklmnopqrstuvwxyz。很多人第一次用会踩这个坑明明想生成小写数字的8位密码直接敲了crunch 8 8等半天生成的全是字母完全用不上。原因就是没有显式给出字符集。正确定义字符集的方式是把字符集直接作为第三个参数crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 -o dict.txt这行命令会生成所有由小写字母和数字组成的8位密码输出到dict.txt。常见的字符集还可以从Kali自带的字符集文件里引用文件在/usr/share/crunch/charset.lst。先看一下里面有什么cat /usr/share/crunch/charset.lst里面定义了很多现成的字符集比如lowercase、uppercase、numeric、mixalpha、mixalpha-numeric、hex-lower等。引用方式是用-f参数crunch 8 8 -f /usr/share/crunch/charset.lst mixalpha-numeric -o dict.txt这条命令等价于用大小写字母加数字的集合生成8位密码。写起来比手工敲一长串字符集清爽也不容易漏字符。1.2 字符集里有哪些隐形的坑用自定义字符集时有三个细节特别容易翻车。第一个细节字符集里面不能有重复字符。比如你写crunch 6 6 abcabc123 -o out.txtcrunch会直接报错提示字符集里有重复项。信息大概是crunch: FATAL: Charset set abcabc123 contains duplicate characters, please modify charset set to not contain duplicates如果你是从某个文本文件里提取字符集先做一次去重再喂给crunch。比如用sort -u处理过后再拼进命令行。第二个细节特殊字符在shell里有含义。想生成包含!、#、$的密码时命令行里直接写会被shell解释掉。正确的做法是把字符集用单引号包起来crunch 6 6 abcd!#$ -o special.txt第三个细节字符集的顺序决定了字典的输出顺序。crunch会按照字符集字符串从左到右的顺序进行组合靠前的字符组合会先被输出。这意味着如果你希望字典按某种优先级排列可以把最可能出现的字符放在最前面。我在实战中会有意把目标可能用的字符往前放生成的字典优先级高爆破时往往能更快命中。提示在用crunch之前先算一下组合数量。6位长度、20个字符的字符集组合数是20的6次方也就是6400万条落盘要好几个GB。字符集每多一个字符体量都是指数级增长。心里要有一本账。2. 技巧二用模式匹配锁定目标密码的“长相”2.1 占位符规则、,、%、^信息收集做完之后目标密码往往不是完全未知的而是“看起来应该长什么样”。比如某公司要求密码必须包含大写字母、数字和特殊符号或者某人习惯用姓名拼音首字母加生日。这种时候用-t模式把密码骨架固定下来效率远高于全量穷举。crunch的-t参数支持以下几类占位符占位符含义示例小写字母abc...,大写字母ABC...%数字0-9^特殊符号!#$...举个例子生成“5位数字2位小写字母”的7位密码命令是crunch 7 7 -t %%%%%生成结果是00000aa、00000ab、00000ac……一直到99999zz。再比如公司要求密码格式是“大写字母开头小写字母数字结尾”固定模式就是crunch 8 8 -t ,%2.2 从信息收集到密码骨架一个完整推导案例模式匹配最有价值的地方在结合社工信息做定向生成。我拿一个黑盒场景举例目标信息已脱敏纯演示。假设目标账号绑定的信息是姓名Li Wei出生年份1990常用昵称lw所在地简称bj一个常见的密码习惯是“姓名首字母生日日期特殊符号”。骨架大概是lw加上8位数字再加一个!。固定字符可以直接写在-t模式里不需要占位符# 生成 lw 8位数字 ! 的11位密码例如 lw19900101! crunch 11 11 -t lw%%%%%%%%!这条命令会把lw和!当作固定字符中间8个%逐位穷举数字。再深入一层。如果目标习惯用邮箱前缀当密码密码包含符号那就有一个大坑在-t模式里默认是小写字母占位符不是普通字符。你想生成abc123这种密码直接写模式会被crunch理解成别的东西。解决办法是加-l参数把模式中第一个按字面值处理# 把 当作固定字符而不是小写字母占位符 crunch 7 7 -t abc%%% -l 这条命令生成的是abc000到abc999。如果少了-l 生成结果就完全变了。这个细节我在实战里被坑过一次当时为了生成邮箱类口令跑了半天发现生成的全是以abc开头的随机小写字母组合而不是包含符号的密码。2.3 模式匹配和字符集怎么配合-t模式下占位符使用的字符范围仍然由命令行里的字符集决定。比如你想生成3位数字1位特殊字符的密码但特殊字符只希望从!#$三个中选crunch 4 4 0123456789!#$ -t %%%这里有个天然限制字符集会对所有占位符生效crunch没办法为数字位和特殊符号位分别指定不同的字符集。所以更灵活的做法是把最确定的几位直接写成固定字符只对不确定的几位用占位符穷举。骨架推导得越准需要穷举的位数就越少字典体积断崖式下降。3. 技巧三过滤和去重参数压缩字典体积提高命中密度3.1 用-d参数限制相同字符连续出现人性化的密码一般不会出现连续一串相同字符比如aaaaab01这种对用户来说很难记住但穷举字典会照单全收白白浪费空间和时间。crunch的-d参数可以限制同一类字符的连续出现次数crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 -d 2 -o dict.txt-d 2的意思是小写字母最多连续出现2个。这样aab12345会保留aaab1234会被剔除。同理-d 2%限制数字最多连续2个-d 3,限制大写字母最多连续3个。这个参数对字典体积的削减能力很强。以8位、26个小写字母字符集为例不限制连续重复的规模是26的8次方约2088亿条。加上限制后那些aaaaaaab、bbbbbbbc这类人类几乎不会设置的密码被大量剔除剩下的候选更贴近真实口令。实操心得不建议把所有连续重复都禁掉因为现实中确实有人用www2024这种连续重复。一般限制到2或3次比较合适具体看业务场景。3.2 用-p参数做候选词排列组合还有一类目标密码是多个单词、数字拼接的比如liwei1990、lw2024!、chengdu2023。这种密码用纯字符穷举几乎不可能覆盖但用-p参数做候选词排列组合就特别快。-p参数不关心长度和字符集它把后面给出的候选词进行全排列并拼接crunch 0 0 -p Li Wei 1990输出类似1990LiWei 1990WeiLi Li1990Wei LiWei1990 Wei1990Li WeiLi1990这里0 0是固定写法因为在-p模式下长度参数实际被忽略。如果还想把符号加进去直接作为候选词即可crunch 0 0 -p Li Wei 1990 !感叹号在bash里会被解释成历史命令符号必须用单引号包起来。生成的排列会把!放在任意位置比如LiWei1990!、Li1990!Wei等。我通常在信息收集阶段会从以下资料里抽取候选词姓名拼音及首字母大小写变体生日年份、月日、完整日期电话号码后几位城市、公司名缩写常用网名、英文名有概率出现在口令里的爱好词、团队名等把这些候选词喂给-p生成的组合覆盖度很惊人。这个技巧对中文互联网场景尤其好用因为大量口令都是拼音或姓名加数字的拼接形态。3.3 管道配合grep二次筛选crunch自带的过滤能力之外还可以直接接到其他文本处理工具上做二次筛选。crunch生成的字典支持stdout输出管道是天然的筛选通道。常见筛选场景和命令只保留以数字结尾的密码crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 | grep [0-9]$ tail_num.txt剔除包含连续三位数字的密码crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 | grep -v [0-9][0-9][0-9] no_3digits.txt按行数截取前N条crunch 10 10 abcdefghijklmnopqrstuvwxyz | head -n 100000 top100k.txt这个思路的核心是crunch负责穷举grep负责筛掉不符合人类习惯的条目。组合起来不但更快还能避免先把超大字典落盘再处理节省大量磁盘空间。注意管道中grep会实时处理crunch的输出流内存占用很平稳。但管道叠加多级筛选会降低生成速度能一次写完的筛选条件就不要拆成多条管道逐级过滤。4. 技巧四联动hashcat规则链用几万条基础词爆出百万级成果4.1 为什么推荐“小字典规则链”很多人在生成字典时容易犯一个错误为了“全面”生成几个GB甚至几十GB的超大字典结果写盘慢、爆破慢、还占满整个测试机硬盘。实际上现代口令爆破的主流思路早就变成了“基础字典规则链”。规则链的原理很简单拿每一条基础密码当种子按规则自动产生变体。比如基础词admin经过“首字母大写尾部加两位数字字母o替换为0”这套规则后会变成Admin00、Adm1n00等。人脑里常见的密码变形规律一套规则就覆盖了。hashcat自带规则文件的位置在/usr/share/hashcat/rules/常用几个best64.rule官方精选覆盖最常见的64种变形leetspeak.rule字母转数字的l33t规则rockyou-30000.rule从rockyou泄露库中统计出的高频规则d3ad0ne.rule比较激进变体量很大4.2 实战用法crunch出基础词hashcat出变体流程分三步。先用crunch生成一批基础词不管多少能贴题就行。比如我们通过前面的模式匹配生成一个只有几千条的基础字典crunch 0 0 -p Li Wei 1990 ! -o base.lst然后用hashcat的--stdout模式把规则跑出来重定向到最终字典hashcat --stdout -r /usr/share/hashcat/rules/best64.rule base.lst expanded.txt这一步会把base.lst里的每条词按best64.rule生成几十上百条变体最终expanded.txt可能直接膨胀到几十万行。如果你在爆破的是哈希值而不是在线服务还可以跳过落盘步骤直接让hashcat读取基础字典配合规则现场扩展hashcat -m 22000 hash.hc22000 base.lst -r /usr/share/hashcat/rules/best64.rule -O -w 3这个例子里的-m 22000对应WPA握手包如果是NTLM哈希换成-m 1000其他哈希类型查hashcat帮助文档就行。用这套流程你不需要让字典“覆盖所有可能性”只需要让基础词加规则覆盖目标最可能的密码习惯命中率和效率都比硬跑巨型字典高一个量级。4.3 自己写规则文件精确模拟目标习惯除了内置规则完全可以按目标习惯写一个规则文件。规则文件语法很直观一个规则一行。比如$2$0$2$4这行的含义是在每条密码末尾追加2024。$2表示追加字符2$0表示追加字符0以此类推。想在末尾追加!写$!把基础词首字母大写写c比如做一份针对“姓名组合加年份”的定向规则$1$9$9$0 $2$0$2$3 $2$0$2$4 c$1$9$9$0然后配合基础词跑hashcat --stdout -r my_rule.rule base.lst target_dict.txt基础词只有几个规则也只有几行最终字典能把目标最可能的密码习惯全部包含进去。实操心得规则链最大的优势是同样的磁盘空间更大的覆盖面。一个10MB的基础字典经过规则扩展后在爆破时等价于几百MB甚至几GB的巨型字典但无需落盘速度还更快。这是我现在最推荐的生产套件。5. 技巧五输出控制与断点续传解决字典生成失控问题5.1 生成前先估算体积按需分卷和压缩crunch字典生成失控是新手最常见的翻车点。明明以为生成几百MB结果跑到一半磁盘爆了。所以在任何生成命令执行前先算一下总组合数。组合数公式很简单密码固定长度L、字符集大小C总数就是C的L次方。比如长度8、字符集62大小写数字的总数是62的8次方约2.18乘10的14次方。这个量级落盘完全是灾难必须提前规划。crunch支持按体积或按行数分卷。按字节大小分卷crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 -b 100mb -o START生成的每个分卷文件叫crunch-0.txt、crunch-1.txt……每个100MB。-o START是固定写法crunch会按指定体积自动切分多个文件。按行数分卷crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 -c 5000000 -o START每个分卷500万行。分卷的好处是后续处理、排序、分发到多台机器都方便。如果只是最终存档建议直接用压缩输出crunch 8 8 abcdefghijklmnopqrstuvwxyz0123456789 -o dict.txt -z gzip会生成dict.txt.gz。实测字典文本压缩率很高几个GB的纯文本经常能压到几百MB。crunch支持gzip、bzip2、lzma、7z等格式对应参数是-z gzip、-z bzip2等。5.2 断点续传与多终端并行跑一个大字典跑到三分之一不小心CtrlC了。重新跑又得从头开始那种感觉真的不好受。crunch虽然没有“暂停继续”功能但可以通过-s参数指定从哪个字符串开始生成变相实现断点续传。比如你之前在aaaaaa前的条目已经生成完了现在想从babcde继续crunch 6 6 abcdefghijklmnopqrstuvwxyz -s babcde -o part2.txt这样crunch会跳过babcde之前的所有组合直接从babcde开始生成剩余部分。配合重定向符号还可以实现真正的追加续写。之前生成的字典有一部分存在dict.txt里现在新跑的区间追加到文件末尾crunch 6 6 abcdefghijklmnopqrstuvwxyz -s babcde dict.txt注意这里是而不是用会覆盖之前生成的内容。我踩过一次这个坑一个跑了半小时的字典被一条命令直接清零。多终端并行也基于同样的逻辑。把字符集或起始字符串按区间切分每个终端跑一段。比如并行生成8位小写字母字典分成两个区间终端Acrunch 8 8 abcdefghijklmnopqrstuvwxyz -s aaaaaaaa -e mzzzzzzz -o dict_a.txt终端Bcrunch 8 8 abcdefghijklmnopqrstuvwxyz -s naaaaaaa -o dict_b.txt-e参数指定结束字符串。终端A跑a开头到m开头的区间终端B从n开头跑到z开头互不干扰。这种方法在有多核CPU或几台机器时可以成倍缩短生成时间。实操心得多终端并行还有一个常用变体不追求覆盖全集而是让不同终端各自生成不同“风格”的子域。比如一个跑纯数字、一个跑小写数字、一个跑带符号量体裁衣定向爆破时更实用。6. 实操中容易翻车的几个细节报错排查与效率心得6.1 高频报错对照速查日常使用中crunch的几个报错和坑我整理成了一张速查表对号入座就能解决。报错或现象原因解决方案Charset contains duplicate characters字符集里出现重复字符去掉重复或先用sort -u去重生成的字典全是小写字母没指定字符集走了默认值显式把字符集写在第三位模式里的不是固定字符-t模式下被当成占位符配合-l参数把当普通字符特殊符号被shell吃掉了没加引号!和$被bash解释用单引号把字符集或模式包起来磁盘满了组合数估算不足先算总数配合-b、-c分卷或-z压缩想续跑发现文件被覆盖用了重定向而不是追加时用或者用-s重新生成新文件带空格的候选词不生效命令行空格被拆分用引号包裹包含空格的候选词以上每条我都在实际测试环境里遇到过有些甚至踩了好几次才反应过来。比如-l 那个坑当时为了生成包含符号的口令跑了半天发现生成的全是小写字母组合核对帮助文档才意识到需要-l参数。这类问题不值得别人提醒第二遍把命令检查清单拉出来逐项比对是最稳的。6.2 我对字典“命中率”的几点亲测体会最后分享几个我在多次授权测试中形成的心得和习惯。第一个心得字典兵贵精不贵多。很多人总觉得字典越大越安心实际在线爆破场景中一个10万条的高质量定向字典比1000万条的通用字典命中率高出很多因为前者每一条都贴合目标画像。用前面的技巧生成几千条精确候选远比下载几个GB的通用字典直接跑有效。第二个心得信息收集的质量直接决定字典上限。crunch只是个生成工具真正决定命中率的是你对目标的画像是否准确。姓名、生日、爱好、工作、常用平台这些信息整理得越细候选词越准后面所有技巧发挥的作用越大。第三个心得把生成流程沉淀成脚本。我现在通常把“候选词整理—crunch生成—规则扩展—去重压缩”整套流程写成一个shell脚本参数化目标信息。一次配置后续每次测试改改变量就能直接跑。这不仅省时间还能避免手动敲命令时漏掉关键参数。最后再分享一个实际使用中的小细节crunch生成完字典后我习惯先用wc -l看看行数是否和估算的匹配再随机抽查头几十行确认格式正确。这十几秒的检查能避免整个字典因为一个参数错误全部作废生成大字典时尤其值得把这一步固化到流程里。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑