ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

root密码破解与重置全攻略:Linux、MySQL及安卓场景详解

root密码破解与重置全攻略:Linux、MySQL及安卓场景详解 1. 先分清场景root用户密码破解到底在解什么root用户密码破解这个说法一冒出来就容易让人联想到电影里那种敲几行代码就黑的场景。实际上我干了这些年运维遇到的所谓root密码破解十次有九次是同一件事管理员自己把密码忘了。另一个高频场景是接手一台别人的服务器时前任根本没给你密码或者数据库root账户被配置成随机密码找不到了。这篇文章的内容就是围绕在合法授权和管理权限下如何恢复root访问能力把Linux服务器、MySQL/MariaDB、乃至安卓设备上的root场景一次说透。先说安全边界这里的破解对象必须是你自己管理、或经明确授权的设备。哪怕是在公司内网没有授权的密码重置操作也与破坏计算机信息系统无异这一点没有任何模糊地带。我在后面提到的每种方法默认前提都是你拥有设备的物理访问权或带外控制台权限如服务器的IPMI/iDRAC、虚拟机控制台。没有这个前提讨论破解本身就毫无意义。再说为什么要重视root。root是Linux系统里的最高权限账号相当于整台设备的万能钥匙。它能读写所有文件、修改所有用户权限、控制系统服务、查看所有进程和日志。一台服务器只要root失守基本等于能把系统里的一切翻个底朝天。正因如此root密码一忘恢复过程就必须谨慎既要能进得去又不能让系统和数据坏在恢复操作上。2. Linux服务器root密码恢复实操从CentOS到Ubuntu全覆盖2.1 CentOS/RHEL 7及以上rd.break方案很多centos7 root密码忘了的场景最后都是用rd.break这个方案解决的。先讲清楚原理系统启动时内核会先加载initramfs内存文件系统rd.break是给initramfs阶段加一个调试中断让系统在真正切换到硬盘上的根文件系统之前停下来落到root shell。这时候硬盘上的根分区还没真正接管系统但其实它已经被挂载在/sysroot下了只是默认以只读方式挂载。我们要做的就是把这个挂载改成可写然后修改密码文件。具体的操作步骤我写一下照着走基本都能成开机进入GRUB启动菜单界面选择要启动的内核按字母e进入编辑模式。找到以linux16或linux开头的那一行在行尾加上rd.break。如果有rhgb quiet这两个参数建议顺手删掉不然启动过程看不到日志输出出问题不好判断卡在哪一步。按CtrlX启动系统稍等片刻会落到一个switch_root:的shell提示符。依次执行下面的命令mount -o remount,rw /sysroot chroot /sysroot第一行是把根文件系统重新挂载为可写状态第二行是切换进真实的根目录。很多人一上来就执行passwd结果报read-only file system就是因为忘了remount这一步。此时已经进入待恢复的真实系统执行passwd root按提示输入两遍新密码。如果你的系统开启了SELinuxCentOS 7以上默认就是Enforcing务必执行touch /.autorelabel。这一句的意思是让系统在下次启动时自动重新标记整个文件系统的SELinux上下文。为什么必须要做因为我们对/etc/shadow文件的修改是在SELinux策略尚未完整加载、安全上下文没有重新计算的情况下完成的。不做这一步下次重启时SELinux可能拒绝认证模块读取shadow文件轻则登录失败重则启动异常折腾半天还以为密码没改成功。执行exit退出chroot再执行一次exit退出switch_root shell系统会自动重启。用新密码登录。如果生成了/.autorelabel文件这次开机通常会比较慢属于正常现象。登录成功后我建议把/ .autorelabel删掉以免后续每次启动都触发全盘重标。2.2 Ubuntu/DebianRecovery Mode方案Ubuntu系列跟CentOS的思路不太一样它默认是不给root账号设置密码的日常都用sudo来提权。所以ubantu切换root这个需求本质上分两种情况要么是把自己设定的sudo用户密码忘了要么是想给root账号本身设一个密码。前者用Recovery Mode改的是对应用户名后者用同一套流程改root即可。Recovery Mode的原理是让GRUB以单用户single方式启动不加载图形界面、不启动远程服务直接给一个root shell。操作步骤如下开机时在GRUB菜单出现前按住Shift键部分UEFI机器需要连续按Esc呼出GRUB菜单。选择Advanced options for Ubuntu然后选择带有recovery mode字样的内核版本。在出现的恢复菜单里用方向键选择root Drop to root shell prompt回车。进入shell后先执行mount -o rw,remount /。和CentOS的rd.break一样默认也是只读挂载不先切可写后面所有写操作都会失败。如果你要改的是那个忘了密码的普通用户执行passwd 用户名如果要给root设密码执行passwd root。重启系统用新密码登录。这里有个细节如果你的Ubuntu系统启用了全盘加密LUKS在进入Recovery Mode之前系统会先要求输入加密盘密码。这个密码和用户密码是两码事如果连加密盘密码都没了那任何系统层面的恢复手段都帮不上忙只能考虑有没有备份了。2.3 更老或嵌入式设备单用户模式与init/bin/sh这个方法在CentOS 6、Ubuntu 14.04之前的老系统上特别好使也是一些轻量级Linux设备常用的恢复手段。原理比rd.break更直接修改内核启动参数让内核启动后的第一个程序直接变成/bin/sh而不是systemd或init。因为系统根本没有进入正常的登录流程所以直接就落在root shell里。操作是在GRUB编辑界面里找到内核启动行在行尾加上single或者更粗暴一点直接改成init/bin/sh然后CtrlX启动。系统起来后你会直接看到sh-4.2#之类的提示符然后照样先检查根分区的挂载是不是只读必要时执行mount -o remount,rw /再执行passwd或者passwd root。需要提醒的是现在很多新发行版对这种方式做了限制。比如RHEL 8之后把init参数改成/bin/sh有时会不生效因为内核和systemd都对init工具有额外检查。所以这个方法我只推荐用在老机器、旧固件设备或者initramfs比较简单的小型设备上。新服务器还是老老实实用rd.break。2.4 三种主流方案对比与选型表不同方案有各自的适用场景我把核心差异整理成了表格方便你按实际情况选恢复方案适用系统核心原理操作难度主要坑点rd.breakRHEL/CentOS 7及更高版本、Rocky Linux、AlmaLinux在initramfs阶段暂停chroot到/sysroot修改密码中等必须remount rwSELinux环境必须touch /.autorelabelRecovery ModeUbuntu、Debian及衍生版GRUB单用户模式直接进入root shell简单默认只读挂载需要先remountsingle/init/bin/shCentOS 6、老Ubuntu、嵌入式Linux内核启动后直接执行shell简单新systemd发行版可能不生效如果你在远程操作一台没有带外管理卡IPMI/iDRAC的服务器这些方法全都用不了。因为改GRUB参数需要虚拟控制台或屏幕键盘。所以在生产环境里带外控制台是比密码本身更重要的基础设施这个钱不能省。3. MySQL/MariaDB root账户被锁时的处置流程3.1 先定位问题Error 1045到底说明什么Error 1045 (28000): Access denied for user rootlocalhost (using password: YES) 这条报错几乎是每个MySQL和MariaDB使用者都撞过的墙。它在说什么意思是客户端用root用户名连接本机数据库时认证被拒绝了。常见原因有这么几类密码不对。最常见的情况是安装时生成的临时密码被搞丢了或者后来改过密码但没记住。root账户的登录来源受限。mysql.user表里root对应的host可能只允许localhost或127.0.0.1登录你如果从别的机器连当然会拒绝。密码过期。MySQL 5.7及更高版本有密码过期策略过期的密码必须重置才能继续使用。认证插件不匹配。MySQL 8.0默认使用caching_sha2_password老版本客户端不支持这个插件时会出现看似密码不对实则插件不兼容的怪事。动手重置之前我建议先确认两件事一是服务到底有没有起来执行systemctl status mysqld或systemctl status mariadb看一眼。二是翻一下错误日志/var/log/mysqld.log看看里面有没有关于密码过期、插件加载失败的线索。别上来就搞重启大法结果排查半天发现服务根本没启动方向就错了。3.2 方案一跳过授权表启动这是网上最流行、也确实最有效的办法。原理很简单mysqld在启动时默认会加载mysql.user等授权表来做身份认证--skip-grant-tables参数让它跳过这个加载过程于是root就能无密码进入。操作如下停止数据库服务systemctl stop mysqld # 或者 systemctl stop mariadb以跳过授权表的方式临时启动mysqld_safe --skip-grant-tables --skip-networking 加--skip-networking的理由很实在用无认证状态暴露在网络端口上等于把数据库大门敞开局域网内任何机器都可能连进来。这个参数能保证只有本机能连最大程度降低风险。另开一个终端直接执行mysql -uroot就能进去。进入后第一件事执行FLUSH PRIVILEGES;。这一句非常关键它的作用是让权限表重新生效。如果不做这一步后面的ALTER USER语句会被拒绝因为当前会话还处于跳过授权表的状态。然后执行密码修改语句ALTER USER rootlocalhost IDENTIFIED BY 新密码;如果你的MySQL是5.6或更早的版本用老的写法SET PASSWORD FOR rootlocalhost PASSWORD(新密码);退出MySQL杀掉临时启动的mysqld进程。可以用mysqladmin shutdown优雅关闭也可以直接kill掉进程PID。用正常方式启动服务systemctl start mysqld用新密码验证登录mysql -uroot -p输入新密码能进去就算大功告成。用这个方法还有个细节如果你用的是MySQL 8.0默认认证插件是caching_sha2_password。如果之后用老版本客户端连不上可以临时把root账户改成传统插件ALTER USER rootlocalhost IDENTIFIED WITH mysql_native_password BY 新密码;新环境我其实更建议升级客户端来适配caching_sha2_password毕竟它是MySQL 8默认的安全方案没必要为了兼容老客户端降低安全等级。3.3 方案二--init-file方式这个方案不如skip-grant-tables那么普及但在某些场景下更干净尤其是你实在不想在交互式MySQL环境里敲命令的时候。原理是让mysqld启动时执行一个指定的SQL文件同样绕过了常规认证流程。操作步骤创建一个SQL文件比如/tmp/reset.sql内容就一行ALTER USER rootlocalhost IDENTIFIED BY 新密码;停止数据库服务。用init-file方式启动mysqld --usermysql --init-file/tmp/reset.sql --daemonize启动成功后立刻删除这个临时文件rm -f /tmp/reset.sql用新密码登录验证。有几个坑我得提前说init-file不能放在MySQL的数据目录下否则可能因为目录权限拒绝读取也不要用root用户运行mysqld很多发行版会直接报cannot install as root user拒绝启动。用--usermysql参数拉起服务是最稳妥的。另外每次用完后务必删除SQL文件否则服务器重启后这个后门还可能再次生效等于给系统埋雷。3.4 重置之后的安全加固动作密码找回来是第一步真正考验运维水平的是改完密码之后能不能顺手把安全状态收拾好。我每次重置完数据库root都会按这个清单过一遍清理匿名账号和测试库。MySQL默认安装会创建test库和匿名用户执行DROP USER localhost;和DROP DATABASE IF EXISTS test;把它们清掉。检查root的登录主机范围。执行SELECT user,host,plugin FROM mysql.user WHERE userroot;看看root是不是只允许localhost登录。生产环境root账户最好不要对外网开放。配置密码复杂度策略。MySQL和MariaDB都有validate_password组件给mariadb root设置密码时如果你的密码太简单会被策略拒绝。这是好事说明系统在逼着你用强密码。看看错误日志是否干净。特别是有没有人在你重置密码之前尝试过爆破登录日志里会有大量Access denied记录这就是信号。4. 安卓与电视盒子场景下的root权限理解4.1 root权限的本质与权限差异手机和电视盒子界的root跟服务器上的root原理相通都是拿到Linux内核里的UID 0管理员权限。区别在于移动设备的系统分区/system默认是只读的root之后才能对系统分区写入从而修改系统应用、删除预装软件、导出完整应用数据。于是就有了临时root和永久root之分临时root重启失效常用于导出游戏存档、备份应用数据永久root会改写系统分区更彻底但也更容易破坏系统完整性。现在的安卓系统安全机制越来越严格获取root的方式也在变化。有的是利用系统漏洞提权有的是通过官方解锁bootloader后刷入带有root权限的内核镜像。无论哪种只要设备root了下一步就该思考怎么管理这个权限而不是让它裸奔。4.2 电视盒子root的操作思路与风险电视盒子这块网上搜得到大量b860av2.1-a root固件之类的词条。所谓盒子root本质就是开启ADB调试、解锁bootloader之后刷入一个带root权限的boot镜像。和手机root类似难点主要在于盒子型号太杂、芯片平台不统一、固件版本各不相同。一个固件包只适用于特定硬件版本的设备刷错了就是变砖的结局。我认识不少折腾盒子的玩家他们root盒子的目的无非是装第三方应用、卸载预装全家桶、开机自启某个软件所以你能看到auto start root这类热词。我的建议是先确认设备型号和固件版本找到精准匹配的资源再动手。准备好线刷工具或短接救砖方案以防变砖。弄清楚保修状态root之后大多数厂商不再提供保修。如果只是卸载预装软件优先尝试ADB的pm uninstall -k --user 0命令这个操作不需要root也能把应用从当前用户空间移除风险小得多。4.3 免root工具的真实原理与风险网上还有一类很流行的免root工具比如免root备份、免root虚拟相机、免root卸载等。它们并不是真的获取了root权限而是利用了Android的辅助功能Accessibility、设备所有者模式Device Owner或备份API来实现部分功能。这种方案的好处是不破坏系统、不影响保修但能做的东西远没有root多。这里要特别提一个风险点像免root卸载QQ上号器这类第三方工具经常通过辅助功能模拟点击、读取屏幕内容涉及极高的隐私风险。你授权给这类工具的权限可能比root还危险因为它是在你的应用层拿最高控制权。我的态度很明确第三方非开源、来源不明的免root工具一律不要装。真要管理应用用官方ADB命令或者系统自带的应用管理就好。5. 重置密码时最容易踩的坑与安全审计思路5.1 高频翻车点速查表这么多年帮人处理密码恢复问题我总结出了一张高频翻车表你可以直接抄走症状真正原因解决办法passwd报read-only file system执行passwd之前没有重新挂载根分区为可写先执行 mount -o remount,rw /sysroot或 /CentOS重启后无法登录改了/etc/shadow之后没有执行touch /.autorelabelSELinux上下文错乱回到rd.break环境touch /.autorelabel后重启登录时提示密码正确但反复被拒PAM模块策略限制或者账号被锁定/etc/shadow里密码位是!或*用usermod -U root解除锁定检查pam.d配置文件rd.break后系统起不来忘记了加密盘LUKS密码或者autorelabel过程被中断只能靠备份恢复或者重新初始化系统MySQL ALTER USER被拒绝没有先执行FLUSH PRIVILEGES进入MySQL后先FLUSH再执行ALTERMySQL改了密码后老客户端连不上MySQL 8默认插件caching_sha2_password与老客户端不兼容改用mysql_native_password或升级客户端GRUB界面按e没反应UEFI机器快速启动导致GRUB菜单一闪而过开机时连续按Esc或F2进BIOS关闭快速启动5.2 密码强度策略与字典在审计中的用法很多人听到python密码破解字典下载这类热词就兴奋以为拿到一份好字典就能天下无敌。实际上字典在正儿八经的安全审计里是用于检测自有系统弱口令的。比如你在做合规检查时拿到授权之后用known公开字典如SecLists这类安全社区维护的清单对自己的服务器做一轮弱口令测试看哪些账号能字典直接命中然后强制相关账号改密码。这才是字典的正确用途。系统层面的密码策略我建议至少做到这样几件事在/etc/login.defs里设置密码有效期和最小长度比如PASS_MAX_DAYS 90、PASS_MIN_LEN 12。配置PAM的密码质量模块。CentOS和Ubuntu都有pam_pwquality.so可以限制密码必须包含大小写、数字和特殊字符禁止连续相同字符禁止与用户名相同。定期检查/etc/shadow中是否存在空密码或弱密码账号。用一条命令就能排查哪些账号没有密码awk -F: ($2){print $1} /etc/shadow结果里如果出现用户名这就是严重的安全隐患。数据库也一样密码复杂度由validate_password组件接管建议直接启用。5.3 生产环境的应急恢复预案最后聊聊生产环境的建议这部分是真的经验之谈。我把密码恢复这件事当成一项应急预案来做包括给每台服务器配置带外管理通道IPMI或iDRAC都行。没有带外管理密码忘了就只能跑机房接显示器那个代价太高了。建立一套免密码的应急登录机制。比如配置root的SSH密钥登录同时只允许特定管理网段连接SSH。这样即使密码丢失还能用密钥登录进去重置密码。文档化所有root密码的存放方式。用企业密码保险库也好用加密的本地Keepass也好重点不在于存哪儿而在于关键时刻想不起来、找不到、没记录这类事情绝对不能发生。定期做一次密码恢复演练。我个人的习惯是新装一台服务器就会顺手走一遍rd.break恢复流程验证系统可用性。真正等密码丢了才第一次操作手忙脚乱是免不了的。结尾我个人在实际操作中的体会是root密码恢复这类操作真正考验人的不是那几条命令而是对启动流程、文件系统挂载状态、SELinux策略、数据库认证机制这些底层原理的理解。命令背得再熟不懂为什么遇到read-only file system、SELinux上下文错乱这些变体问题照样抓瞎。反过来把原理吃透你就发现所有恢复手段都是相通的要么在系统完成登录认证之前截获shell要么把认证模块临时绕过去改完再恢复正常秩序。希望这篇内容能帮你少踩几个坑下次真遇到root密码丢了能稳稳地把访问权拿回来。
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进