ESXi 勒索软件运行时取证与防御体系构建:基于三起真实事件的实战分析

tzhtdx 2026-10-10 14:00 1


作者:tzhtdx(应急响应工程师)

适用:安全研究员 / IR 工程师 / 虚拟化安全运维

ESXi 版本:6.7.0 (15160138) / 7.0.3 (18644231) / 8.0.3 (24677879) 三版本实机验证

关键词:ESXi 勒索 / 运行时取证 / vsish / ExecInstalledOnly / lsof / 版本差异





摘要



  • 三起 ESXi 勒索事件攻击链高度一致:Horizon 漏洞 → 域横向 → vpxuser SSH → 投递加密器 → 破坏虚拟化存储

  • ESXi 无 Linux 式 /proc,传统进程取证方法全部失效

  • 通过 lsof -p <cartel> 可获取已删除二进制的内存映射路径与大小(VMkernel 级取证)

  • ExecInstalledOnly 在 8.x 上默认拦投递 ELF(Operation not permitted),在 6.7/7.0.3 上默认放行

  • 构建了五层监控守护,在三个版本上端到端验证通过(含加密行为检测与进程内存取证)

  • 附完整版本兼容性矩阵、防御自查清单与 IOC 列表




1. 背景


2025 年以来,针对 VMware ESXi 的勒索软件攻击持续升级。ESXiArgs、Cheerscrypt、Black Basta 等组织均以 ESXi 为主要目标。近期我们处置的三起事件(制造/科技/汽车行业)呈现高度一致的攻击链——攻击者通过未修复的 VMware Horizon 漏洞获取内部网络初始访问,随后利用被盗的 vpxuser 凭据通过SSH 批量登录 ESXi,投递 ELF 加密器对虚拟化存储进行加密。


与 Linux 服务器不同,ESXi 的取证面临独特挑战:


┌───────────────────────────┬─────────────────────────────────────────────┐
│ Linux Server │ ESXi (VMkernel) │
├───────────────────────────┼─────────────────────────────────────────────┤
│ /proc/<pid>/exe │ [X] no /proc (directory is empty) │
│ /proc/<pid>/maps │ [X] none │
│ /proc/<pid>/mem │ [X] none │
│ ptrace(PTRACE_ATTACH) │ [X] disabled at kernel level │
│ gcore <pid> │ [X] command not available │
│ lsof │ [!] present, but format/paths differ │
│ strace │ [!] present, but unusable (ptrace disabled) │
│ busybox │ [OK] /usr/lib/vmware/busybox/bin/ │
└───────────────────────────┴─────────────────────────────────────────────┘

ESXi 的 VMkernel 是闭源微内核,不是 Linux。 上述差异意味着传统 Linux IR 方法论在 ESXi 上全部失效,需要重新构建取证方法论。




2. 攻击链取证分析


2.1 完整攻击链


Phase 0: 初始访问
利用未修复的 VMware Horizon 漏洞获取内部网络访问
(Horizon 连接服务器 / UAG / Workspace ONE,未更新至最新版本)
│
Phase 1: 域内横向
vdiadmin → WinRM/PowerShell → 3,716 条 4648 事件 → 1,184 个目标
PowerShell + C# 注入禁用 ETW (ntdll!EtwEventWrite)
落地 kvcore.sys (BYOVD, 江民驱动) → kill AV/EDR
│
Phase 2: 清痕
Security 1102 + System 104 → 双清日志
│
Phase 3: ESXi 批量登录
vpxuser 凭据 → SSH → 多台 ESXi
部分案件:govmomi/0.47.0 经 hostd API 启动 SSH
│
Phase 4: 载荷投递与执行
scp -t /var/log/ → e_esxi(ELF) + exec.sh(sh)
chmod 777 → rm e_esxi(自删) → nohup exec.sh &
esxcli ... ExecInstalledOnly → 0 (8.x 前置)
│
Phase 5: 加密 + 勒索
遍历 .vmdk/.vmx/.nvram/.vswp/.vmsn → 加密 → 改随机后缀
落勒索信 → vSAN 对象删除 → VM 批量关机

2.2 载荷技术分析(静态逆向摘要)


以 e_esxi 样本为例(ELF 64-bit LSB,静态链接,~78KB):








































