
1. 前言为什么一个系统管理员必须了解Linux密码破解我第一次遇到“Linux密码破解”这个问题是刚入职当运维那会儿一台跑了三年的CentOS服务器root密码被离职的同事带进了黑名单。机房断着网业务告警一条接一条我却对着登录界面干瞪眼。那一刻我才意识到Linux密码破解根本不是黑客的专利而是每个搞运维的兄弟迟早要面对的家常便饭。这个技能至少有两个完全合法的应用场景一是系统密码恢复你拥有物理机或虚拟机的完全控制权只是把遗忘的密码找回来二是安全审计你是系统所有者或授权渗透测试人员通过破解密码的方式验证系统密码强度看它能不能扛住暴力攻击。这两件事的核心技术是一样的但边界完全不同我后面会反复强调这一点。适合看这篇文章的人包括刚入行的运维新手、负责服务器安全的工程师、准备考Linux认证的大学生以及组建了自己的家庭服务器、隔三差五忘记密码的折腾党。我会从最基础的shadow文件结构讲起一路讲到单用户模式重置、John破解哈希、在线爆破SSH和提权利用把这些命令背后的原理和坑都摊开说清楚。学过之后你会发现所谓“破解”并没有电影里那么玄乎它就是对系统机制的深入理解外加一套顺手工具的事。2. 忘记root密码的正确处理方式先分清重置和破解的边界2.1 单用户模式最经典的重置思路如果你手头有物理机的键盘、或者能通过云控制台进入单用户模式那么重置root密码只需要改一次内核启动参数。原理很简单Linux内核加一个rd.break或single参数后会在根文件系统挂载前或者挂载后直接丢给你一个root shell这个shell不校验任何用户密码。具体流程我以CentOS 7/RHEL 7为例重启系统在GRUB引导界面光标停在默认内核项按e进入编辑模式。找到以linux开头的那一行通常是linux16或linuxefi末尾追加rd.break。按Ctrlx启动系统会进入一个临时的switch_root环境此时根文件系统以只读方式挂载在/sysroot下。执行mount -o remount,rw /sysroot重新挂载为可读写。执行chroot /sysroot切换根目录。执行passwd root设置新密码。如果系统启用了SELinux需要执行touch /.autorelabel确保文件标签重新生成。exit退出chroot再reboot重启用新密码登录。除了rd.break还有更古老的single参数同样是在内核行末尾追加系统会直接进入单用户模式。区别在于rd.break在initramfs阶段就停住了不会让原系统的持久化服务启动所以对SELinux规则的破坏更小实际工作中推荐优先用rd.break。2.2 脱机修改用Live CD绕过一切登录门槛另一种更稳妥的思路是在系统离线时直接修改硬盘上的密码文件。你需要准备一个Linux Live CD或者U盘启动盘比如Ubuntu安装盘、SystemRescue甚至是个Mini Linux发行版。操作流程用Live系统启动后先挂载原系统的根分区到某个目录比如/mnt。如果原系统使用LVM或LUKS加密先执行vgscan vgchange -ay激活卷组或者用cryptsetup open解密。将根分区挂载后直接用chroot /mnt passwd root设置新密码。这里有一个关键点如果你对根分区做了LUKS加密但忘了加密时的那句口令那这个方案也救不了你。加密容器本身就是最后一道锁Liunx的认证用密码保护加密盘再用另一套密码保护两层都丢了就只能指望备份了。2.3 单用户和Live CD怎么选两者各有适用场景。我的经验是方法前置条件风险适用场景单用户模式(rd.break)能进入GRUB界面且GRUB未设置密码保护修改了内核启动参数有误操作风险适合快速救急本机物理服务器、云服务器VNC/控制台Live CD脱机修改有可用的启动介质支持U盘启动需要处理LVM等特殊磁盘布局隔离性更好无显示服务器、系统完全无法启动、需要同时修复多个文件用云服务器的时候如果厂商只提供了救援模式多数也是把磁盘挂载到一款临时Live系统里原理等同于脱机修改。我自己的建议是物理机优先单用户模式速度快、不需要额外介质云主机一般要看控制台是否开放了进入单用户模式的开关没把握就直接走救援模式避免在控制台界面手忙脚乱地改内核参数。3. 拿到/etc/shadow之后真正的密码破解才开始3.1 用户的密码到底存在哪Linux系统的用户密码哈希保存在/etc/shadow文件里普通用户不可读只有root和shadow组可以。文件每一行对应一个用户字段以冒号分隔以root行为例root:$6$S9zQz8nG$X3KwVj...:18619:0:99999:7:::第一个字段是用户名第二个字段是密码哈希第三、四、五个字段分别是最近修改时间、最小修改间隔、最大有效时间第六个字段是密码过期前提醒天数。这里最需要关注的是第二个字段的格式。现代Linux密码哈希通常包含$id$salt$hash三个小段id代表哈希算法1是MD52a是Blowfish5是SHA-2566是SHA-512y是yescrypt新版Debian/Ubuntu在用。后面的salt是你这个用户特有的随机盐hash才是盐加明文组合后的最终哈希值。3.2 为什么不能“反查”密码很多人会问拿到哈希以后直接把哈希转回明文不就行了这里面涉及单向散列函数的原理。SHA-512这类哈希函数是单向的你没法从输出3b5d...倒推出输入Admin123只能把所有可能的明文挨个试一遍计算出哈希后和从shadow里拿到的值比对比对成功才算命中。这个过程叫“字典攻击”或“暴力破解”。salt的作用在于让每个用户的哈希互不相同。即使两个用户都设置成123456因为salt不同生成的哈希值也完全不一样。这意味着攻击者没法直接拿一张预计算好的彩虹表来命中所有用户必须针对每个用户单独跑一遍这个计算成本在现实中非常可观所以强密码加随机盐才是安全基线。3.3 字典、掩码与规则John和Hashcat的实战姿势我平时用得最多的工具有两个John the RipperJtR和Hashcat。John的优势是小巧、跨平台、适合边采边破Hashcat的优势是支持GPU加速能飙到每秒数亿次尝试。先用John处理一份shadow文件# 先把shadow文件里需要破解的账号整理出来或直接指向shadow john --wordlistwords.txt /etc/shadow # 查看已经破解出来的密码 john --show /etc/shadowJohn自带很多规则会根据常见密码习惯自动变换大小写、尾巴加数字、替换相似字符等。比如字典里有adminJohn会尝试Admin、admin1、admin123、dmin等变体效果比单纯跑字典高得多。Hashcat更主流的使用方式是先指定哈希类型再指定攻击模式# -m 1800 对应sha512crypt;$6$-a 0是字典攻击, -a 1是组合攻击, -a 3是掩码攻击 hashcat -m 1800 -a 0 hash.txt words.txt hashcat -m 1800 -a 3 -1 ?l?d hash.txt ?l?l?l?l?l?l?l?d第二条命令表示用8位小写字母加1位数字的掩码穷举这种掩码写法适合你依稀记得密码长度和字符类型时使用。从效率角度看有GPU还是建议优先用Hashcat。我拿一张中端显卡做过实测SHA-512的对比速率大约在每秒500万次左右而普通CPU的John只有2万到5万次差距超过百倍。当然如果你的目标机器是普通运维场景密码通常不会太复杂几百万条常用字典跑一遍就能解决一大半问题。3.4 工具选型和绕过技巧的权衡工具优势劣势适合场景John the Ripper内置规则强安装简单支持通用的shadow格式CPU计算慢GPU配置繁琐拿到shadow文件后快速试字典HashcatGPU加速猛掩码组合灵活支持格式巨多依赖驱动参数坑多大字典加载需要好内存大规模密码审计、GPU机器跑高强度模式chntpw直接修改Windows注册表和SAM文件只针对Windows和Linux场景无关联双系统下忘记Windows登录密码时应急还有一种真正意义上的绕过如果你的系统里root账号被锁了但你有一个能写/etc/shadow的权限比如通过WebShell或某个服务漏洞拿到了www-data用户可是sudo提权需要密码。此时不妨检查一下/etc/shadow的权限如果web目录所在磁盘被误挂载为可写同时又存在其他漏洞可以直接用chpasswd把root密码覆盖成自己指定的值echo root:NewPass123 | chpasswd这一招在外围渗透里很常见。但它同样提醒了运维绝对不要让普通服务账号有写/etc/shadow的能力如果PHP-FPM和Nginx跑在同一用户下权限失控就可能让人家把你的root密码整个换掉。4. 在线密码攻击从SSH暴力破解到防御对策4.1 Hydra与Medusa对服务端口“试密码”服务密码的在线破解使用工具向目标持续发送用户名和密码猜测常见的目标包括SSH(22端口)、FTP(21)、MySQL(3306)、RDP(3389)等。最常用的工具是Hydrahydra -l root -P pass.txt -t 4 ssh://192.168.1.100这条命令会用root用户从pass.txt里取密码去尝试登录192.168.1.100的SSH服务。-t 4表示同时开启4个并发连接设置过高容易触发服务器防爆破机制或直接打崩目标。在线攻击最大的制约在于网络延迟和并发限制。如果目标开了/etc/ssh/sshd_config中的MaxAuthTries限制比如MaxAuthTries 3那么每连接只能尝试几次就会被断开加上fail2ban之类的工具高频尝试会把你的IP拉黑。所以在线爆破更适合靶机测试或内网低防御场景正规的安全评估更多是用它验证“弱口令是否真的存在”。4.2 防御者的必修课怎么让暴力破解彻底失去意义防御永远比攻击简单。我在生产环境里对SSH爆破的应对措施有几条全是实测过有效的禁止密码登录只留密钥登录这是根治SSH暴力破解的最终手段。修改/etc/ssh/sshd_config中的PasswordAuthentication no然后在客户端生成ed25519密钥对把公钥放到~/.ssh/authorized_keys里顺便在服务器端设置PermitRootLogin prohibit-password。这样一来攻击者连密码登录的入口都没有。部署fail2ban如果内网环境确实需要密码登录那就给爆破上一道熔断。配置fail2ban监听sshd日志60秒内5次认证失败就封禁来源IP 10分钟。限制SSH来源网段白名单只允许运维跳板机的IP访问22端口比任何密码策略都有效。密码策略和管理员习惯虽然用密钥认证后密码不再是防线但其他服务Web后台、数据库管理端仍可能复用密码。至少要求15位以上、避免纯数字、在多个服务间使用不同的密码。把这条从攻击者的思路倒过来看如果你在做安全自查应该主动对自己服务器的SSH跑一次Hydra用的就是你自己收集好的弱口令字典。如果没过几轮就“破”进去了那恭喜你在黑客发现你之前先暴露了自己。5. 提权中的密码利用破解拿到的是身份不是终点5.1 一个普通会话能从哪里翻出密码在真实的Linux渗透测试中密码破解只是起手式。大多数情况下攻击者先拿到的是一个普通用户权限甚至是从WebShell拿到的低权限Shell。这时候Linux提权就是决定输赢的关键一步而提权最顺手的路径往往是密码重用和密码归档。我列举一些实战中高频的目标位置/root/.bash_history、/home/*/.bash_history会记录用户曾用过的su、ssh、mysql、ftp、git push等命令有些直接暴露明文密码。~/.ssh/known_hosts和配置文件比如~/.ssh/config里保存了登录用户和端口有的甚至把私钥一并放在家目录。Web服务配置/var/www/html/config.php、.env、wp-config.php等文件里经常有数据库密码、Redis密码、第三方接口密钥。数据库内部MySQL的mysql.user表、Redis的requirepass、MongoDB等都可能存在账号密码而且很多系统用同一个密码连接多套服务。进程启动参数ps aux里偶尔能看到启动脚本里带了个--passwordxxx参数。拿到这些密码后第一件事是用sudo -l看看当前用户有没有哪些命令能以root权限执行。如果存在sudo -u root /bin/bash那就直接白给。如果没有这种万能命令也可以看sudo -l列出的具体命令比如/usr/bin/vim、/usr/bin/vim /etc/shadow、/bin/more /etc/passwd等利用这些命令自带的交互功能弹一个shell或者读取原本没权限看的shadow文件。5.2 一个典型的密码复用提权案例假设我在内网一台靶机上用一段劣质密码admin123拿到了一个名为demo的普通账号ssh demo192.168.1.101登录后先看家目录和历史记录cat ~/.bash_history发现里面有这样一条mysql -u root -pMysql2023把这个密码记下来因为“密码复用”是提权剧本里最常见的高潮。接下来执行sudo -l如果提示demo用户可以以root身份执行任意命令而不需要密码那这一局已经结束了直接sudo -i拿到root。如果提示需要密码那就先试试刚才从history里扒出来的Mysql2023sudo -i输入Mysql2023不出意外的话就进去了。这就是典型的“普通账号密码泄露出管理密码”连环提权。防御方看到这应该感到后背发凉如果你的运维同事把数据库root密码和系统sudo密码做成了同一个一个普通员工的跳板机被钓鱼可能整个堡垒机体系都面临失守。5.3 从防御视角的加固措施针对密码提权我的建议比单纯跑一个弱口令字典更系统化为每个单独的管理面设置独立强密码禁止在Web配置、数据库连接串和sudo密码之间复用。严格管理sudo权限遵循最小权限原则普通用户不需要的sudo条目一律清空。定期跑sudo -l -U username检查。环境变量和命令参数里少带明文密码能用密钥文件、密码管理器或者环境变量引用都不要明文。历史记录尽量做清理和加固将/root/.bash_history和/home/*/.bash_history的大小限制到几百条重定向到日志服务器防止一次性被翻个底朝天。定期用John或Hashcat审计自己服务器的shadow文件和常见配置文件中是否存在弱密码。说到底密码破解技术本身是中性的关键是你把它用在谁身上、有没有授权。抛开授权谈破解那就是背书第八百条在法律边界内安全教育、攻防演练、事故应急才是有意义的场景。6. 常见问题与排查技巧实录6.1 密码重置后系统无法启动该怎么办我在CentOS上用rd.break重置密码时出现过一次重启后系统卡在SELinux relabeling检查的情况。原因是修改/etc/shadow后文件的SELinux标签错乱了系统触发了/.autorelabel机制但自动重标过程耗时很长。解决办法是在grub菜单里先按e在linux行末尾再加autorelabel0跳过重标进入系统后手动执行restorecon -Rv /etc修复shadow文件的标签再正常重启即可。更稳妥的操作习惯是如果是纯系统恢复而无需保留原数据可以直接在rd.break环境下执行touch /.autorelabel然后耐心等它跑完。如果数据重要不要随便跳过autorelabel宁可让机器多花几分钟完成重标。6.2 Hashcat跑着跑着机器死机或温度过高GPU破解属于高负载计算我见过不少人把公司电脑跑得黑屏重启。原因大多是功率限制没设置好。建议使用Hashcat之前先看看显卡型号和温度监控工具nvidia-smi然后给Hashcat加上工作量调整参数比如省电模式或降低功耗hashcat -m 1800 -a 0 -w 2 hash.txt words.txt-w表示Workload Profile2是中等负载适合边跑边做其他事3是高负载跑片头优先。跑长时间任务时最好用screen或tmux包一层断开会话也不至于任务中断还方便随时查看进度。6.3 同一个字典为什么别人能破而我破不了很多新手喜欢在网上收集几G的“全量字典”拿到服务器上跑结果命中率极低。问题往往出在字典没做预处理。真实环境中密码的构成高度依赖用户习惯和业务背景一家公司的WiFi密码、服务器密码、数据库密码很可能都带着公司名、年份、房间号等特征。你可以使用crunch或kwprocessor生成专属掩码而不是纯粹依赖通用大字典。另外shadow哈希的算法也是关键。新版Ubuntu默认使用yescrypt哈希类型标识$y$旧版字典跑门道完全不一样比如用John时要指定--formatcrypt用Hashcat时要选-m 23500。所以别人能用但你不行的原因很可能不是工具问题而是你连目标格式都没指定对。破解前先用hashid shadow_line确认哈希类型这个习惯相当重要。6.4 操作前必须检查的安全清单这条清单既是我给自己列的也是给所有读者的一份提醒检查项具体动作授权情况是否获得目标系统所有者或网络管理方的书面/明确授权环境影响是否备份原密码文件如cp /etc/shadow /etc/shadow.bak操作地域是否在自己的控制范围或测试环境内进行工具版本是否为官方tools避免下载到捆绑恶意软件的非正规版本退出清理破解完成后是否删除临时哈希文件与破解结果避免二次泄露有一次我帮朋友恢复一台进不去的旧服务器按惯例先备份了shadow文件结果自己把密码改错了全靠那份备份才把系统恢复到可登录状态。从那以后无论多急我都坚持动/etc/shadow之前先备份、再操作、后测试三步走这已经成了刻在肌肉记忆里的习惯。6.5 破解失败别死磕密码爆破的极限思维还有一个实操上的忠告如果字典和掩码都试过8位数字、常见单词组合都没命中那大概率这不是一个能被常规暴力破解的密码继续烧GPU只是浪费电。与其死磕不如换思路查目标的历史备份、数据库快照、配置文件里的临时密码、日志里泄露的会话信息或者直接从运维发出去的通知邮件里找线索。密码破解在项目里往往是一个入口而非终点目标环境里能获取的信息密度往往比破解算力更重要。我接过一个内部安全审计项目破解了一周还有三个账号没爆出来最后在系统管理员桌面的便签上找到一串看起来像日期和编号的组合输进去直接命中。真实世界的密码永远比纯技术更依赖“情报”。7. 写在最后从破解到防护一次完整的认知升级我个人在实际操作中的体会是Linux密码破解的底层逻辑其实是把“密码认证”这个环节的假设彻底打穿。单用户模式打穿了root免密假设shadow哈希跑字典打穿了“哈希不可逆”的伪安全感Hydra爆破打穿了服务防线的薄弱点sudo提权打穿了“一个普通账号无足轻重”的错觉。每一次破解成功都应该换个角度想这条路径能否从我自己的系统里被堵死。最后再分享一个小技巧平时不妨在自己的测试虚拟机里用openssl passwd -6生成一个带盐的SHA-512哈希丢到John里尝试恢复。这个过程不需要任何入侵行为却能把本文提到的命令、格式、效能、参数全都体验一遍。等真正遇到生产事故或安全审计时你已经有了一套肌肉记忆不会手忙脚乱。密码安全对抗的是一个持续过程你更新了方案攻击者也会增加手段。与其担心被破解不如把时间花在轮换强密码、部署密钥认证、做最小权限收敛和定期审计上。模拟一次攻防修补一批漏洞让每一轮“破解”都成为系统进化的契机这才是这个技能真正值钱的地方。