• tzhtdx

    作者: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 未来方向

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

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

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

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


    7. 结论

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

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

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

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

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

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

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

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

    所有工具以 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 脚本实现,零外部依赖。

    主楼
  • sakuraL

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

    #1
  • 柏川

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

    #2

发表回复

登录后回复