SunayMutlu/jsceal-incident-response

GitHub: SunayMutlu/jsceal-incident-response

一份基于真实感染的 PowerShell 木马事件响应案例研究,完整记录了从 Sysmon 遥测检测、调查分析到最终修复的 IR 全流程。

Stars: 0 | Forks: 0

# 事件响应案例研究:JSCeal PowerShell 木马检测与修复 **作者:** Sunay **角色定位:** SOC Analyst (L1) **日期:** 2026 年 6 月 **环境:** Windows 11 主机(个人实验室) ## ⚠️ 免责声明 这项调查是在我自己的个人设备上、于受控的学习环境中进行的。所有特定于主机的标识符(主机名、账户名、本地 IP 范围、恢复密钥)均已作脱敏或泛化处理。本仓库不分发任何恶意软件样本、payload URL 或有效的 IOC。其目标是展示**事件响应方法论**,而不是分享恶意制品。 ## 执行摘要 在对一台 Windows 11 工作站的 Sysmon 遥测数据进行例行审查时,我发现源自 `System32` 下一个可疑目录的异常进程行为。调查显示,存在一个活跃的基于 PowerShell 的木马(`Trojan:PowerShell/JSCeal`),该木马已驻留在主机上大约一个月。该恶意软件以 `SYSTEM` 权限运行 Node.js runtime,维护了 180 多个到单个 endpoint 的并发出站 TLS 连接(滥用合法 CDN 作为中继),通过添加排除项禁用了 Microsoft Defender,并使用看门狗机制来存活于手动终止进程的操作。 由于看门狗和文件被锁定,手动修复尝试失败。最终通过**从云端全面重装 Windows 并彻底擦除驱动器**完成了主机的修复,从而彻底消除了威胁。 **关键结论:** 确认该恶意软件家族使用多进程持久化机制;仅终止单个进程是不够的,重置镜像才是可靠的修复途径。 ## 环境 | 组件 | 详情 | |---|---| | 受影响的主机 | Windows 11 笔记本电脑(主要工作站) | | 遥测数据 | Sysmon + Microsoft Defender | | 调查工具 | PowerShell, `netstat`, Defender CLI (`Get-MpThreat`) | | 修复 | Windows“重置此电脑” → 云端下载 + 全面清理驱动器 | ## 调查时间线 | 阶段 | 操作 | |---|---| | **检测** | 在审查 Sysmon 日志时注意到一个陌生的进程/路径 | | **分类** | 将该进程与 Defender 威胁历史记录进行交叉比对 | | **确认** | `Get-MpThreat` 返回 `Trojan:PowerShell/JSCeal` | | **范围界定** | 找到暂存目录并枚举其内容 | | **网络分析** | 将出站连接映射到所属进程 | | **持久化分析** | 识别出计划任务启动 + 看门狗重生行为 | | **尝试遏制** | 手动终止进程(失败 — 看门狗将其重生) | | **修复** | 从云端全面重装并彻底擦除驱动器 | | **验证** | 重装后的扫描确认状态干净 | ## 检测 初始信号来自**端点日志记录**,而不是弹出的杀毒软件警报——这正是 L1 分析师应该捕获的微弱信号。一个进程正从 `System32` 内一个随机命名的目录中执行,匹配如下模式: ``` C:\Windows\System32\-\ ``` 该目录名伪装成一个听起来合法的供应商/更新任务,以便融入 `System32` 中。这种命名选择是一种经典的**伪装**技术(参见下文的 MITRE 映射)。 ## 调查与分析 ### 1. 威胁确认 Microsoft Defender 的威胁历史记录确认了该检测结果: ``` Get-MpThreat # → Trojan:PowerShell/JSCeal ``` ### 2. 暂存目录内容 该目录包含一个捆绑的 **Node.js runtime** 和支持文件: - `node.exe` — 合法的 Node 二进制文件,用于执行恶意 JS - `app.js` — 庞大(约 5 MB)的应用程序脚本 - `preload.js` — 高度混淆的加载器(env-key 解密 + `vm` 模块执行) - 多个编译过的 `.node` 原生模块 - 一个正在被积极写入的 `db\` LevelDB 文件夹(数据暂存/收集) - 捆绑的归档文件和支持工具 使用真实的、已签名的 Node.js 二进制文件来运行恶意 JavaScript,这是一种**就地取材/自带解释器**的方法,有助于逃避基于签名的检测。 ### 3. Defender 规避 恶意软件的启动例程添加了 Defender 排除项以致盲 AV: ``` Add-MpPreference -ExclusionPath Add-MpPreference -ExclusionProcess ``` 随后,它在运行时通过 `iwr | iex`(Invoke-WebRequest 管道传输至 Invoke-Expression)从远程主机拉取了额外的代码——这是分阶段 PowerShell 加载器的典型特征。*(本报告中特意省略了 payload URL。)* ### 4. 网络行为 将连接映射到所属进程显示了一个惊人的模式——**180 多个到端口 443 上单个 IP 的同时出站连接**,且全部由 `node` 进程拥有: ``` Get-NetTCPConnection -RemoteAddress | Select LocalPort, RemotePort, OwningProcess, @{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).Name}} # → 约180行,所有 RemotePort 为 443,所有 Process 为 "node" ``` 目标解析为一个**合法的 CDN**,被滥用作中继/命令与控制通道。没有哪个合法的桌面应用程序会向一台主机打开约 180 个并发 socket——这种规模的持久连接是数据外泄/C2 活动最强的行为指标。 ### 5. 持久化与看门狗 - **启动:** 计划任务启动了 PowerShell 加载器,进而生成 `node.exe`。 - **进程树:** `svchost → powershell → node`。 - **看门狗:** 终止 `node` 进程暂时取得了成功,但另一个进程立即将其重生,且暂存文件保持锁定状态(`The process cannot access the file ... because it is being used by another process`)。 这证实了**多进程自愈持久化机制**——这也是手动清理无法奏效的原因。 ## 攻陷指标 (IOC 类别) | 类型 | 指标(已泛化) | |---|---| | 文件路径 | `System32` 下伪装成更新任务的随机命名目录 | | 进程 | 从非标准路径以 `SYSTEM` 权限运行的 `node.exe` | | 进程树 | `svchost → powershell → node` | | 网络 | 到单个主机的大量并发 `:443` 连接(滥用 CDN) | | Defender 篡改 | 意外的 `Add-MpPreference -ExclusionPath/-ExclusionProcess` 条目 | | 执行 | 计划任务操作中的 `iwr ... | iex` 远程代码获取 | | 持久化 | 启动 PowerShell 加载器的计划任务 | | 数据暂存 | 暂存文件夹内活跃的 LevelDB (`db\`) 目录 | ## MITRE ATT&CK 映射 | 战术 | 技术 | ID | |---|---|---| | 执行 | 命令和脚本解释器: PowerShell | T1059.001 | | 防御规避 | 伪装: 匹配合法名称或位置 | T1036.005 | | 防御规避 | 损害防御: 禁用或修改工具 | T1562.001 | | 防御规避 | 系统二进制代理进程 / 滥用受信任的二进制文件 | T1218 | | 持久化 | 计划任务/作业 | T1053.005 | | 命令与控制 | 应用层协议: Web (HTTPS) | T1071.001 | | 命令与控制 | 代理 / CDN 中继 | T1090 | | 收集 / 外泄 | 外泄前的本地数据暂存 | T1074 / T1041 | ## 遏制与修复 ### 无效的操作 - **手动终止进程** —— 看门狗重新生成了 `node.exe` 且文件保持锁定。 - **直接删除文件夹** —— 因共享/权限冲突而失败,因为文件正在 `SYSTEM` 下被积极使用。 ### 有效的操作 带有彻底擦除的完整操作系统重装: 1. **重置此电脑 → 删除所有内容** 2. **云端下载**(从 Microsoft 获取全新镜像,而不是本地恢复分区,因为后者本身可能已被污染) 3. **彻底清理驱动器**(覆盖数据,而非快速格式化) 重装系统后,Defender 扫描返回了干净的结果,暂存目录也随之消失。 ### 为什么特别选择“云端下载” + “彻底清理” - **云端下载** 避免了重复使用可能已受损的本地恢复镜像。 - **彻底清理驱动器** 移除了可恢复的残留物,而不是仅仅取消文件的链接。 ## 经验教训 1. **端点遥测胜过等待 AV 弹窗。** 感染是通过日志审查发现的,而不是警报。L1 的价值在于发现微弱的信号。 2. **连接*数量*是一种行为 IOC。** 无论目标信誉如何,到单个主机的约 180 个并发 socket 都是异常的。CDN 可能会被滥用作中继。 3. **受信任的二进制文件会被滥用。** 运行攻击者 JavaScript 的已签名 `node.exe` 可以轻松绕过简单的签名检查。要注意二进制文件是*从哪里*运行的,以及它*做了什么*。 4. **Defender 排除项是一个危险信号。** 在被证明清白之前,意外的排除条目应被视为篡改。 5. **现代恶意软件具有自愈能力。** 当存在看门狗时,终止单个进程并不算是修复。重置镜像才是可靠的答案。 6. **假定凭证已泄露。** 鉴于存在一个月的 `SYSTEM` 级权限,我将该主机上使用的所有凭证都视为可能已受损,并从干净的设备上轮换了它们。 ## 分析师反思 这是一次发生在我个人硬件上的真实意外感染,而非模拟演练。端到端地处理此事——检测、分类、网络和持久化分析、失败的遏制,以及最终干净的修复——强化了 SOC L1 的核心闭环:**观察、分类、调查、适当地升级响应并进行记录。** 最有价值的收获是通过手动清理的*失败*来学习,并理解*为什么*重置镜像是正确的决定。 ## 仓库结构 ``` . ├── README.md # This case study └── ioc/ └── ioc-categories.md # Generalized IOC categories (no live indicators) ``` *本仓库不包含任何恶意软件样本、payload 或实时指标。*
标签:AI合规, MITM代理, RFI远程文件包含, Windows 安全, 库, 应急响应, 案例研究