root@yjxy26:~# ▊ 应急响应 · 系列 01 · 免密进入
INCIDENT RESPONSE · ROOT PASSWORD RECOVERY

拿到应急响应镜像
不知道密码,怎么进去?

从启动原理到实战操作,讲透"按 e + rd.break 免密改密码"的完整链路,并附上 5 种类似解题方法对比,帮你建立应急响应的取证思路。

目标:CentOS 7 / RHEL 7 入口:GRUB 编辑 难度:入门 关键词:rd.break / chroot / shadow
01 · Scenario

场景与目标

你拿到一个应急响应题的虚拟机镜像(vmdk / vmx),需要进去查看日志、后门、计划任务等攻击痕迹——但不知道 root 密码,甚至登录界面都进不去。

核心思路 密码验证只发生在"登录"那一步。只要在系统正式启动之前停下来,从启动链路上绕到根文件系统里直接改 /etc/shadow,就不需要任何密码。静态取证(不开机读镜像)和启动链绕行(开机免密进入)是两条殊途同归的路线。
02 · Principle

启动流程与密码防线

系统开机像一场接力赛,密码防线在最后一步才出现:

boot chain · 7 步
BIOS/固件  →  GRUB 引导器  →  内核 + initramfs  →  switch_root(挂载真盘 /sysroot)
   ↓ ①          ↓ ②                ↓ ③                   ↓ ④
自检硬件    按 e 可编辑启动参数   加载临时小系统          正式切换到真实根文件系统

switch_root  →  systemd  →  登录验证 PAM
      ↓ ⑤           ↓ ⑥          ↓ ⑦
换乘点       启动服务      ← 密码防线在这里!(校验 /etc/shadow)

为什么 rd.break 能免密

rd.break = dracut 刹车
内核参数 rd.break 让系统在 switch_root 之前停住,进入 initramfs 紧急 shell。
此时:
  · 真实根文件系统只读挂在  /sysroot        # 门锁还没装上
  · systemd / 登录程序 都还没启动            # 管家还在睡觉
  · 没有 PAM,没有任何密码校验              # 指纹锁未通电
一句话理解 密码只在"登录验证"那一步起作用,而 rd.break 让你停在它之前——你是趁门锁还没装好进屋改密码的。
03 · Practice

rd.break 改密码 · 全流程

以下 7 步是经过验证的完整流程,跟着做即可。所有命令都可在 vSphere / VMware / VirtualBox / 物理机的 CentOS 7 上复现。

目标界面 · GRUB 启动菜单(就是在这里按 e)
                    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 秒倒计时自动启动)
按 e 的位置和时机(新手最容易卡在这) ① 时机:虚拟机开机后,这个黑色菜单出现的 5 秒倒计时内,第一项高亮时按 e。
② 前提:在 VMware 里先单击虚拟机窗口,让键盘输入进入虚拟机——否则按了没反应。
③ 没赶上菜单?重启,开机后按住 Shift(传统 BIOS)或快速连按 Esc(UEFI),强制显示菜单。
④ 别按错地方:BIOS 自检界面和系统启动后的界面按 e 都没用,只有这个菜单里有效。
1

在 GRUB 菜单第一项高亮时按 e

看到上面的黑色菜单(第一项 CentOS Linux (3.10.0-1160...) 高亮)时立刻按 e,进入编辑界面。进去后光标在底部,用 ↓ 滚到 linux16 /vmlinuz-... 那一行(它在 fi 下方,屏幕可能没显示全,要往下滚)。

2

linux16 行尾加 rd.break

把光标移到该行行尾,先加一个空格再输入 rd.break。不要贴到上一个参数上,参数之间必须空格分隔。

修改前 → 修改后
linux16 /vmlinuz-3.10.0-1160.el7.x86_64 root=UUID=... ro crashkernel=auto rhgb quiet rd.break
3

按 Ctrl+x 启动

进入紧急模式,提示符变成 switch_root:/#。这是 initramfs 的 shell,此时整个系统在你手里。

4

重挂根盘可写 + chroot

switch_root:/#
mount -o remount,rw /sysroot   # 默认只读,必须改成可写
chroot /sysroot                # 进入真正的根文件系统