特征 分析结果
加密方案 X25519 ECDH + SHA-512 KDF + 自定义 S-box 流密码
Nonce/Counter 固定为 0(潜在弱点:密钥流可能重复)
部分加密 前 384MB 始终加密;≥768MB 时另加密中段 384MB
文件尾 追加 32 字节临时公钥(供攻击者解密)
目录遍历 opendir/readdir,按扩展名过滤(13 种虚拟化文件类型)
自毁 执行后立即删除自身二进制
C2 Tor 网络聊天 + prnt.sc 截图外传


无第三方解密途径——除非攻击者私钥泄露或被执法查获。



2.3 攻击者对 ESXi 版本的选择逻辑


三案中攻击者统一执行:


esxcli system settings advanced set -o /User/execInstalledOnly -i 0

但该命令的实际效果因版本而异(实测确认):
































ESXi 版本 命令结果 原因 攻击影响
6.7 “选项不存在” ExecInstalledOnly 为 VMKernel 设置 无影响,默认已允许执行
7.0.3 “选项不存在” 同上 无影响
8.0.3 rc=0,成功关闭 高级设置 /User/ExecInstalledOnly 关闭后投递的 ELF 才能执行

结论:8.x 上 ExecInstalledOnly 默认=1,是阻止投递 ELF 执行的关键防线。

攻击者必须先关闭它——而这一操作可通过 shell.log 检测。




3. ESXi 运行时取证:能力与限制


3.1 进程信息获取


ESXi 无 Linux 式 /proc,进程信息获取路径完全不同:











































Linux 方法 ESXi 等价 说明
/proc/<pid>/cmdline ps -c 第 4 列 完整命令行
/proc/<pid>/exe lsof -p <cartel> MMAP 条目 文件删除后仍显示路径/大小
/proc/<pid>/maps lsof -p <cartel> 或 vsish -e ls .../mem/mmaps/ 内存映射区域
/proc/<pid>/fd/ vsish -e ls .../fd/fds/ 打开文件列表
gcore <pid> ^-^ 无 无法直接 gcore
kill -ABRT → core ^-^ 需通过 vsish 开启(详见 §4) 可行但有条件

3.2 lsof 取证——文件删除后仍可见


ESXi 自带的 lsof 读取 vmkernel 内部数据,即使可执行文件已被 rm,

仍能看到 MMAP 映射的路径与大小:


$ lsof -p <cartel_id>
Cartel | World name | Type | fd | Description
--------+------------+------+----+-------------
2105626 | sleep | MMAP | -1 | /var/log/sleep (prot:R-/len:604124)
2105626 | sleep | MMAP | -1 | /var/log/sleep (prot:-W/len:8844)


取证价值:确认可疑进程执行了哪个文件(即使文件已删除),

以及该文件的映射大小(可推断原始二进制大小)。

局限:无法从 MMAP 条目中恢复文件内容字节。



3.3 vsish 内核调试接口


vsish(VMkernel System Information Shell)是 VMware 内核调试工具,

暴露了 VMkernel 内部状态。关键路径:


/userworld/cartel/<id>/
├── cmdline → 进程命令行
├── fd/fds/<fd>/ → 文件描述符详情(路径/类型/标志/偏移)
├── mem/mmaps/ → 内存映射区域列表
├── signal/handlers/ → 信号处理函数
├── signal/injectsignal → 向进程注入信号
├── stats/ → syscall/IO/socket 统计
├── thread/ → 线程列表
└── debug/
├── coreDumpEnabled → core dump 开关(默认 0)
├── dumpOnKernelPanic → panic 时 dump
└── livecore → live core dump 触发器


^-^ 负责任披露声明:本文仅讨论 vsish 的取证分析用途。

其内核状态修改能力(如 signal/injectsignal、killswitches)

涉及 VMkernel 安全边界,不在本文讨论范围内。





4. 五层监控防御体系设计


4.1 设计原则


传统检测 = 规则匹配("这个进程名/路径像不像坏人")→ 可被绕过
我们的检测 = 行为/内容异常("这个文件/进程在做什么异常的事")→ 更难绕过

4.2 五层架构










































































