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 安全, 库, 应急响应, 案例研究