ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

虚拟机密码忘了怎么办?Linux/Windows密码恢复重置全攻略

虚拟机密码忘了怎么办?Linux/Windows密码恢复重置全攻略 你有没有遇到过这种情况一台测试用的Linux虚拟机放了两三个月再打开时死活想不起来root密码或者给客户部署了一个Windows虚拟机交接时对方一脸无奈说密码忘了进不去系统了。身边的同事第一反应往往是破解一下但说句大实话真正的虚拟机密码恢复九成以上是重置而不是破解——系统是你自己的、磁盘文件也是你手里的你需要解决的只是没有登录凭证时如何重新拿回控制权这件事。这篇文章就把VMware Workstation和VirtualBox下常见的Linux/Windows虚拟机密码恢复方法、底层原理、操作细节和坑一次讲清楚适合运维、测试、以及把虚拟机当主力开发环境的朋友参考。我先把话说在前头所有操作仅适用于你拥有或已获授权的虚拟机用来找回自己忘记的密码未经授权去动别人的系统无论在哪个圈子都是大忌。1. 先搞清楚这到底算不算破解1.1 你需要先分清合法边界很多人一搜虚拟机密码破解脑子里浮现的都是暴力跑字典、绕过登录界面那套东西。但实际操作里碰到最多的情况就是自己设的密码忘了或者维护的旧虚拟机密钥没有交接记录。自己的虚拟机用重置的办法拿回访问权完全合规但如果是别人托管的、没有书面授权的虚拟机那一律不要碰哪怕对方口头说没事你试试。我见过有人为了在同事面前展示技术偷偷去重置别人测试机的密码结果那台虚拟机里跑着一个没备份的数据库最后数据没救回来既丢了里子也丢了面子。所以这篇文章的边界非常明确讨论的是找回你自己系统的访问权不是入侵。1.2 虚拟机密码到底存在哪里要理解后续的操作得先知道系统密码放在哪。Linux系统的用户密码哈希保存在/etc/shadow文件里普通用户不可读只有root能读写当你输入密码登录时系统会把输入内容做哈希运算再和shadow里存的那串值比对。Windows系统则是把SAMSecurity Account Manager数据库存放在C:\Windows\System32\config\SAM注册表里还存着一份缓存密码哈希同样在里面。明白了这一点思路就打开了只要能读取并修改这些密码文件就能重置密码根本不需要爆破。虚拟机相对物理机有个天然优势——整个磁盘就是一个普通文件VMDK、VHD、VDI或QCOW2宿主机可以直接挂载、复制、修改。这就是虚拟环境下密码恢复比物理机容易得多的根本原因。物理机你可能还得拆机、做PE盘、进BIOS改启动顺序虚拟机只需要在VMware或VirtualBox的界面里换一个启动镜像就行。1.3 动手之前先做三件准备先说个血泪教训我曾经在一台运行着CentOS 7的虚拟机上直接修改/etc/shadow里的密码哈希改完重启发现系统完美启动我还挺得意。结果第二天才发现这台机器上有应用在读取同一个用户的密码做定时任务我这么一改把整个联动逻辑搞崩了。所以在重置前我建议所有操作都先做准备快照Snapshot在VMware或VirtualBox里给当前状态打一个快照。一旦操作失误可以秒回原状这是虚拟机环境给的最大容错福利不用白不用。备份磁盘文件把VMDK或VDI文件复制一份到其他目录。快照擅长防改坏全量备份则能防磁盘损坏两件事最好都做。记录当前版本信息确认虚拟机里装的具体是哪个系统版本、用了什么文件系统、有没有开启磁盘加密LUKS/BitLocker。这些信息决定了你选哪条重置路线比如Ubuntu 22.04默认的GRUB策略和CentOS 6时代的GRUB就完全不同。2. Linux虚拟机忘记密码折腾GRUB是主流办法2.1 单用户模式重置密码的完整流程Linux系统的密码重置最常用的路数是进入单用户模式也就是跳过正常的登录界面直接拿到一个root shell。绝大多数发行版包括Ubuntu、Debian、CentOS、Rocky Linux流程都差不多。第一步启动虚拟机在GRUB菜单出现时按e键进入编辑模式。以CentOS/RHEL系为例找到以linux16或linuxefi开头的那一行它负责引导真正的内核行尾会有rhgb quiet这种参数。把这两个参数删掉或保留都行关键是追加一段内容rw init/sysroot/bin/sh注意这里一定要写rw意思是让根文件系统以读写方式挂载。如果不加默认是只读挂载后续操作会直接报Read-only file system。第二步按Ctrl X或F10启动进入这个特殊的shell。在RHEL/CentOS 7之后的版本里你会进入一个带switch_root提示符的临时环境需要手动执行chroot /sysroot之所以要先chroot是因为此时系统还没完成正常的初始化流程真正的根目录挂在/sysroot下。进入chroot环境之后你面对的就是一个完整可读写的根目录了。第三步直接改密码。最简单的方式passwd root输入两遍新密码即可。如果是重置普通用户比如testuser就执行passwd testuser。改完之后在RHEL系系统上还有一个非常关键的步骤——SELinux重打标签touch /.autorelabel为什么要做这一步因为SELinux会给文件打安全上下文标签你刚才用shell直接修改了/etc/shadow这个文件的SELinux标签可能已经不对了。如果不重打标签重启后系统极有可能因为SELinux拒绝访问/etc/shadow出现无法登录或者各种诡异问题。Ubuntu/Debian系统默认SELinux未启用这一步可以跳过。第四步重启。直接执行reboot或者exit之后正常重启用新密码登录即可。2.2 进不去GRUB用LiveCD路线改shadow单用户模式虽然快但有个前提你能进GRUB菜单。如果GRUB被隐藏了默认超时设成0、GRUB菜单损坏、或者虚拟机用了UEFI引导且启动项乱了这条路就断了。这时候就需要曲线救国——用LiveCD镜像启动一个临时系统挂载原来的磁盘直接修改密码文件。第一步在虚拟机设置里把ISO镜像换成Ubuntu或CentOS的安装盘。以Ubuntu Live镜像为例启动后选择Try or Install Ubuntu进入Live桌面环境。第二步打开终端查看磁盘分区sudo fdisk -l虚拟机磁盘一般是/dev/sda或/dev/nvme0n1。Linux系统分区通常是/dev/sda1EFI分区、/dev/sda2根分区这种布局。挂载根分区sudo mount /dev/sda2 /mnt这里有个很常见的坑如果根分区是LVM逻辑卷分区名会变成/dev/mapper/centos-root或/dev/mapper/ubuntu--vg-ubuntu--lv直接用fdisk -l看不到。先用sudo lvs查看逻辑卷列表再挂载对应路径。第三步挂载完以后需要把宿主系统的相关目录绑定过去否则chroot进去之后网络、设备都没有。执行sudo mount --bind /dev /mnt/dev sudo mount --bind /proc /mnt/proc sudo mount --bind /sys /mnt/sys然后chroot进去sudo chroot /mnt接下来就和单用户模式一样了用passwd修改密码必要的时候执行touch /.autorelabel。还有一招更直接的不进入chroot写一个小脚本把新密码哈希替换到/etc/shadow。如果你是在另一台Linux机器上操作虚拟磁盘可以用openssl passwd -6生成哈希openssl passwd -6 mynewpassword然后用sed替换/mnt/etc/shadow里对应行的第二个字段。这招适合脚本化批量处理但我个人不推荐新手直接用因为容易搞错字段格式手动改错一个字符都会导致密码无法验证。2.3 为什么单用户模式不是万能钥匙如果你按上面的流程操作会发现单用户模式在很多新发行版上不是百分百成功的。主要原因有几个第一systemd的默认target限制。现代systemd系统里传统的单用户模式本质上是被引导进入rescue.target或emergency.target。但有些系统在GRUB里没有显式配置该target或者root文件系统挂载失败后直接掉进emergency shell而emergency shell有时是只读的。所以我在前面特意强调内核实参里要加rw而不是依赖系统自动挂载。第二签名校验与安全启动。如果虚拟机的固件启用了Secure Boot而你的Ubuntu版本又完整验证了内核签名和initramfs签名那么手动修改过的GRUB启动项可能直接被拒。这时候要么在BIOS/虚拟机固件设置里临时关闭Secure Boot要么走LiveCD路线后者更省心。第三密码字段本身被锁。有些系统的/etc/shadow里密码字段开头是!或*表示该账户被锁定或密码登录被禁止。单用户模式下用passwd重置如果发现重置完了还是没法登录记得检查一下shadow里的字段。可以用passwd -u root解锁账户或者直接看usermod -L/-U的状态。这个细节不多见但排查问题时容易绕弯路。3. Windows虚拟机忘记密码替换法效率最高3.1 用Windows安装镜像进入恢复环境Windows虚拟机的密码恢复思路和Linux不一样Windows没有单用户模式这种通用的等效方案但有一个流传很广、也确实有效的辅助工具替换法。核心思路是Windows系统有一个叫轻松使用Utilman.exe的辅助功能可以在登录界面底部被触发而且它是以SYSTEM权限运行的。如果我们把这个文件替换成cmd.exe那在登录界面点一下轻松使用就能得到一个SYSTEM权限的命令行想改什么密码都行。具体操作分几步。第一步把Windows安装ISO挂载到虚拟机光驱在虚拟机设置里勾选启动时连接。启动时按F2或DEL进入固件界面把光驱启动顺序调到硬盘之前或者直接在VMware的电源菜单里选择打开电源时进入固件。第二步从ISO启动后在安装界面按Shift F10打开命令提示符。现在需要找到系统装在哪个盘。执行diskpart list volume假设计算机硬盘是C:执行以下命令把原系统的utilman.exe备份出来move C:\Windows\System32\utilman.exe C:\Windows\System32\utilman.exe.bak copy C:\Windows\System32\cmd.exe C:\Windows\System32\utilman.exe如果你在使用Windows 10/11较新的镜像时发现move命令提示权限不足可以先把ISO里的install.wim释放出来的PE环境跑起来或者直接用下一步提到的chntpw路线。在PE环境里C:盘可能变成D:需要先用dir D:\Windows确认一下。第三步关闭命令提示符正常重启虚拟机这时候不是从ISO启动了改成从硬盘启动。在锁屏界面点击右下角的轻松使用图标就是那个小人加时钟的图标弹出的不再是辅助功能设置而是一个管理员命令行窗口。在里面执行net user先看一下有哪些用户然后重置管理员或其他用户密码net user Administrator newpassword123需要注意net user改密码时会受本地策略中的密码复杂度要求影响如果系统开启了复杂度策略太简单的密码会失败。测试机还好域环境下可能还会触发账户锁定策略这个后面细说。改完密码后双击锁屏界面的用户头像输入新密码就能进系统了。进去之后别忘了把utilman.exe还原否则以后该功能不可用。从恢复环境里反向操作即可copy C:\Windows\System32\utilman.exe.bak C:\Windows\System32\utilman.exe del C:\Windows\System32\utilman.exe.bak3.2 用chntpw离线修改Windows SAM数据库替换法依赖Windows能进入恢复环境或PE。但如果虚拟机的BitLocker加密、恢复环境组件故障、或者你手里连Windows安装ISO都没有可以考虑用chntpw这个开源小工具。它是专门用来离线编辑Windows注册表SAM文件的在Linux下就能运行。思路是先把Windows虚拟磁盘挂载到一个Linux环境这一步我会在第四章详细讲然后找到Windows/System32/config/SAM文件用chntpw读取和修改。基本命令chntpw -i SAM进入交互菜单后选择1Edit user data and passwords然后输入用户名。chntpw会显示几个选项1清空密码、2设置一个新密码它写的是Unlock并重设、3设为管理员组成员等。我实际测试下来选项1blank password最省事因为chntpw直接写NT哈希的空密码比它自己生成的哈希兼容性更好。清空密码之后Windows锁屏界面里直接按回车就能登录然后再去net user设置新密码。这里说个细节chntpw清空密码后有些Windows版本第一次登录会卡在正在准备桌面较长时间不要慌等一会儿就好实在不行再重启一次。chntpw的局限性在于它不能处理BitLocker加密的磁盘一旦SAM文件本身被加密必须在挂载前先用BitLocker密钥解锁卷。另外它对Windows 11的本地账户支持还行但微软账户登录就会复杂很多——这里不讨论在线账户只针对本地账户毕竟虚拟机场景里绝大多数都是本地账户。3.3 重置之后要处理的三个细节Windows密码重置成功不代表万事大吉。以下几个细节很容易被忽略但影响很大第一替换文件一定要还原。我见过有人用替换法进了系统密码也改了但是utilman.exe一直没还原。过了一个月需要用到轻松使用功能时才发现系统组件损坏修复起来特别麻烦。趁刚登录系统还记得第一时间还原最稳。第二账号锁定状态。如果这台虚拟机曾经被人暴力尝试过密码或者加入了域环境虽然虚拟机场景少见重置密码时可能遇到账户被锁定的情况。在cmd窗口里执行net user username /active:yes可以确认账户是否禁用再执行net user username /times看一下是否有登录时间限制。本地虚拟机一般没有这个限制但加固过的Windows Server镜像就可能有。第三Windows密码哈希缓存。重置密码后其他设备如果之前用这台虚拟机的凭据连过来比如宿主机映射了虚拟机的共享文件夹需要重新输入新密码。如果发现连接不上清理宿主机上凭据管理器里的旧记录即可。4. 实操环节VMDK/VHD镜像的挂载与密码文件定位4.1 在宿主机上把虚拟磁盘变成可访问盘不管是Linux还是Windows方案都有一个共通的底层技能把虚拟磁盘文件挂载成宿主机可访问的盘。这项技能在密码重置之外也很有用比如从旧虚拟机里拷数据、修复损坏的系统文件。最省事的做法是直接在VMware Workstation的虚拟机设置里操作。选中硬盘设备点击映射勾选以只读模式打开Windows宿主机就会像插了一个U盘一样把VMDK里的分区显示成盘符。注意默认强烈建议只读打开可写模式下如果VMware在宿主机上不支持文件系统日志容易把Ext4文件系统写坏。VirtualBox稍微麻烦一点它的VDI文件不能直接映射但可以转换成VMDK之后再映射VBoxManage clonehd source.vdi destination.vmdk --format VMDK还有一种通用方案用qemu-nbd在Linux宿主机上挂载各种格式的磁盘镜像对QCOW2和VDI、VMDK都有效sudo modprobe nbd max_part8 sudo qemu-nbd -c /dev/nbd0 /path/to/disk.qcow2 sudo fdisk -l /dev/nbd0挂载后分区设备是/dev/nbd0p1、/dev/nbd0p2直接用mount挂载对应分区即可。用完后记得sudo qemu-nbd -d /dev/nbd0断开连接否则镜像文件一直处于占用状态。4.2 用DiskGenius把虚拟机磁盘转成U盘或物理盘很多做系统维护的朋友喜欢用DiskGenius它在Windows下可以直接读取VMDK和VHD还支持把虚拟机磁盘文件转换成可以在物理机上启动的格式。热搜里diskgenius转虚拟机为u盘指的就是这类操作把虚拟磁盘的分区克隆到U盘或物理硬盘上。这个操作对密码恢复有什么意义举个实际场景一台Windows虚拟机完全无法进入修复模式你又不想用chntpw在Linux下操作可以把虚拟磁盘克隆到一个U盘然后用这个U盘在任意物理机上启动再利用Windows PE环境去修改SAM文件。虽然听着绕但在排查虚拟机启动蓝屏这类问题上特别管用。具体步骤并不复杂打开DiskGenius依次选择磁盘→打开虚拟磁盘文件加载VMDK后选中要克隆的分区执行克隆分区到目标U盘。克隆完成后把U盘接到正常的物理机或另一台虚拟机设置成从U盘启动。这时你面对的就是一个几乎和原系统一模一样的Windows环境可以自由使用PE工具或手动替换utilman.exe。需要特别提醒克隆分区时原虚拟机和目标盘的分区结构最好保持一致否则启动时会因为BCD文件里的盘点不符而蓝屏。DiskGenius通常会自动处理但保险起见克隆完成后先在虚拟机里测试一次再拿到物理机上折腾。4.3 LUKS和BitLocker先解开磁盘加密才是关键现在的Linux发行版安装时经常顺手就开LUKS全盘加密Windows 10/11的虚拟机也越来越多启用BitLocker。这种情况下前面所有直接挂载、直接修改密码文件的方案基本全部失效——你看到的都是密文。Linux LUKS的处理相对容易。在LiveCD环境或宿主机上先安装cryptsetup然后用sudo cryptsetup luksOpen /dev/sda2 my_vm_crypt输入原虚拟机的LUKS密码后会生成一个/dev/mapper/my_vm_crypt设备接下来再正常挂载这个解密后的设备就行。问题在于如果你连LUKS密码也忘了那就只能认栽这就是全盘加密的代价。这也是我不建议在虚拟机里做全盘加密、却把密钥文件放在宿主机明文目录里的原因——效果等于给门上挂了个小锁但钥匙就搁门垫底下。Windows BitLocker稍微复杂一点。BitLocker有两种钥匙恢复密钥48位数字串和TPM芯片验证。虚拟机的BitLocker通常不依赖TPM而是用虚拟机启动时的固定密钥所以需要你手里有恢复密钥。挂载VHDX/VMDK到Windows宿主机后如果分区显示为BitLocker加密可以尝试manage-bde -unlock E: -RecoveryPassword xxxxx-xxxxxx-...解锁成功后E盘才能被访问SAM文件才不是密文。如果你既忘了系统密码又找不到BitLocker恢复密钥那这个虚拟机基本没有常规恢复手段了这就是加密的意义。好消息是很多用虚拟机跑Windows的人实际上并没有启用BitLocker只是开了设备加密的假象此时SAM文件在挂载后仍然可以直接读取。5. 常见问题与排查技巧实录5.1 我踩过的坑和排查思路做虚拟机密码恢复这些年我积累了一些很实在的坑整理成表格方便你对照排查现象可能原因处理思路GRUB编辑后按CtrlX黑屏无反应内核实参没有加rw或root分区类型与initramfs不匹配重新编辑确认root参数指向正确分区加上rw后用rdbreak调试单用户模式下passwd报Authentication token manipulation error/etc/shadow所在文件系统只读挂载或SELinux阻止写操作检查挂载状态先执行mount -o remount,rw /再执行chmod 600 /etc/shadow重置密码后登录仍然被拒绝shadow文件字段被误改或账户被锁定shadow字段中有!查看shadow第二字段是否正常执行passwd -u解锁Windows替换utilman.exe后点击无反应系统启用了Windows Defender篡改保护或文件替换被权限拦截检查文件是否真的替换成功必要时偏移到PE环境操作chntpw清空密码后进系统卡死Windows正在做首次登录初始化等5-10分钟若仍无响应重启一次再试挂载VMDK时Windows提示磁盘无法识别VMDK是精简置备宿主机无法映射不连续块先尝试vmware-vdiskmanager -R修复或改用qemu-nbd方式挂载BitLocker加密导致SAM无法读取卷处于加密锁定状态未解锁先找恢复密钥用manage-bde解锁后再操作5.2 几条保命的运维习惯第一任何重置都先打快照然后确认快照能正常回滚。操作完成后快照不要急着删至少保留一个工作周期。虚拟机的快照不是摆设我见过太多人改完密码后发现系统里某个服务起不来想回滚却发现自己压根没打快照。第二密码管理要用工具不要靠脑子。对待虚拟机密码的遗忘问题最好的方案其实是让它永远不会发生。可以用KeePass或Bitwarden甚至就是一张加密的Excel表把每个虚拟机的IP、系统版本、账号、密码、最后修改时间记录下来。我自己的习惯是每台虚拟机交付前都在备注里写清初始密码/重置日期并同步到团队共享的Wiki里。第三能进系统就配置SSH密钥或Windows远程桌面。如果虚拟机是Linux启用PermitRootLogin prohibit-password把公钥放进去如果是Windows打开远程桌面并添加一个仅用于管理的本地账户并把密码记录下来放到安全的地方。这样即使忘了密码也可能通过密钥或另一个管理入口绕过登录界面进行重置不需要每次都去动磁盘文件。第四区分重置密码和恢复数据两个目标。有时候你其实只需要拿到里面的数据不需要进系统。这时候千万别急着改密码先考虑直接挂载磁盘拷贝文件。改密码有一个隐藏风险某些应用会把密码哈希放在配置文件里比如MySQL的user表、或者Web应用的DB连接串重置系统密码虽然不影响这些数据但会误导你以为是所有密码都变了从而在排查问题时绕远路。最后再分享一点经验讲完这些方法我最大的体会是虚拟机密码恢复这件事技术本身并不难真正难的是判断场景、控制风险和养成习惯。永远先确认这台机器归属权在你手里永远先做快照永远别在把密码写到团队文档之外的地方。真到需要重置的那一刻你反而会庆幸自己当初留着后手——比如一个SSH公钥、一条BitLocker恢复密钥、或者虚拟机旁边那个不起眼的备份文件。这些看似琐碎的准备工作才是让密码破解从应急救火变成常规操作的关键。
返回列表