
在安全测试这条路上Linux密码破解是绕不开的话题。不管是内网渗透还是红队演练拿到一台主机的登录口令往往就是打开局面的第一步。而谈到破解最常见也最实用的两个工具就是hydra和johnhydra负责在线爆破对SSH、MySQL、Web登录这些远程服务发起口令猜解john负责离线破解拿到/etc/shadow里的哈希或者加密压缩包之后在本地慢慢算。这两个工具看似都是“跑字典”但背后的原理、适用场景、参数设计和踩坑点完全不同。这篇文章我不打算从“什么是密码破解”这种基础概念开始讲而是直接把我实际测试环境中反复验证过的用法、参数组合和排错经验放出来希望对正在学Kali或准备做授权测试的朋友有帮助。先说一个重要前提所有演示命令都必须在你自己搭的虚拟机、Docker容器或靶场环境里执行未经授权的系统一律不要碰。这既是法律红线也是做安全测试最基本的职业素养。1. 先理思路在线爆破与离线破解的底层差别很多人一开始搞混hydra和john的定位觉得都是“拿字典去试密码”随便用一个就行。实际上两个工具解决的问题完全不同使用条件、成功率上限和风险等级也完全不是一个量级。1.1 两种模式的原理与性能差异在线爆破是直接对着目标服务发起真实的登录请求比如SSH握手、MySQL认证、HTTP表单提交。hydra做的事就是把字典里的每一条口令依次填入登录流程直到服务器返回“认证成功”。这种方式的瓶颈很明显网络延迟、目标服务的并发连接限制、日志审计、账号锁定策略都会直接影响爆破速度和隐蔽性。换句话说你可控的东西只有线程数和字典剩下全看目标环境脸色。离线破解的逻辑完全不同。它不需要和目标系统产生实时交互前提是你能先把密码的哈希值拿回来比如从Linux的/etc/shadow文件、数据库存储、压缩包的加密头里提取出Hash。拿到Hash之后john在本地把字典里的每个单词做加密运算得到的结果和已有的Hash比对一致就说明密码找到了。这种模式下破解速度只取决于CPU/GPU算力和算法的复杂程度和目标主机没有任何关系也没有被锁定账号的风险。打个比方在线爆破像是站在人家门口一把一把试钥匙动静大、速度慢、还可能被猫眼看到离线破解是把锁芯拆下来带回自己工作台上慢慢研究哪怕研究几天几夜也没人干涉。理解了这一点你就明白为什么专业流程里永远是先把Hash拿回来再说而不是傻乎乎对着远程服务死磕。1.2 工具选型什么场景该用谁拿我自己的经验来说选工具基本遵循一条原则凡是能实时交互的目标服务优先考虑hydra凡是能拿到Hash的场景一律走john或john系工具。下面是几个高频场景的选型表场景推荐工具原因SSH / FTP / RDP远程服务口令测试hydra需要真实网络交互hydra支持协议多、并发控制灵活MySQL / Redis / PostgreSQL认证测试hydra或medusahydra模块覆盖全Redis这类特殊协议也能处理Web登录表单爆破hydra的http-post-form模块可以自定义POST参数和失败判定条件Linux系统口令哈希/etc/shadowjohn拿到Hash后本地离线跑效率高且不触发告警加密压缩包zip/rar/7zjohn配套的zip2john/rar2john/7z2john先把加密文件转为Hash再用john破解常见文档密码PDF/Officejohn配套的pdf2john/office2john同样是提取Hash再离线破解举个实际例子我在测试一个内网靶场时先用hydra对一台暴露SSH的服务器做了弱口令爆破成功拿到一个普通用户权限登录之后读取了/etc/shadow再用john离线破解出root密码最后sudo切换到管理员。整个流程里两个工具各有分工缺一不可。2. hydra实战从基础语法到Web表单爆破hydra是我用得最多的在线爆破工具原因无他协议覆盖广、参数直观、支持代理和并发控制。Kali Linux里已经预装了hydra如果你用的是Ubuntu或其他发行版一条命令就能搞定安装apt install hydra。2.1 基础参数解析看懂一条命令的每个部分我的习惯是先写一个模板再根据目标协议替换参数。最基础的命令格式长这样hydra -l admin -P pass.txt 192.168.1.100 ssh -t 4 -f -vV拆开看每个部分的含义-l指定单个用户名-P指定密码字典文件192.168.1.100是目标IPssh是目标服务协议-t是并发线程数-f表示找到第一组有效口令就停止-vV会实时打印每次尝试的账号密码和服务器返回结果。如果是大批量测试-l可以换成-L users.txt也就是从文件里读取多个用户名。还有几个参数虽然不常用但关键时刻能救命-s用于指定非默认端口比如SSH跑在2222端口时要用-s 2222-o指定结果输出文件方便后续整理报告-w是超时时间默认30秒网络差的时候建议调大-e nsr会额外尝试空密码、用户名同密码和反转用户名这个组合对国内运维习惯特别有效很多设备密码就是用户名加个123。hydra支持的协议非常多用hydra -h能看到完整列表。除了常规的ssh、ftp、mysql、rdp、smtp、http-get、http-post-form还有redis、mongodb这类非传统协议。重点提示如果你在测试内网设备telnet、snmp、ldap2这些老协议也值得关注很多老旧设备还在用极其简单的口令。2.2 三个高频场景拆解SSH、数据库、Web登录场景一SSH爆破。这是最典型的入门练习命令直接参考上面给的模板就行。我习惯把线程控制在4到8之间线程太高容易触发目标系统的连接数限制反而大量报错影响判断。场景二MySQL数据库。命令基本一样把协议换成mysql用户名换成常见的root或admin字典换成数据库弱口令字典。有一点值得注意MySQL的账号锁定策略比SSH宽松得多爆破痕迹也不那么容易被发现所以在授权测试里数据库端口往往是优先突破口。一条典型的命令就是hydra -L users.txt -P pass.txt 192.168.1.100 mysql -t 4。场景三HTTP登录表单这个就比较考验细节了。很多网站没有现成的API可以测试只能通过模拟POST请求来爆破。hydra的http-post-form模块需要你提供三个关键信息用冒号分隔格式如下hydra -l admin -P pass.txt 192.168.1.100 http-post-form /login.php:username^USER^password^PASS^submitLogin:Login failed第一部分是登录页面的URL路径第二部分是POST请求体第三部分是登录失败时页面返回的特征字符串。这里的^USER^和^PASS^是占位符hydra会用-l或-L里的用户名、-P里的密码替换进去。第三部分需要你提前用浏览器或curl访问一次看看登录失败后页面里固定会出现的字符是什么这个一定要准确否则hydra会把“所有尝试都当成成功”或者“所有尝试都当成失败”结果完全没有参考价值。我经常用Pikachu靶场来演示这个场景因为它的登录失败返回话术很稳定新手不容易翻车。靶场里把form表单的参数名改成实际值基本一遍就能跑通。顺便提一句这类爆破对目标会产生真实的登录失败记录测试前务必和客户约定好时间窗口。2.3 字典从哪来hydra怎么生成字典“hydra怎么生成字典”应该是新手问得最多的问题。hydra本身不自带字典生成功能它只是负责把字典内容一条条发出去。字典质量直接决定爆破成败所以我单独说一下。最省事的方案是直接用现成字典Kali里自带/usr/share/wordlists/rockyou.txt.gz解压后就是个几百万口令的大字典但体积太大不适合在线爆破。我更多会用三种方式生成定制字典第一种是用crunch生成指定规则的字典。比如crunch 6 8 0123456789 -o pass.txt会生成6到8位、由数字组成的全排列字典适合对付纯数字口令crunch 4 4 abcdef123 -t a -o pass.txt则是以字母a开头、后面跟3个小写字母的字典代表小写字母占位符。第二种是用cewl爬取目标网站的词汇生成所谓的“企业词表”。很多公司的口令是公司名加数字的组合比如company2023、company2023直接用rockyou这种通用字典反而跑不出来而cewl能从官网、招聘页、新闻公告里把所有文字抓下来再配合规则变形命中率有明显的提升。命令很简单cewl -d 2 -m 5 http://example.com -w cewl_dict.txt。第三种是python脚本定制组合。比如把常见姓名、年份、特殊符号做笛卡尔积生成一批“姓名生日”格式的字典。这种做法在红队场景里很常见因为社工信息能极大缩小字典规模。你甚至可以结合目标单位的命名习惯写个简单的生成器import itertools names [zhangsan, lisi, wangwu] years [2020, 2021, 2022, 2023] suffix [, !, , 123] for name, year, suf in itertools.product(names, years, suffix): print(name year suf)不过提醒一句字典不是越大越好。在线爆破讲究的是低延迟、低噪音一上来就丢个几十GB的字典跑SSH容易被目标上的fail2ban之类的工具直接封IP。我的做法是先跑Top100的高频弱口令字典再跑结合目标信息的定制字典最后才考虑通用大字典。3. john实战离线Hash破解的正确打开方式如果说hydra考验的是网络理解和参数配置能力那么john考验的就是对哈希算法和系统结构的熟悉程度。john全名John the RipperKali和大多数渗透发行版都自带。它的核心价值在于只要你能拿到Hash就能在本地无限次地尝试口令不受网络限制也不容易暴露。3.1 第一步永远是把Hash拿对很多新手拿着john不知道从哪开始其实问题并不在于john怎么用而在于你根本拿不到正确的Hash。不同的场景有不同的提取方式。Linux系统口令存储在/etc/shadow文件里只有root用户才能读取。文件里每一行代表一个用户格式大致是root:$6$salt$hash:...其中$6$表示SHA-512加密$1$表示MD5$5$表示SHA-256。john可以直接读取shadow文件但我习惯先用unshadow命令把passwd和shadow合并成john的标准输入格式unshadow /etc/passwd /etc/shadow hashes.txt这样做的好处是john能自动关联用户名跑single模式时能用到用户名信息对弱口令非常有效。如果只是想破解某个用户的密码也可以手动把shadow里的那一行提取出来单独保存。如果是加密zip压缩包就需要用到john配套的转换脚本。Kali里一般有zip2john用法是zip2john backup.zip zip.hash john --wordlistpass.txt zip.hash同理还有rar2john、7z2john、pdf2john、office2john。这套工具链的价值在于把各种非标准格式的密码保护统一转换成john能识别的Hash格式。我遇到过不少人在网上搜“zip压缩包密码破解工具”其实用Kali自带的zip2john加john就已经能覆盖绝大多数场景了完全不需要额外找破解软件。3.2 john的三种模式与实战参数john的运行模式主要有三种理解它们的差异对提升效率至关重要。第一种是wordlist模式也就是字典模式语法是john --wordlistpass.txt hash.txt。这种模式的核心是字典本身的质量跑之前要清楚目标系统的密码策略。举个例子如果你面对的是一台要求密码不少于8位的老旧Windows服务器你却拿一个6位数字字典去跑那肯定一无所获。第二种是single模式语法是john --single hash.txt。它会根据用户名、全名等信息做定向变形比如用户名叫zhangsan它会尝试zhangsan、Zhangsan、zhangsan123、zhangsan2023等组合。这种模式对弱口令的命中率出奇地高而且速度极快很多情况下跑完几十万条口令只需要几分钟。我的习惯是到手的Hash永远先跑一遍single模式再考虑上大字典。第三种是incremental模式也就是纯穷举模式语法是john --incrementalDigits hash.txt。这种模式不需要字典john会按字符集和位数从短到长自动生成候选密码。代价是计算量爆炸8位纯数字就有1亿种组合更别提带字母和符号的复杂密码了。除非你能确定目标密码很短否则不建议一上来就开incremental模式很容易白白耗费十几个小时。还有一个容易被忽略但非常实用的功能是规则集rules。john内置了一批密码变换规则用--rulesAll参数开启。跑wordlist模式时john会把字典里的每个词按规则进行大小写替换、前后缀添加、数字追加、字符替换等变形。比如字典里有admin这个词规则能生成admin123、Admin、adm!n、admin2023等变体。这相当于在不大幅增加字典体积的情况下把命中率提高了一大截。实际测试中我见过不少密码就是字典原词加两位数字这种用规则跑比直接上大字典快得多。3.3 一个完整示例破解shadow文件里的root口令我直接给一套可复现的流程你可以在自己的虚拟机里操作。第一步用root身份读取shadow并用unshadow合并成john格式sudo cat /etc/shadow | grep root sudo unshadow /etc/passwd /etc/shadow hashes.txt第二步先用single模式快速试一轮john --single hashes.txt第二步没跑出来的话上字典加规则john --wordlistrockyou.txt --rulesAll hashes.txt如果hash文件里同时包含多个用户的条目john会逐个尝试。破解过程中想查看进度按回车会显示当前状态想查看已经破解出来的结果用john --show hashes.txt。实际运行效果大概是如果root密码是弱口令single模式或小字典加规则往往几秒到几分钟内就能出结果如果密码相对复杂可能需要长时间挂着跑这时候可以用--sessionname指定会话名下次用--restorename接着跑避免断电或中断导致前功尽弃。有一点需要说明john默认会自动识别常见的hash类型比如sha512crypt、md5crypt、bcrypt等。但如果你提取的哈希来自特殊应用比如WordPress的phpass、Django的pbkdf2自动识别可能会失败这时需要手动指定格式先运行john --listformats查看支持的格式列表再通过--formatphpass之类的参数指定。4. 实战中的坑和提速经验hydra和john用久了很多问题其实是重复出现的。我把高频故障和优化策略整理一下每一条都是我自己踩过或者帮别人排查过的。4.1 高频问题排查速查表现象可能原因解决方法hydra跑很久没有任何成功结果字典质量问题或者目标账号有锁定策略先跑高频弱口令字典降低并发避免触发锁定报错“Connection refused”目标服务未开放或并发线程数过高用nmap确认端口开放把-t降到2或4hydra提示“service not supported”协议名拼错或该协议不受支持运行hydra -h查看完整协议列表http-post-form全部显示成功/全部失败第三个冒号后的失败特征字符串写得不准确用curl手动提交一次错误密码观察返回内容再修改john报“No password hashes loaded”Hash文件格式不对或没指定正确格式检查Hash是否包含完整前缀必要时用--format指定算法john一直卡住不动目标Hash算法慢如bcrypt或incremental模式计算量过大换小字典规则限制运行时间--max-run-time破解过程中断线没有使用会话功能用--sessionname启动--restorename恢复4.2 能直接抄作业的提速三板斧提速的关键不是把线程拉满而是减少无效尝试。第一板斧优先跑小字典加规则而不是一味追求大字典。我自己最常用的组合是--wordlisttop1000.txt --rulesAll对绝大多数弱口令环境足够了。第二板斧在线爆破时控制并发和频率。以SSH为例-t 4 -w 30是比较稳的参数组合并发再高就容易被目标系统记录或封禁得不偿失。第三板斧离线破解时按算法优化john配置比如对SHA-512的shadow哈希可以用--fork4让多个CPU核心并行运算速度接近线性提升如果机器有Nvidia显卡还能配上--formatsha512crypt-opencl走GPU加速速度提升非常明显。在线爆破的目标常常有fail2ban或类似的防护机制短时间大量失败连接会直接封禁来源IP。所以实战中我习惯加上-f参数找到就停同时控制线程和超时参数让每秒尝试次数保持在一个比较“温和”的范围。如果你觉得自己IP已经被目标记住了还可以借助hydra的-o输出日志先看看被封之前有没有已经成功的记录。4.3 红队场景里这两个工具怎么配合把前面所有内容串起来一套典型的授权测试流程大概是这样的信息收集阶段用nmap或masscan扫描出目标网段内开放了SSH、MySQL或Web登录的服务接着hydra对这些服务发起弱口令爆破运气好的话能拿到一台低权限主机登录进去之后读取/etc/shadow用unshadow合并格式再交给john离线破解root密码最终拿到root权限后进行内网横向或数据收集。在实际测试中很多时候你通过hydra拿到的只是一个普通用户权限系统上的敏感文件根本读不了。此时/etc/shadow只能看不能读john就派不上用场。这种情况下我一般会先看看目标系统上有没有其他配置泄露的密码、密钥文件或应用配置文件比如.bash_history、数据库配置文件、Web目录下的备份文件里常常藏着root密码。实在不行再尝试利用内核漏洞或其他服务漏洞做提权拿到root之后再读shadow。整个过程攻击面广、不确定性高所以每一步都得留好日志方便事后复盘。5. 合法边界与防御建议讲到这儿工具层面的内容基本覆盖了但有一节内容我觉得比任何命令都重要那就是合法边界和防御视角。密码破解说白了是一把双刃剑用得好是安全评估的利器用不好就是犯罪的工具。5.1 红线授权与靶场任何时候都不要对未经授权的系统发起爆破测试不管是公网IP、公司内网还是别人家的路由器这是不可逾越的底线。学习阶段最好的做法是搭虚拟机自己练比如用Kali当攻击机再装一台Ubuntu或CentOS当靶机自己设几个弱口令用户反复练习hydra和john的用法。想体验更真实的环境可以用Pikachu靶场、DVWA这类专门的教学平台它们设计出来就是给人练手的不存在越权问题。我见过一些新手刚学会两条命令就兴致勃勃去试单位的服务器或者把公司办公WiFi当作测试目标最后轻则被安全团队抓个正着重则面临法律追责。学习技术本身没有错但选错测试目标就是大问题了。记住一句话有没有授权是安全测试和违法犯罪之间的分界线。任何教程里的命令复制到真实环境执行之前先确认自己有没有这个权限。5.2 从攻击视角看防御怎么防住这类破解从防御方来想hydra和john之所以能起效绝大多数情况下是因为目标系统使用了弱口令或默认口令。所以加固思路核心就两条让密码变得难猜让猜密码的行为付出代价。第一条是落实密码强度策略。至少12位以上混合大小写、数字和特殊字符同时避免使用姓名、生日、手机号等公开信息。很多企业即使有了复杂度要求员工也习惯把company2023!这种口令用到所有系统上一旦爆破出其中一个其他系统的沦陷只是时间问题。所以更关键的是避免口令复用好在现代系统支持密码管理器让员工生成随机密码才是正解。第二条是让在线爆破无法得逞。SSH服务建议直接禁用root远程登录修改/etc/ssh/sshd_config里的PermitRootLogin prohibit-password同时开启PasswordAuthentication no强制使用密钥登录。这样即使账号名被枚举出来没有私钥也进不来。对于必须使用密码登录的内网系统可以启用账号锁定策略比如PAM的pam_faillock模块连续失败5次就锁定15分钟这会让hydra的字典大部分还没跑完就已经触发了锁定。离线破解的防御要点则是保护好哈希文件本身。/etc/shadow的权限正常情况下只有root可读如果普通用户都能读说明系统权限配置已经严重失守。其次是尽量选择计算代价高的哈希算法比如yescrypt或bcrypt就算shadow文件泄露john的破解速度也会被大幅拖慢。密码加密往前端走一步防御纵深就厚一层。就我个人经验来说密码破解这个方向最难的不是记命令而是搞清楚边界和上下文。很多初学者一上来就想学炫酷的提权或内网漫游结果连基础的爆破都没跑通过字典不会做Hash不会提最后只能对着教程抄。我建议你把SSH爆破、shadow离线破解、zip压缩包破解这三个场景在本地靶场彻底跑通理解每个参数为什么要这么写再考虑往更深的漏洞利用方向走。工具只是杠杆真正的技术积累在于你对系统原理的理解和对风险的克制这两点到位了hydra和john在你手里才不会跑偏。