层 检测内容 数据源 告警前缀
L1 进程 ps -c 命令行匹配(含解释器/落地区/已知 IoC) ps -c SUSP_PROC
lsof 取 MMAP 映射与打开文件 lsof -p <cartel> ENC_TARGET
L2 命令 shell.log 增量匹配(投递/赋权/关防护/已知 IoC) shell.log SHELLLOG
命中后立即扫盘抓文件(反应式抓取) — REACT_CAPTURE
L3 落盘 投放物/勒索信文件匹配 + 哈希存证 find 目录轮询 FILE_DROP
L3b 行为 .vmdk/.vmx 数量做差(加密风暴) find /vmfs/volumes ENC_SPIKE
L4 加密 VM 文件明文标记消失(.vmx 纯文本变密文) 文件内容检查 ENC_SUSPECT_TXT
VM 文件熵异常(>200 distinct bytes/4KB) od + awk ENC_SUSPECT_DESC
VM 文件被加未知后缀(≥6 位) find 文件名匹配 ENC_RENAMED
主动响应 高置信进程取证后 kill(默认关闭) kill -9 KILLED

4.3 L4 加密角度检测详解


这是与规则检测的本质区别:不关心"谁在做",只关心"VM 文件是否被加密"。


明文标记消失(方案 A)


.vmx 文件是纯文本(config.version / displayName / virtualHW.version)。

勒索软件从 offset 0 开始覆盖(样本行为),覆盖后明文标记消失。


grep -qaE 'config.version|displayName|virtualHW' "$vmx_file" || alert

熵异常检测(方案 B,覆盖"保留文件头"变种)


即使勒索软件保留文件头只加密数据段,前 4KB 的不同字节值个数也会从 <120 飙升到 >240。


distinct=$(od -An -tu1 -N4096 -v "$file" | \
awk '{for(i=1;i<=NF;i++)a[$i]=1} END{print length(a)}')
[ "$distinct" -ge 200 ] && alert


为什么这比规则匹配更强:无论加密器叫什么名字、用什么语言写、从哪个偏移开始加密,

只要将纯文本变为密文就会被检测。这是与算法无关的行为检测。



改名检测(方案 C)


find /vmfs/volumes -type f \
\( -name '*.vmdk.??????*' -o -name '*.vmx.??????*' \) \
| grep -v '\.lck$' | while read -r f; do alert; done

4.4 告警级别











































级别 告警 说明
P0 ENC_SUSPECT_* / ENC_RENAMED VM 文件正在被加密
P0 SUSP_PROC / ENC_TARGET 可疑进程运行中
P0 ExecInstalledOnly 被置 0 防护被关闭
P0 vpxuser SSH 登录 非正常账号登录
P1 FILE_DROP / REACT_CAPTURE 投放物落盘(已存证)
P1 SHELLLOG 可疑命令



5. 三版本实测评估


5.1 测试环境
































主机 ESXi 版本 Build 架构
esxi6.7 6.7.0 15160138 双网卡(vmk0=192.168.100.x, vmk1=10.21.21.x)
esxi7 7.0.3 18644231 双网卡
esxi8 8.0.3 24677879 单网卡

5.2 版本差异矩阵(关键差异)








































































































差异项 6.7 7.0.3 8.0.3
/proc ^-^ 空 ^-^ 空 ^-^ 空
execInstalledOnly 位置 VMKernel VMKernel 高级设置(默认=1)
ExecInstalledOnly 对投递 ELF 允许执行 允许执行 拦截(Operation not permitted)
审计命名空间 auditrecords auditrecords auditrecords
审计 local set 可用 静默失败 可用
审计 livecore 未验证 静默失败 可用
kill -ABRT → core dump
vmkdump_extract 可用 有 有 有
viewAudit / auditLogReader auditLogReader viewAudit viewAudit
tr 命令
shell.log 有 初装可能无 有
python 3.5 3.8 3.11
lsof
VMFS noexec
local.sh 尾部 exit 0 是 是 是

5.3 端到端检测验证(良性 demo 载荷)


在每台 ESXi 上投递良性 demo 载荷(busybox 假扮 e_esxi + exec.sh 投递脚本),

验证 guard 的检测覆盖率:


















































检测层 esxi6.7 esxi7 esxi8
L1 SUSP_PROC(exec.sh 进程)
L1 SUSP_PROC(e_esxi 进程)
L1 ENC_TARGET(打开 .vmdk)
L2 SHELLLOG(可疑命令)
L3 FILE_DROP(载荷落盘存证)
证据 ELF core(vmkdump_extract) ^-^ 16.8MB ^-^ 16.8MB ^-^ 9.2MB

三台 100% 检出,无漏报。




6. 讨论


6.1 已知限制

































