背景说明

最近从离职的同事那里接手了一台基于 VMware vSphere 的虚拟机。这台机器一直运行得好好的,直到前几天园区电力故障。电力恢复供应后,却发现该虚拟机上的服务挂掉了。于是开始了问题排查之旅。

排查问题

排除硬件问题

从机房机柜的刀片服务器的指示灯来看,硬盘、主板、网络等指示灯均正常,没有异常的闪烁或红光。

开启实例

登录 VMware ESXi(Elastic Sky X integrated),发现该实例处于 PowerOff 的状态,看来是没有设置自启动的策略。

auto_start.jpg
图 1: 配置虚拟机自启动

排查服务

实例启动后,本地端尝试访问服务,发现服务仍然不可达(inaccessible),报错连接超时(timeout)。由此大概猜想有三种可能:

  1. 服务没有配置自启动
  2. 服务配置自启动时,设置触发的条件为仅当管理员用户登录后触发
  3. 服务配置了自启动,但是启动时因异常失败了

IP 倒是可以 Ping 通,那就可以带着疑问连上服务器去一探究竟。推荐使用 VMRC (VMware Remote Console) ,相比 Web Console,优点如下:

  • 使用硬件加速图形界面
  • 快速查看硬件设备的状态(参见图 3 的工具栏):
    • 💿 存储 HDD/SSD,CD/DVD 等
    • 📶 网络
    • 📷 摄像头
    • 🔊 音频输出
  • 键盘操作不会和浏览器的自身快捷键冲突
  • 而且鼠键操作都会绑定 / 重定向到虚拟机中,可通过按 Ctrl + Alt 来解除绑定,这和 VMware 单体桌面版的交互是一致的

VMware Remote Console

Use VMware Remote Console (VMRC) to connect to client devices and access advanced keyboard features.
If you already have VMware Remote Console installed, it will start automatically when you click the Launch Remote Console button. If not, you can use the link below to download it.
下载链接:Download Remote Console

连接服务器

open_vmware_remote_console.jpg
图 2: 打开远程终端

使用上一节提到的 VMRC 连接到服务器后,戏剧性的一幕发生了,离职的同事只把虚拟机平台的帐号写在文档中,而虚拟机中的系统帐号则未提供。在不联系已离职的同事的前提下,需要重置虚拟机中 window server 系统的密码。

login_screen.jpg
图 3: 登录界面


重置密码的思路

从图 3 的 UI 来看,一种可行的植入方法是替换界面上的组件对应的程序,比如替换左下角原用于无障碍使用功能的轮椅图标,在 Window Server 中该功能对应的可执行文件为 Utilman.exe,即用户在前端点击该图标时,会唤起系统的 C:\Windows\System32\Utilman.exe。那么在系统盘未开启 BitLocker 等磁盘加密方式的情况下,我们可依照下述步骤进行重置密码:

  1. 在启动时先加载安装镜像(启动盘)ISO
  2. 使用 cmd.exe 替换原来系统中的 utilman.exe
  3. 退出启动盘
  4. 再加载原系统
  5. 利用 cmd 伪装的 utilman 来修改用户密码

utilman_context_menu.jpg
图 4: 无障碍功能菜单

准备启动镜像

加载系统镜像

为了加载安装镜像,我们需要设置启动时先进入 BIOS,并在 BIOS 中修改启动时读取设备引导区的顺序,比如优先让 BIOS 读取虚拟机的 CD,其中 CD 挂载安装镜像。

进入 VMware vCenter,找到对应的虚拟机,点击 Edit Settings.. 按钮,在弹出的设置中,选择 Virtual Hardware 虚拟硬件选项卡,分别配置下列项目:

  1. 选择加载 VMware Datastore 数据仓中的系统镜像(*.ISO 格式)。最好是同属一个系列的系统镜像,以确保兼容性
  2. 确实启动时该虚拟设备会被连接 Connect at Power on

load_iso_into_cd_drive.jpg
图 5: 加载系统镜像

强制进入 BIOS

和上一小节中一样,先进入虚拟机的设置界面,选择 VM Options 选项卡,找到 Boot Options 启动配置,勾选强制进入 BIOS,如图 6 所示。

force_bios_setup.jpg
图 6: 下次启动时强制进入 BIOS

请三思而后行

特别注意

先简要介绍一下从 Windows 8 系统开始支持的 Fast Startup / Fast Boot 快速启动特性:在开启后,关机时就会把用户登录(Log In)前就已加载完毕的 Windows Kernel 系统内核的内存内容借助休眠 Hibernate 技术将它们写入到硬盘中,整个过程如下图所示。也就是说每次开机,开机硬件自检没问题后,接着从上次的保存点(保留了 Core System 核心系统)开始读取(对应 Hibernate Read),一路启动到 Windows 登录界面(对应 Explorer Ready),跳过了原来的系统初始化(OS Init),去掉了重复操作,节省了大量时间,以此达到快速启动的目的。

cold_boot_vs_fast_startup.jpg
图 7: 冷启动与快速启动

既然每次点击关机都不会进行彻底地关机,那么此时去改变系统文件是不安全的,磁盘的系统文件和休眠所保存的系统文件可能不一致。千万不要铤而走险,贸然入侵一个仅仅被用户简单『关机』的 Windows 系统,否则在下次开机时,两处的文件内容不匹配,将会导致难以预见的系统错误。因为它可能处于半休眠状态,你在离线状态下进行的任何文件 / 注册表修改都可能导致文件损坏。

休眠(Hibernate)与睡眠(Sleep)不同,休眠时所有设备都不再工作,功耗更低。由于休眠前的 Memory 的资料被保存在 Disk 中,在当系统收到唤醒信号后,首先从 Disk 中恢复 Memory。

