恒美微站
首页
关于我们
建站服务
主题模板
案例展示
资讯中心
联系我们
CTF压缩包爆破实战:从密码原理到hashcat与掩码攻击全解析
首页
资讯中心
/
CTF压缩包爆破实战:从密码原理到hashcat与掩码攻击全解析
CTF压缩包爆破实战:从密码原理到hashcat与掩码攻击全解析
发布时间:2026/9/25 3:54:41
那天比赛还剩半小时队长突然在群里扔进来一个zip附件注释就一句话password?flag。群里瞬间安静了。我们几个人轮流试了题面里所有单词、常见弱口令、各种谐音组合眼看着时间一分一秒过去。最后解开密码的是队里平时最沉默的一个人——他看了十秒钟题面说出一个英文单词我们一试zip当场解开了。那一刻我才真正意识到CTF里的压缩包密码爆破从来不只是一条命令跑到底的事情。CTF压缩包密码爆破是Misc杂项里出现频率最高、同时也是新老手差距最明显的一类题。它考察的不只是你会不会用hashcat而是你会不会在读题、信息收集、密码猜测方向判断上比出题人想得更远。这篇东西我打算从原理讲到实战从工具选型讲到底层绕过把我在比赛里踩过的坑一并写出来。不敢说“吃透这一篇就够”但把这套流程走完常规比赛里出现的压缩包题十有八九是挡不住你的。1. 先说清楚爆破的本质是语料搜索不是随机猜密码很多人一想到压缩包爆破脑子里浮现的画面是一个软件在那边疯狂跑数字字母组合屏幕上滚动着密密麻麻的进度条。这个画面不能说错但它只占真实场景的一小部分。现代压缩包加密主要分两大流派。一种是老式的ZipCryptoPKZIP传统加密算法本身有弱点速度也快hashcat对它的破解可以达到很高的吞吐量。另一种是AES加密比如WinRAR 5以上、7-Zip默认的AES-256在没有明确线索的情况下靠纯暴力算到宇宙灭亡也算不出来。所以你在CTF里遇到的那些“跑几分钟就出来”的题绝大多数是ZipCrypto加密或者密码本身极其简单。认清这一点你就明白了一个反常但关键的结论CTF压缩包爆破本质上不是“猜密码”而是“从语料库里找密码”。出题人出的每一个密码一定是有来源的。可能是题面描述里的某个词可能是文件名的谐音可能是图片隐写里藏的一行字符串也可能只是他顺手敲的“123456”。这些密码不是均匀随机分布的而是一堆“人话”里的某个片段。爆破工具的字典攻击和掩码攻击做的事情就是把海量的“人话”片段和它们的排列组合快速试一遍而不是从零开始逐一遍历字符空间。1.1 为什么有的zip永远也“爆”不出来我见过不少新手对着一个AES-256加密的压缩包用暴力掩码跑了好几天得出一个退坑的结论。问题的根源在于他们没有先判断加密算法。AES-256在密码足够长、足够随机的情况下是没有任何工具能暴力破解的这是密码学上的数学结论跟你的显卡好坏无关。CTF里如果出了这种题那密码一定在题目信息里而不是靠爆。而ZipCrypto因为密钥生成过程中有一些概率性的弱点才给了字典攻击和掩码攻击足够的空间。所以拿到压缩包的第一件事不是急着跑hashcat而是鉴定两件事这个包是什么格式的加密密码可能藏在哪个方向上前者决定了你该选哪个工具和哪个破解模式后者决定了你该喂给它什么语料。1.2 CTF里密码通常藏在哪七个地方根据我刷过的几百道题压缩包密码的来源基本集中在下面这几个位置。每拿到一个加密压缩包你脑子里就应该过一遍这张清单位置常见形态举例题目描述明文单词、句子的一部分“His birthday is in 2003”暗示8位生日密码压缩包文件名与注释companionship命名花哨注释藏key文件名是mysecret密码可能是mysecret或变体其他附件隐写图片、音频里的字符串图片末尾附加文本、磁道音谱转文字压缩包内文件名某些题目压缩包密码能列目录但解压不了文件名本身是密码常见弱口令123456、password、qwerty等送分题字典秒开出题人的习惯选手ID、队伍名、昵称、学校简称密码是他ID比赛年份明文隐藏题目描述里的标记大小写、首字母、触摸序列每句话首字母连起来是密码这七个地方我建议你每道题都过一遍而不是一上来就无脑跑字典。1.3 所谓“爆破”就是把语料库从大到小地试如果一个密码你确定它存在于某个方向但又不知道具体是哪个词剩下的工作就是把该方向上的语料全部列出来一个个试。这是压缩包爆破的真实工作流先信息收集再生成专属语料再交给工具执行最后验证。我自己的习惯是读题的同时就把可能成为密码的词汇写进一个txt题目描述里所有名词、形容词、动词附件文件名谐音变体加年份、加常见后缀123、、!形成一个十几行的专属字典。这个字典的破解效率往往比两千万行的rockyou.txt高得多。2. 工具选型别一上来就迷信hashcat工具这块我觉得得单独拿出来说。因为我在新手群里看到最多的就是一提爆破就是hashcat一上来就装驱动、烧显卡结果跑了一道本来用个小工具几秒钟就出的题。2.1 三款主流工具的真实差别先看这张对比表是我在实际使用中的感受工具加密算法支持速度适用场景缺点hashcatZipCrypto、7z AES、RAR等120模式极快GPU并行大规模字典、复杂掩码、规则需GPU/OpenCL环境参数多容易选错John the Ripper配合zip2john/7z2john使用一般CPU为主快速起步、跨平台、格式兼容好速度上限低大字典慢fcrackzip仅ZipCrypto一般快速验证小密码空间不支持AES不支持7z功能有限我的建议是hashcat和John两者都装缺一不可。hashcat负责攻坚John负责起步和验证。fcrackzip可以装但你大概率会很快就发现它的局限比如遇到7z它就无能为力了。2.2 我的选择逻辑实际比赛里我的流程通常是这样的先用zipinfo或者7z看一眼加密方式如果是ZipCrypto且密码空间不大直接用fcrackzip或者John的字典模式几秒钟就试完如果密码空间大、需要跑复杂掩码就转hashcat上GPU。hashcat最大的门槛不是安装而是驱动。NVIDIA显卡需要装CUDA和对应驱动A卡走OpenCL。很多人卡在这步就放弃了。我的建议是先跑一个最简单的示例哈希验证环境没有问题再去跑真正的题目。否则你花半天调参数最后发现是驱动版本的问题血亏。另外如果你是刚接触CTF的零基础选手也可以先用一些集成的编码解密工具箱这类工具把压缩包解密界面化了适合验证一个密码后快速解包。但它只能做单点验证没法做上百万次的自动枚举真正的爆破你还得回到命令行。2.3 字典从哪里来字典的质量直接决定爆破的成败。我常用的几个rockyou.txt经典中的经典两千万行覆盖了绝大多数人类会设的弱密码。SecLists的Passwords目录分类清晰有专门针对年份、月份、键盘序列的字典。自己积累的CTF专属字典每做完一道题把密码及其来源记下来放进一个专门的文件里。这东西攒多了之后很多题的密码一眼就知道是什么路数。注意一点rockyou.txt是从一个真实网站泄露的密码库整理出来的里面有大量带空格的短句、键盘序列、人名拼音这些恰恰是CTF出题人最爱的密码形态。3. 第一次完整爆破从提取哈希到拿到flag现在我带你完整走一遍常规流程。假设我们拿到了一个加密的flag.zip密码未知。3.1 第一步永远是鉴定加密算法用7z或者zipinfo先看一眼压缩包的加密类型。zipinfo -v flag.zip输出里会有一段关于文件加密方式的说明。如果你看到类似“ZipCrypto”的字样恭喜可以爆。如果看到“AES-256”先回头把题面和附件翻一遍别急着爆。同时用7z命令也可以确认7z l -slt flag.zip里面有一项“Encryption method”直接标明了算法。3.2 用zip2john提取hash确认是ZipCrypto之后我们得把zip的加密信息改写成hashcat能识别的格式。这个步骤叫“提取hash”用的是John the Ripper自带的zip2john工具。zip2john flag.zip flag_hash.txt执行后flag_hash.txt里会生成一行长字符串。这一行就是压缩包加密密钥派生过程中可以被离线字典匹配的哈希值。它的格式类似$zip2$0$...具体内容不用看懂工具认识就行。如果是7z格式用7z2john7z2john flag.7z flag_hash.txt这里我提醒一句zip2john的版本要和john匹配否则后面拿john跑的时候会提示格式不识别。如果你用的是Kali自带的那套一般不会有问题如果你自己编译安装的注意PATH里到底调用的是哪个版本。3.3 hashcat字典攻击实战拿到hash后先看它的模式编号。ZipCrypto对应hashcat mode 13600hashcat -m 13600 flag_hash.txt rockyou.txt这个命令做的事就是把rockyou.txt里两千万个词逐一加密派生和哈希值比对。每秒钟能试几亿次的话整个字典跑完只是几分钟的事。跑的过程中屏幕上会显示“Cracked”字样和具体密码。等它跑完你再执行一次带上--show的命令就能稳定地看到密码hashcat -m 13600 flag_hash.txt --show如果输出的哈希行后面跟着冒号和明文比如$zip2$0$...:mysecret123冒号后面的mysecret123就是密码。3.4 跑不出来上规则和掩码如果rockyou.txt跑完了什么都没出有两个原因一是密码不在常见弱口令库里二是密码是常见词加了几位变形。针对第二种情况hashcat的规则rules就派上用场了。规则可以做的事情包括在字典每个词后面追加年份、追加数字、首字母大写、键盘相邻替换等等。Kali自带的规则文件就有不少hashcat -m 13600 flag_hash.txt rockyou.txt -r /usr/share/hashcat/rules/best64.rulebest64.rule是64条高频变形规则比如把password变成Password、Password123、password2024……这一层跑完又能覆盖一大批。如果规则也跑不出就得靠掩码攻击这个放到下一节细说。3.5 验证密码任何时候跑出一个候选密码都别急着开香槟。用真实解压来验证unzip -P mysecret123 flag.zip能解出来说明密码正确。这里有个小坑如果你用hashcat参数写错导致它输出的是掩码展开值而不是真实密码那验证的时候就露馅了。所以验证这一步永远不能省。4. 掩码攻击是CTF的灵魂给密码画一个框字典攻击是“你有我试的”掩码攻击是“你有特定形状我就按形状遍历”。掩码的价值在于它可以精准覆盖字典覆盖不到的、有一定格式规律的密码。4.1 掩码语法一分钟入门hashcat的掩码语法核心就这么几个占位符?l 小写字母 ?u 大写字母 ?d 数字 ?s 特殊符号 ?a 以上全部例如一个八位纯数字密码的掩码是hashcat -m 13600 flag_hash.txt -a 3 ?d?d?d?d?d?d?d?d-a 3就是掩码攻击模式。命令的意思是从00000000到99999999全部试一遍。八位数字空间是一亿对GPU来说还没有到不可接受的程度ZipCrypto的破解速度能到每秒百亿级别的话也就是一瞬间的事。4.2 从题目一句话推出掩码掩码的关键不在语法而在于你怎么从题目信息里推出密码的形状。举几个真实常见的场景题面说“她出生在2003年”密码大概率是三位数的月/日加上年份变体掩码可以写成?d?d?d?d?d?d?d?d同时限制为2003开头的组合比如2003?d?d?d?d。题面出现了“team10”这个队伍名密码大概率是team10加常见后缀掩码可以是team10?s ?d ?d之类的组合。如果真的什么都不懂就看压缩包内文件的名字、题目的分类标签。比如标签是crypto密码可能就是一串十六进制字符掩码就是[a-fA-F0-9]这样的自定义字符集。自定义字符集也是hashcat的常备操作。比如你想限定密码只包含十六进制字符hashcat -m 13600 flag_hash.txt -a 3 -1 ?dabcdef ?1?1?1?1?1?1?1?1?1-1定义了一组字符集然后后面用?1引用它。4.3 掩码与字典的混用更进阶的玩法是混合模式。比如密码前半段是词典里的一个词后半段是随机数字hashcat -m 13600 flag_hash.txt -a 6 rockyou.txt ?d?d?d?d-a 6就是“字典掩码”先试字典里的词再在后面拼四位数字。反过来-a 7是“掩码字典”。这两种模式在处理“常见词年份”“常见词短数字”的时候效率远高于纯字典或纯掩码。我还习惯配合规则一起用。规则在hashcat里可以对字典词做几十种变形变形完的每个词再进入掩码拼接。这样覆盖力会非常恐怖。当然跑的速度也成倍增加所以要有取舍——先跑小规则再跑大规则最后再上纯掩码。5. 很多时候密码根本不用爆伪加密与明文攻击这是我特别想写的一节。CTF是出题人和解题人之间的智力博弈出题人会在压缩包上做各种手脚其中一大半根本不是让你去“爆”的。5.1 伪加密才是送分题ZIP文件格式里每个文件条目都有一个通用位标志general purpose bit flag倒数第0位表示“是否加密”。有些压缩包的“加密标志”被设置为1但文件本体其实没有加密。这就叫伪加密。判断方法很简单你用zipinfo或者7z看它提示有密码但你把文件拖进Hex编辑器看一眼原始字节发现数据段是明文的字符串。或者你用binwalk之类的检测工具它会直接报告疑似伪加密。处理方案也很直接把位标志里的加密位改成0直接解压。在Linux下可以用一个小脚本完成也可以直接用010 Editor改两个字节——一个是local file header里的一个是central directory里的。改完保存再打开就不需要密码了。伪加密的恶心之处在于它骗的是那些一上来就开hashcat的人。你跑了一个小时字典人家两分钟改完字节全局都看完了。所以我每次拿到压缩包都会在用爆破工具之前先做两步一是看加密算法二是顺手试伪加密。5.2 明文攻击知道一点就全解开明文攻击known plaintext attack是我觉得很多选手没用过、但非常强的一招。它的适用条件是压缩包里至少有一个文件的内容是已知的明文而且你知道这个明文在压缩包里的确切位置至少12字节以上其中8字节位置要确定。这种情况下即便不知道密码也能通过ZipCrypto算法的数学弱点反推出用于解密其他文件的密钥。CTF里最常见的套路是压缩包里放了一个readme.txt内容是公开的标准模板另一个文件才是真flag。readme内容是公开的这不就正好满足明文攻击条件吗工具我用bkcrack它比老牌的pkCrack好用太多了。基本用法是这样的bkcrack -L 目标.zip bkcrack -C 目标.zip -c readme.txt -p 已知明文.txt第一条命令列出压缩包内的文件结构第二条命令用已知明文文件去推算密钥。一旦密钥被推出来可以用bkcrack自带的解密功能把整个压缩包解开根本不需要密码。这里有一个边界条件必须强调明文攻击只对ZipCrypto有效AES加密是抗已知明文攻击的。如果你的包是AES这条路直接放弃。5.3 还有一些容易被忽略的向度除了伪加密和明文攻击压缩包这个载体上还有很多和“密码”独立的杂项考点。比如压缩包内层文件很小几字节可以尝试用CRC32碰撞还原文件内容而不去管密码。文件名本身藏信息即使解不开也能通过zipinfo看到文件名列表。zip包末尾的注释块comment常常是出题人留提示的地方甚至直接就是密码。某些出题人会故意让压缩包里的文件名叫“password.txt”内容是一个密码而压缩包加密的就是这个文件……打开之后发现是个套娃。这些“绕过密码”的思路在比赛里其实是性价比最高的解法。一次真实的比赛中大部分压缩包题用到的技巧恰好是“不需要知道密码”。6. 那些让我抓狂的坑以及排查思路工具和原理都讲完了最后我得分享点真实的“血泪史”。这些坑我在自己刷题和带新人的时候反复见到每一个都能让你卡住至少半小时。6.1 模式编号选错hashcat第一拦路虎hashcat有上百种哈希模式Zip压缩包对应13600WinZip AES对应136017z对应17200/17225RAR对应13000等。很多人不看哈希前缀直接套一个默认模式结果跑了几分钟报一堆“separator unmatched”之类的错。我的排查方式先看hash开头的标志是$zip2$、$RAR3$还是$7z$再去hashcat官网的example_hashes列表里搜索相应模式编号。这一步花一分钟能省一个小时。6.2 zip2john提取hash时报错有时候zip2john会报“is not a zip file”或者“Did not find a valid zip”。常见原因有文件末尾有附加数据、zip头被改过、文件格式其实是7z但后缀名是zip、或者文件损坏。处理思路是先用file命令看真实文件类型再用binwalk扫一下有没有嵌套在里面的第二个zip然后再去提取hash。遇到过不少次题目给的压缩包里藏了另一个压缩包你提取外层的哈希没有意义。6.3 掩码跑了几小时发现范围设错我干过最蠢的一件事是用?a?d?d?d?d?d?d?d这种错误掩码跑了一晚上。?a本身就包含了数字后面又跟了7个?d范围瞬间从一千万变成一亿六千万而且前导的?a字符可能是字母、符号或数字整个搜索空间完全不是你会期望的那个形状。正确做法是写掩码前先手动算一下空间大小。?d?d?d?d?d?d是10的6次方一百万一瞬间?l?l?l?l?l?l?l是26的7次方八十亿这个量级即便GPU也要跑一阵?a?a?a?a?a?a?a?a是95的8次方六万多亿常规比赛根本不需要跑这个量级。掩码范围超过十亿就要警醒看看是不是该回头补充信息收集。6.4 跑出密码却验证失败hashcat显示破解成功你用unzip解压却提示密码错误。这个坑一般出现在密码结尾有不可见字符、或密码本来带空格、或者你复制密码时把哈希行一起复制进去了。正确做法是永远用hashcat的--show输出密码并且用引号包住密码来验证unzip -P $(hashcat -m 13600 flag_hash.txt --show | cut -d: -f2) flag.zip如果这样还是失败那就要怀疑是不是hashcat提取的哈希其实对应了压缩包里某一个特定文件而其他文件的密码是另一个。ZIP压缩包里每个文件是可以独立设置密码的这种阴间操作在部分套娃题目里真的存在。6.5 一个值得固定的最优解题顺序被坑过足够多次之后我现在的压缩包题流程已经固定化了写在这里供你参考先看文件类型、加密算法、是否有伪加密。仔细读题面、文件名、注释、附件找出所有可能是密码的候选词手工整理成一个小字典。用小字典常见弱口令字典过一遍。跑rockyou等大字典。用规则变形覆盖“常见词年份/数字”的情况。按题目线索设计掩码先跑小空间掩码再跑大空间掩码。如果以上都失败回头重新做信息收集检查是否忽略了隐写题、是否该走明文攻击路线。这套顺序跑下来绝大多数压缩包题在一小时内能出结果。真正需要纯暴力硬跑的题我反而见得少——一旦你发现自己在跑一个超过十亿量级的掩码大概率是前面哪一步信息收集漏了。最后再分享一个小习惯我自己的体会是压缩包密码爆破的“爆破”两个字远没有“方向判断”来得重要。你跑得再快方向错了就是白烧显卡。每次解完一道压缩包题我都会把密码和题面的对应关系记进一个专门的笔记里。攒了上百个案例之后你会发现出题人的思路高度重复要么是某个常见单词加年份要么是题目描述里某个你觉得不起眼的词要么就是伪加密骗你白跑。这些规律没法写在任何官方文档里只能从实战里一个字一个字试出来。等你也有了自己的密码案例库压缩包这一类的杂项题基本就是送分题了。