限制 说明 缓解措施
无法实时读进程内存 ESXi 无 /proc,ptrace 禁用 轮询间隔最小化 + 文件在盘时立即抓取
轮询盲区 进程存活 < INTERVAL 则可能漏检 降频有 CPU 代价,需平衡
加密算法无关性不完美 极慢速、保留结构的变体可能滞后 L4 熵/标记检测已覆盖大多数场景
7.0.3 livecore 静默失败 VMware 内部行为 用 kill -ABRT 替代

6.2 攻击者可能的绕过
































绕过手段 我们的对策
Python 脚本替代 ELF(绕 ExecInstalledOnly) L1 仍能检测 python + /tmp/ 组合
自定义加密不覆盖文件头 L4 熵检测覆盖
减慢加密速度(低频、小批量) 增加 INTERVAL 灵敏度 + 收集端阈值告警
使用 ExecInstalledOnly=0 后再执行 L2 命令层 P0 告警此操作
禁用 syslog 外发 心跳看护:主机静默即告警

6.3 未来方向



  1. 进程基线差分:首次采集正常进程集合 → 之后新进程即告警(与名称/路径无关)

  2. pktcap-uw 网络层检测:捕获加密器与 C2 的通信

  3. VM-Internal 检测:在 VM 内部部署 agent(可检测加密 I/O 到 vmdk 的写入模式)

  4. vsish 路径自动化:利用 vsish -e 脚本化实现更深层内核状态检查




7. 结论


本文基于三起真实 ESXi 勒索事件和三个 ESXi 版本的实机验证,提出了一个五层运行时监控防御体系,核心贡献包括:



  1. 系统性梳理了 ESXi 与 Linux 在进程取证方面的差异(无 /proc、ptrace 禁用、

    VMFS noexec),并找到了等价替代方案(ps -c + lsof + vsish)

  2. 首次公开了 lsof -p <cartel> 的取证应用——文件删除后仍可获取

    可执行文件的路径与大小(Linux 上需依赖 /proc/<pid>/exe)

  3. 构建了五层检测架构,从规则匹配到行为/内容异常检测,在三个 ESXi 版本上

    实现了 100% 的良性 demo 检出率

  4. 产出了完整的版本兼容性矩阵,为跨版本部署提供了实证基础


所有工具以 shell 脚本实现,零外部依赖,可在三台 ESXi 版本上直接部署使用。




附录 A:防御自查清单


# ===== 在 ESXi Shell (root) 执行 =====

# ── 入口 ──
grep -q enabled /etc/ssh/sshd_config && echo "⚠ SSH 开着"
esxcli system settings advanced list -o /User/ExecInstalledOnly 2>/dev/null
esxcli system settings kernel list -o execInstalledOnly 2>/dev/null

# ── 可疑进程 ──
ps -c | grep -Ei 'e_esxi|exec\.sh|/var/log/|/tmp/'

# ── 可疑命令 ──
grep -Ei 'scp -t|nohup|chmod 777|ExecInstalledOnly|e_esxi' /var/log/shell.log

# ── 异常登录 ──
grep 'vpxuser' /var/log/auth.log

# ── VM 文件异常 ──
find /vmfs/volumes -name '*.vmdk.*' -o -name '*.vmx.*' 2>/dev/null | head

# ── 日志外发 ──
esxcli system syslog config get | grep -i 'Remote Host'

附录 B:IOC 清单
















































类型 IoC 备注
文件 e_esxi, exec.sh, enc_wip* 三案通用载荷命名
文件 *.Q1ZVE0rRT, *.vLwoQ0baL, .__NoNoNoYYY 加密后缀
文件 How To Restore Your Files.txt, !!!!!_INSTRUCTION_!!!!!.txt 勒索信
命令 esxcli ... ExecInstalledOnly ... -i 0 关闭执行限制
命令 scp -t /var/log/ 投递路径
进程 cmdline 含 /var/log/e_esxi -u 运行中的加密器
网络 govmomi/0.47.0 (User-Agent) 入口工具



本文基于三起真实事件取证 + 三个 ESXi 版本实机验证。

所有检测工具以 shell 脚本实现,零外部依赖。

最新回复 (2)
  • sakuraL 10-24 19:36
    1楼

    esxi 好贵,有点用不起正版了,找不到新补丁的话,得换别的了

  • 柏川 10-24 19:53
    2楼

    2023年上家公司中的就是这个esxi勒索病毒 公司直接通过初始备份重建系统,没有付赎金

* 帖子来源Linux.do
返回