成功后提示符变成 sh-4.2#,你现在就在 CentOS 的真实系统里,拥有 root 全部权限。

5

用英文输出改密码(避开方块字)

sh-4.2#
LANG=C passwd root
Changing password for user root.
New password:
Retype new password:
passwd: all authentication tokens updated successfully.  ← 看到这行才成功

LANG=C 强制英文输出——系统是中文环境,紧急模式控制台没有中文字体,中文提示会显示成方块 ▉▉,英文则完全正常。

6

排除 SELinux + 退出重启

sh-4.2#
touch /.autorelabel   # 让 SELinux 下次启动重新标记文件(防登录被卡)
exit                  # 退出 chroot
exit                  # 退出紧急模式,继续启动
reboot
7

正常登录验证

重启后 grub 直接回车(不要再按 e),登录界面输入 root + 你刚设的密码。注意 Caps Lock 和输入法半角。

04 · Pitfalls

避坑指南(真实踩过的坑)

坑 1 · 中文变方块 ▉▉▉ 现象:passwd 输出全是方块,看不到成功/失败。原因:LANG=zh_CN.UTF-8 但紧急模式无中文字体。解法:用 LANG=C passwd root 强制英文,看到 all authentication tokens updated successfully 才作数。
坑 2 · BAD PASSWORD 太短 现象:提示 The password is shorter than 8 characters。原因:密码不足 8 位。注意:这是警告不是拒绝,root 可覆盖,但最好设 ≥8 位(如 RootLab#927)。
坑 3 · 改完密码登录失败 排查顺序:① 确认 hash 真的变了(grep '^root:' /etc/shadow 对比前后);② 加 touch /.autorelabel 排除 SELinux;③ 检查大小写/输入法;④ 直接替换 hash(openssl passwd -6 '密码' 生成后写进 shadow)。
坑 4 · rescue 项 ≠ 免密 GRUB 菜单第二项 0-rescue-... 是救援模式,但它照样要密码(sulogin)。忘记密码必须走第一项 + rd.break,不要选 rescue。
05 · More Methods

5 种类似"免密进系统"方法

rd.break 不是唯一入口。应急响应题里,根据你手上的条件(能不能开机、有没有镜像文件、是不是物理机),有不同选择。

方法原理密码防线适用场景
① rd.break(本教程)switch_root 前刹车,chroot 改 shadow未启动 ✓有控制台 / 能操作虚拟机
② 单用户模式 singlesystemd 进入 rescue.target(或 s / 1 参数)可能要求 ✓✗CentOS7 默认需密码,需配合配置
③ init=/bin/sh用 /bin/sh 顶替 init 直接拿 shell未启动 ✓老内核 / 脚本化批量重置
④ 挂载镜像改 shadow(静态取证)不启动系统,把 vmdk/LVM 挂到别处直接改文件完全无关 ✓虚拟化环境,有镜像文件(推荐用于"做题")
⑤ Live CD / PE 启动盘从外部系统挂载目标硬盘完全无关 ✓物理机

进系统后要查什么(取证清单)

post-entry · recon
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 后门是否生效
06 · Playbook

应急响应通用套路(学习路线)

这一类题目万变不离其宗,按下面的顺序排查,就能还原完整攻击链:

incident-response · checklist
① 账号排查     /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
关键心法 证据交叉验证:bash_history 说做过的事,要用文件 md5、日志、时间戳去验证——题目的"布景时间"(如 access_log 里的 2025-12-19)与实际文件时间(如 8/27)矛盾时,以证据链为准,说明这是出题人构造的现场。
07 · Cheatsheet

命令速查卡

免密改密码 · 一条龙

grub 按 e → linux16 行尾加 rd.break → Ctrl+x
mount -o remount,rw /sysroot
chroot /sysroot
LANG=C passwd root
touch /.autorelabel
exit → exit → reboot

生成密码 hash(Windows / 任意 Linux)

openssl passwd -6 'MyPass#2026'
# 输出 $6$... 直接替换 /etc/shadow 第一行第 2 字段

验证密码是否写入

grep '^root:' /etc/shadow
# hash 与之前不同 = 已写入成功