SanghyeokLee-KR/incident-response-cryptominer
GitHub: SanghyeokLee-KR/incident-response-cryptominer
记录了一次 GPU 挖矿木马入侵的完整处置过程,包含调查脚本、清除脚本和验证脚本,并提供 IOC 与检测规则参考。
Stars: 0 | Forks: 0
# GPU 挖矿木马入侵处置记录
半夜明明什么都没运行,但 GPU 风扇却一直转个不停,我觉得奇怪便去查看了一下,这就是事件的起因。经检查发现,一个伪装成 `cmd.exe` 的挖矿木马占用了高达 97% 的 GPU 资源。本文记录了追踪、清除该木马并防止其再次复发的全过程。
实际处置时使用的命令已直接包含在正文中,而用于调查、整理和验证的脚本则放在了 [`scripts/`](scripts) 目录中。
## 发现异常的节点
我首先按进程粒度查看了 GPU 使用率。完整命令可以在 [`scripts/triage.ps1`](scripts/triage.ps1) 中找到,核心部分如下:
```
Get-Counter '\GPU Engine(*)\Utilization Percentage' |
Select-Object -ExpandProperty CounterSamples |
Where-Object { $_.CookedValue -gt 1 } | Sort-Object CookedValue -Descending
```
资源消耗最高的进程是 `cmd.exe`。命令提示符占用 97% 的 GPU 3D 引擎并占用 2.4GB VRAM 是绝不可能发生的事情,因此从这一刻起,我便将其视为伪装进程并开始深入挖掘。
我进一步查看了它的父进程。
```
Get-CimInstance Win32_Process -Filter "ProcessId=34684" |
Select-Object ProcessId, ParentProcessId, Name, ExecutablePath
```
其父进程是 `svchost.exe`,但它实际上并没有托管任何服务。正常的 svchost 总是会托管服务的,因此很明显它只是盗用了该名称进行伪装。我也检查了它的网络连接。
```
Get-NetTCPConnection -State Established | Where-Object OwningProcess -eq 34684
```
它连接到了 `5.223.54.13:3146`。看起来像是一个矿池。
## 它是如何隐藏的
其持久化机制利用了计划任务。它在 `\Microsoft\Windows\Google\` 目录下创建了一个名为 `GoogleUpdateTaskSYSTEM` 的任务,伪装成正常的 Google 更新程序,并以 SYSTEM 权限进行注册。由于其执行命令被多层 base64 编码包裹,我只能将其一层一层地解开。
```
[System.Text.Encoding]::Unicode.GetString([Convert]::FromBase64String($enc))
```
解码后发现它的运行逻辑如下:
- 复制正常的 PowerShell 并重命名为 `C:\Windows\svchost.exe` 和 `KB5019959.exe`(伪装成 Windows 更新)来执行
- 使用 `Add-MpPreference` 将自身文件以及 `cmd.exe`、`powershell.exe`、`InstallUtil.exe`、`MSBuild.exe` 等添加到 Defender 的扫描排除项中
- 从 `jp-maimai.com` 下载伪装成 `.png` 后缀的文件,并使用 `7z.exe` 通过密码解压后执行
- 最后重新注册自身的计划任务
它利用正常的系统工具(PowerShell、InstallUtil、MSBuild、7z)来执行任务,将 payload 伪装成图片,并且所有的命名都在模仿 Windows 或 Google 的正常组件。这是一个为了躲避杀毒软件检测而精心设计的结构。
## 清除
我首先从持久化机制开始着手处理。因为如果留下计划任务,即使杀死了进程它也会死灰复燃。完整脚本在 [`scripts/cleanup.ps1`](scripts/cleanup.ps1) 中,核心内容如下:
```
# 1) 从持久化开始(需要管理员权限)
Get-ScheduledTask -TaskPath '\Microsoft\Windows\Google\' | Unregister-ScheduledTask -Confirm:$false
# 2) 结束进程
Stop-Process -Id 34684, 3236 -Force
# 3) 删除文件
Remove-Item 'C:\ProgramData\KB5019959.exe','C:\ProgramData\KB5026372.exe' -Force
Remove-Item 'C:\ProgramData\Google' -Recurse -Force
# 4) 移除恶意软件注册的 Defender 排除项
Remove-MpPreference -ExclusionProcess 'svchost.exe','cmd.exe','InstallUtil.exe','MSBuild.exe'
# 5) 阻止 C2 出站
New-NetFirewallRule -DisplayName 'Block-Miner-C2' -Direction Outbound -RemoteAddress '5.223.54.13' -Action Block
```
在这里我遇到了一个坑。当我把清理脚本保存为文件并运行时,由于中文注释乱码,导致 `>` 字符被误认为是重定向符,从而引发了解析错误。这是因为 Windows PowerShell 5.1 将不带 BOM 的 UTF-8 文件按照系统代码页(CP949)进行读取所致,将其保存为带 UTF-8 BOM 的格式后解决了问题。因此,本仓库中的 `.ps1` 文件全部都包含了 BOM。
## 验证
与清除本身相比,更重要的是确保在重启后它不会再次复活。因为如果残留了计划任务,它就会在开机时重新启动。以下是使用 [`scripts/verify.ps1`](scripts/verify.ps1) 进行的验证项目:
- GPU 使用率从 97% 恢复正常,降至百分之几以下
- 重启后,挖矿进程、C2 连接、计划任务、恶意文件均未重新生成
- 自动运行、Winlogon、IFEO、AppInit_DLLs、策略、BootExecute、环境变量、Active Setup、计划任务缓存等约 20 个注册表位置未被篡改
- Defender 实时保护正常运行
随后,我完成了 Defender 离线扫描并更换了相关凭证。
## 入侵指标 (IOC)
此处仅记录攻击者侧的指标。仅供防御参考,请勿直接访问。
| 类型 | 指标 |
|---|---|
| C2 | `5.223.54.13:3146` (推测为矿池) |
| 下载 | `hxxps://jp-maimai[.]com/` |
| 文件 | `C:\ProgramData\KB5019959.exe`, `KB5026372.exe`, `C:\Windows\svchost.exe` |
| 文件夹 | `C:\ProgramData\Google\` |
| 计划任务 | `\Microsoft\Windows\Google\GoogleUpdateTask`, `GoogleUpdateTaskSYSTEM` |
## MITRE ATT&CK
| 战术 | 技术 |
|---|---|
| Initial Access | T1204.002 User Execution: Malicious File |
| Execution | T1059.001 PowerShell / T1059.003 Windows Command Shell |
| Execution | T1218.004 InstallUtil / T1127.001 MSBuild |
| Persistence, Privilege Escalation | T1053.005 Scheduled Task (SYSTEM) |
| Defense Evasion | T1036 Masquerading |
| Defense Evasion | T1562.001 Impair Defenses (Defender 排除项篡改) |
| Defense Evasion | T1027 Obfuscated Files / T1140 Deobfuscate/Decode |
| Command and Control | T1105 Ingress Tool Transfer / T1197 BITS Jobs |
| Impact | T1496 Resource Hijacking |
| Credential Access (潜在) | T1555 Credentials from Password Stores |
## 预防再次发生
仅修复单台主机是不彻底的,因此我从组织层面拦截和检测同类攻击的角度进行了总结。
预防
- 使用 WDAC 或 AppLocker 阻止未签名的可执行文件。限制 `ProgramData`、`Temp`、`AppData` 路径下的执行权限
- 启用 Defender 攻击面缩减(ASR)规则:阻止脚本或 Office 程序生成子进程,阻止混淆脚本执行
- 避免在本地存放开发凭证,改用 secrets manager 和短期 token
- 通过出站流量和 DNS 过滤拦截已知的恶意域名和矿池
检测 (Sysmon 或 EDR 规则)
- 在 `\Microsoft\Windows\` 路径下创建计划任务
- 在 `System32` 目录外运行的 `svchost.exe`
- 复制 PowerShell 并重命名后执行的行为
- 通过 `Add-MpPreference` 更改 Defender 排除项
- 使用 EncodedCommand 等混淆方式的 PowerShell
- `InstallUtil`、`MSBuild` 的异常网络通信
- 在闲置时段持续的 GPU、CPU 高负载
## 文件
- `README.md` 本文档
- `scripts/triage.ps1` 用于检测和调查的只读命令集合
- `scripts/cleanup.ps1` 清除脚本(需要管理员权限)
- `scripts/verify.ps1` 重启后的验证与注册表检查
标签:AI合规, DAST, DNS 反向解析, DNS 解析, IPv6, Libemu, OpenCanary, PowerShell, 安全, 库, 应急响应, 恶意软件分析, 挖矿木马, 超时处理