1. 先搞清楚“破解”背后的机制:/etc/shadow与密码哈希算法
先泼一盆冷水:所谓Linux root密码和普通用户密码的“破解”,在绝大多数场景下不是暴力跑字典,也不是SQL注入绕过,而是找到一条系统本人提供的入口,把密码“重置”掉。这就像你钥匙丢了,不是去撬锁,而是直接找物业开备用钥匙——前提是你得证明这房子是你的。
搞懂这个区别很重要。网上搜“root密码破解”,一大堆教程上来就让你跑John the Ripper、hashcat,说是拿/etc/shadow里的哈希去撞库。说实话,除非用户密码真的弱到像“123456”,否则在你有系统文件读取权限的情况下,等哈希撞出来早就该下班了。更高效的思路是:哪个环节允许我们不验证旧密码直接改新密码?答案就在系统启动流程里。
先认识一下我们操作的靶子。/etc/shadow文件存的就是用户密码哈希和策略信息,它权限是000或者600,只有root能读。一行记录大概长这样:
bash复制root:$y$j9T$vQa0He...:19000:0:99999:7:::
用冒号拆开看,第1列是用户名,第2列是密码哈希,后面分别是最近修改日期、最短修改间隔、密码有效期、过期警告天数等。重点看第2列:
$y$j9T$...:这是yescrypt算法,RHEL 9/CentOS Stream 9等新系统默认。$6$...:SHA-512,RHEL/CentOS 6到8时代的默认值。$5$...:SHA-256,偶尔见。$1$...:MD5,很老很老。
算法变化直接影响一件事情:同样的密码,不同版本系统生成的哈希不能互相用。你从老服务器拷一个shadow里的root行到新系统,密码可能刷不进去,因为新系统验证时要算出对应哈希,算法标识对不上就永远不会匹配。所以跨版本重置密码时,最稳的做法不是手动编辑shadow,而是用passwd命令让它按当前系统默认算法重新生成哈希。
然后是/etc/passwd和/etc/shadow的分工。/etc/passwd所有人都能读,记录了用户名、UID、主目录、登录shell这些信息,密码位一律是x,真正的密码哈希被抽离到shadow中。这也是上世纪Unix为了配合影子密码(shadow password)机制做的安全改动。
在动手之前,记住一条底线:只有你自己拥有物理访问权限或管理权限的设备才能这么做。 操作别人的机器,未经允许重置密码,性质完全不同,这个边界大家要拎清楚。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 现代Systemd系统:rd.break在GRUB处重置root密码
先讲适用面最广的方案,因为现在主流发行版(RHEL 7/8/9、CentOS 7/8/9、Fedora)都是systemd时代,启动流程里有一个很适合我们做应急恢复的开关——rd.break。
rd.break是dracut(早期用户空间)提供的一个调试参数,作用是在initramfs处理到某个阶段时主动中断,丢给你一个shell。这个shell运行在内存文件系统里,真正的系统根目录还没挂载到/上,而是暂时放在/sysroot。听起来绕,但好处很明显:这个环境下没有用户认证,直接就是root权限的shell,属于“系统自己开的门”。
操作流程如下:
- 重启服务器,在GRUB菜单界面停住。如果是单系统默认直接进,就快速按方向键或Esc,把菜单按住别让它溜走。
- 光标移到要启动的内核条目上,按
e进入编辑模式。 - 找到以
linux开头的那一行(RHEL系列一般是linux16或linux),把光标移到行尾,在末尾加一个空格,然后输入rd.break。 - 按
Ctrl+x或F10启动,系统会进入initramfs的shell,提示符看起来像switch_root:/#。 - 此时根目录还是只读挂载,先把
/sysroot改为可读写:bash复制
mount -o remount,rw /sysroot - 切换到真正的系统环境:
bash复制chroot /sysroot - 这个时候你已经站在真实的根目录里了,直接重置root密码:
bash复制
passwd ro
