拿到应急响应镜像
不知道密码,怎么进去?
从启动原理到实战操作,讲透"按 e + rd.break 免密改密码"的完整链路,并附上 5 种类似解题方法对比,帮你建立应急响应的取证思路。
场景与目标
你拿到一个应急响应题的虚拟机镜像(vmdk / vmx),需要进去查看日志、后门、计划任务等攻击痕迹——但不知道 root 密码,甚至登录界面都进不去。
启动流程与密码防线
系统开机像一场接力赛,密码防线在最后一步才出现:
BIOS/固件 → GRUB 引导器 → 内核 + initramfs → switch_root(挂载真盘 /sysroot) ↓ ① ↓ ② ↓ ③ ↓ ④ 自检硬件 按 e 可编辑启动参数 加载临时小系统 正式切换到真实根文件系统 switch_root → systemd → 登录验证 PAM ↓ ⑤ ↓ ⑥ ↓ ⑦ 换乘点 启动服务 ← 密码防线在这里!(校验 /etc/shadow)
为什么 rd.break 能免密
内核参数 rd.break 让系统在 switch_root 之前停住,进入 initramfs 紧急 shell。 此时: · 真实根文件系统只读挂在 /sysroot # 门锁还没装上 · systemd / 登录程序 都还没启动 # 管家还在睡觉 · 没有 PAM,没有任何密码校验 # 指纹锁未通电
rd.break 改密码 · 全流程
以下 7 步是经过验证的完整流程,跟着做即可。所有命令都可在 vSphere / VMware / VirtualBox / 物理机的 CentOS 7 上复现。
GNU GRUB version 2.02
┌────────────────────────────────────────────────┐
│▶CentOS Linux (3.10.0-1160.el7.x86_64) 7 (Core) │ ← 第一项(高亮条)
│ CentOS Linux (0-rescue-31ec54fd-...) 7 (Core) │
│ │
│ Use the ↑ and ↓ keys to select. │
│ Press 'e' to edit, 'c' for a command line. │ ← 按 e 的提示就在这
└────────────────────────────────────────────────┘
(默认 5 秒倒计时自动启动)② 前提:在 VMware 里先单击虚拟机窗口,让键盘输入进入虚拟机——否则按了没反应。
③ 没赶上菜单?重启,开机后按住 Shift(传统 BIOS)或快速连按 Esc(UEFI),强制显示菜单。
④ 别按错地方:BIOS 自检界面和系统启动后的界面按 e 都没用,只有这个菜单里有效。
在 GRUB 菜单第一项高亮时按 e
看到上面的黑色菜单(第一项 CentOS Linux (3.10.0-1160...) 高亮)时立刻按 e,进入编辑界面。进去后光标在底部,用 ↓ 滚到 linux16 /vmlinuz-... 那一行(它在 fi 下方,屏幕可能没显示全,要往下滚)。
linux16 行尾加 rd.break
把光标移到该行行尾,先加一个空格再输入 rd.break。不要贴到上一个参数上,参数之间必须空格分隔。
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=... ro crashkernel=auto rhgb quiet rd.break按 Ctrl+x 启动
进入紧急模式,提示符变成 switch_root:/#。这是 initramfs 的 shell,此时整个系统在你手里。
重挂根盘可写 + chroot
mount -o remount,rw /sysroot # 默认只读,必须改成可写 chroot /sysroot # 进入真正的根文件系统
成功后提示符变成 sh-4.2#,你现在就在 CentOS 的真实系统里,拥有 root 全部权限。
用英文输出改密码(避开方块字)
LANG=C passwd root Changing password for user root. New password: Retype new password: passwd: all authentication tokens updated successfully. ← 看到这行才成功
LANG=C 强制英文输出——系统是中文环境,紧急模式控制台没有中文字体,中文提示会显示成方块 ▉▉,英文则完全正常。
排除 SELinux + 退出重启
touch /.autorelabel # 让 SELinux 下次启动重新标记文件(防登录被卡) exit # 退出 chroot exit # 退出紧急模式,继续启动 reboot
正常登录验证
重启后 grub 直接回车(不要再按 e),登录界面输入 root + 你刚设的密码。注意 Caps Lock 和输入法半角。
避坑指南(真实踩过的坑)
LANG=C passwd root 强制英文,看到 all authentication tokens updated successfully 才作数。The password is shorter than 8 characters。原因:密码不足 8 位。注意:这是警告不是拒绝,root 可覆盖,但最好设 ≥8 位(如 RootLab#927)。grep '^root:' /etc/shadow 对比前后);② 加 touch /.autorelabel 排除 SELinux;③ 检查大小写/输入法;④ 直接替换 hash(openssl passwd -6 '密码' 生成后写进 shadow)。0-rescue-... 是救援模式,但它照样要密码(sulogin)。忘记密码必须走第一项 + rd.break,不要选 rescue。5 种类似"免密进系统"方法
rd.break 不是唯一入口。应急响应题里,根据你手上的条件(能不能开机、有没有镜像文件、是不是物理机),有不同选择。
| 方法 | 原理 | 密码防线 | 适用场景 |
|---|---|---|---|
| ① rd.break(本教程) | switch_root 前刹车,chroot 改 shadow | 未启动 ✓ | 有控制台 / 能操作虚拟机 |
| ② 单用户模式 single | systemd 进入 rescue.target(或 s / 1 参数) | 可能要求 ✓✗ | CentOS7 默认需密码,需配合配置 |
| ③ init=/bin/sh | 用 /bin/sh 顶替 init 直接拿 shell | 未启动 ✓ | 老内核 / 脚本化批量重置 |
| ④ 挂载镜像改 shadow(静态取证) | 不启动系统,把 vmdk/LVM 挂到别处直接改文件 | 完全无关 ✓ | 虚拟化环境,有镜像文件(推荐用于"做题") |
| ⑤ Live CD / PE 启动盘 | 从外部系统挂载目标硬盘 | 完全无关 ✓ | 物理机 |
进系统后要查什么(取证清单)
cat /tmp/.pwd # PAM 后门偷录的密码 ls -la /root/ | grep -E "pam|Linux-PAM" # root 家目录后门痕迹 cat /var/lib/mysql/syscache.php # webshell(反弹 shell 就在这) grep -E "etc/passwd|db_sql" /var/log/httpd/access_log # Web 攻击日志 md5sum /usr/lib64/security/pam_unix.so # 对比 PAM 后门是否生效
应急响应通用套路(学习路线)
这一类题目万变不离其宗,按下面的顺序排查,就能还原完整攻击链:
① 账号排查 /etc/passwd /etc/shadow # UID=0 后门账号 ② 认证后门 /root/.bash_history # 攻击者操作链,信息量最大 /tmp/.pwd /usr/lib64/security/ # PAM 后门 / 万能密码 ③ Web 攻击 /var/log/httpd/access_log # 攻击 IP → 漏洞 → webshell find / -name "*.php" 找 webshell ④ 反弹 shell /var/log/secure # SSH 登录时间线 ⑤ 持久化 计划任务 / rc.local / systemd / authorized_keys ⑥ 时间线交叉 文件时间戳 vs 日志时间戳 vs bash_history