因此,在进行后续的操作前,先使系统彻底关机,确保我们得到一个干净的文件系统,再进入启动盘。办法有三种:

  • 图形化界面:
    • 点击 Restart(重启),重启不会用快速启动
    • SHIFT + Shutdown(关机),再进入启动盘
  • 打开命令行终端,输入 shutdown /s /f /t 0

另外,一定要确保 Windows 不在更新过程中。如果你打断了它,这可能会破坏 Windows!轻则蓝屏报错,重就无法开机。笔者建议尝试重新启动 Windows 几次,直到你看不到任何『更新中』的提示信息,再继续下一步。

想要彻底关闭 Fast Startup 特性,可以参考这篇文章 How to disable Windows 10 fast startup

调整启动顺序

重启虚拟机实例,进入 BIOS,切换至 Boot 选项卡,按 -/+ 来调低或提高选中设备的启动优先级,如下图所示,我们将 CD 光盘驱动器设置为最先启动。

adjust_boot_priority.jpg
图 8: 调整设备的启动优先级

接着按 F10 继续启动,系统将加载 CD 中启动镜像,按照系统提示按任意键继续。

boot_from_cd.jpg
图 9: 按任意键从 CD 加载启动镜像

进入启动镜像

当 Windows 安装程序准备完毕,选择你熟悉的语言、区域设置后,点击下一步

load_iso.jpg
图 10: Windows 安装程序

修复计算机

选择修复计算机(Repair your computer) 。

repair_computer.jpg
图 11: 修复计算机

接着点击疑难解答(Troubleshoot)。

trouble_shoot.jpg
图 12: 疑难解答选项

在之后弹出的高级选项(Advanced options)新界面中, 选择命令提示符(Command Prompt)选项。

advanced_options_cmd.jpg
图 13: 高级选项

临时命令行模式

进入命令行窗口后,此时我们要先判断哪个磁盘盘符(分区)是我们原来使用的 Window Server 的系统盘。

cd /d C:\
dir
cd windows\system32

输入 cd /d C: 来切换不同盘符,并使用 dir 命令检视该盘符下的目录和文件,据此判断是否为系统盘。一般来说,系统盘根目录下会有 WindowsUsers 的目录,如下图所示:

locate_system_disk.jpg
图 14: 定位系统盘

注意: 从 CD 光盘加载的系统镜像是被放在 X:\ 盘。

植入漏洞

通过替换 utilman.execmd.exe,完成漏洞的植入:

REM 备份原来的 Utilman
ren Utilman.exe Utilman.exe.bak
REM 植入漏洞
copy cmd.exe Utilman.exe
REM 退出命令行
exit

logout_cmd_exe.jpg
图 15: 植入漏洞

完成植入后,输入 exit 或点击关闭按钮退出命令行终端。再点击继续(Continue)原系统的启动,即待重置密码的系统。

continue_bootstrap.jpg
图 16: 继续启动 Window Server


重置密码

login_screen.jpg
图 17: 登录界面

当出现欢迎界面,按 Windows(徽标键) + U,或点击左下角的轮椅图标(无障碍功能)。唤出 cmd,即内核态以管理员身份运行 cmd(就是我们之前掉包的 utilman.exe)。

cmd_hook.jpg
图 18: 植入的 cmd

更换管理员的密码

change_admin_password.jpg
图 19: 重设管理员密码

出现命令行终端后,输入命令:

net user administrator <new_password>
exit

退出命令行,此时便能够使用你刚设的密码登录了。

测试新密码

use_new_password.jpg
图 20: 输入新密码

移除漏洞

顺利登录后,打开 Power Shell 或 CMD,将掉包的 exe 删除,把备份的 Utilman.exe.bak 还原。

cd C:\Windows\System32\
del .\Utilman.exe
copy .\Utilman.exe.bak .\Utilman.exe
del .\Utilman.exe.bak

recover_utilman.jpg
图 21: 恢复无障碍功能

注意:别忘了退出登录或锁屏,去登录界面,点击一下左下角的轮椅图标,确认无障碍功能已恢复。

修复问题

一路过关斩将,以管理员登录系统后,发现服务在启动时报错,开始着手修复服务问题,由于涉及公司业务,此处不再展开。


总结

与常规的桌面端虚拟相比,VMware vSphere 作为一个云计算平台,提供了包括云存储、云算力、云路由等虚拟组件。于是我们需要了解抽象后随之而来的更多概念,才能用好 vCenter 这一一站式虚拟资源配置管理器。

对于忘记密码需要重置密码这件小需求,我们不需要烧录 ISO 镜像到 U 盘中去制作启动盘,只需要把 ISO 镜像放在 VMware 的云存储中,再将存储路径关联到虚拟机实例即可;我们也不需要去记忆各个电脑品牌的键位各异的 BIOS 进入方法和 BIOS 设置界面。最后,我们加载启动镜像,利用无障碍使用功能图标完成漏洞的植入和利用,成功重设管理员密码。

值得一提的是,笔者还穿插介绍了下关于 Window 8 开始默认开启的 Fast Startup 特性,详细解释了该特性为何限制了我们的离线磁盘操作,以及如何去规避或禁用该特性。


总之,VMware 把所有的资源,包括软、硬件和交互,全都模拟 / 虚拟了,将我们从硬件的细节中解放出来了,让我们的生产力可以聚焦在业务上🚀。


参考链接

  1. VMware vSphere 介绍
  2. VMware vSphere 两大核心组件:ESXi, vCenter Server
  3. Windows Recovery CMD | Microsoft Q&A
  4. Windows 快速启动背后的功臣:休眠 | Zhihu
  5. Windows 10 Does Not Shutdown Completely | Dell US
  6. Distinguishing Fast Startup from Wake-from-Hibernation | MSDN

添加新评论