nadeznamorris/Threat-Hunting-Scenario-Assistance
GitHub: nadeznamorris/Threat-Hunting-Scenario-Assistance
威胁狩猎场景辅助工具,用于分析日志数据发现攻击者的入侵行为和攻击链。
Stars: 0 | Forks: 0
# 威胁狩猎场景辅助
## 执行摘要
2025年10月9日,威胁猎人发现对实习生工作站 `gab-intern-vm` 的复杂入侵。表面上是一场常规的远程支持会话,实际上是一场结构化、多阶段的攻击:威胁行为者执行了快速发现扫描,收集了敏感的系统数据,为数据泄露准备了工具,将数据传输到外部IP,并在会话结束后建立了双重持久机制以确保持续访问。
一个精心制作的误导性工具(`SupportChat_log.lnk`)被植入以证明会话活动是合法的故障排除。攻击遵循了清晰的攻击链进程:初始执行绕过、快速环境发现、数据收集和准备、数据泄露和分层持久化。使用现场二进制文件(wmic、tasklist、PowerShell、RuntimeBroker.exe)是故意的——最小化取证足迹,同时最大化信息获取。
## 1. 发现
### 犯罪关键指标
**主机名:** `gab-intern-vm`
**类别:** `实习生工作站`
**攻击日期:** `2025年10月9日`
**主要窗口:** 12:51:44 – 12:52:14 UTC(约30秒的发现扫描)
**数据泄露目标:** `100.29.147.161`(外部,行为者控制)
**准备路径:** `C:\Users\Public\ReconArtifacts.zip`
***FLAG 0 - 开始点***
**目标:** 目标是确定哪台机器最早且最一致地显示出可疑活动——基于共享文件特征、下载文件夹执行和实习生相关主机,并确定狩猎的正确起点。
**标志值:** `gab-intern-vm`
```
DeviceProcessEvents
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where DeviceName has_any ("intern")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, AccountName
| order by TimeGenerated asc
```
***FLAG 1 – 初始执行检测***
**目标:** 检测可能代表入口点的最早异常执行。
**标志值:** `-ExecutionPolicy`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FileName in~ ("powershell.exe", "cmd.exe", "wscript.exe", "mshta.exe", "powershell", "powershell_ise.exe")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, FolderPath
| order by TimeGenerated asc
```
***FLAG 2 – 防御禁用***
**目标:** 识别表明试图暗示或模拟改变安全态势的指标。
**标志值:** `DefenderTamperArtifact.lnk`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ActionType in~ ("FileCreated","FileModified","FileWrite","FileAccessed")
| where InitiatingProcessFileName in~ ("notepad.exe","explorer.exe","regedit.exe","cmd.exe","powershell.exe","mmc.exe")
| where FileName !startswith "__PSScriptPolicyTest"
| project TimeGenerated, ActionType, FileName, FolderPath, InitiatingProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 3 – 快速数据探测***
**目标:** 发现对易于获取的敏感内容的短暂、机会主义检查。
**标志值:** `"powershell.exe" -NoProfile -Sta -Command "try { Get-Clipboard | Out-Null } catch { }"`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("Get-Clipboard", "GetClipboard", "clip.exe", " clip ", "Get-Content | clip", "Set-Clipboard", "Get-ClipboardValue")
| project TimeGenerated, FileName, ProcessCommandLine, ProcessId
| order by TimeGenerated asc
```
***FLAG 4 – 主机上下文侦察***
**目标:** 发现对易于获取的敏感内容的短暂、机会主义检查。
**标志值:** `2025-10-09T12:51:44.3425653Z`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("qwinsta","quser","query session","query user","whoami","systeminfo","hostname","ipconfig","net user","net localgroup","wmic useraccount","wmic computersystem","Get-WmiObject","Get-CimInstance","Get-LocalUser")
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessFileName, ProcessId
| order by TimeGenerated desc
```
***FLAG 5 – 存储表面映射***
**目标:** 检测发现可能包含有趣数据的本地或网络存储位置。
**标志值:** `"cmd.exe" /c wmic logicaldisk get name,freespace,size`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any (
"dir ", "tree ", "net view", "net share", "net use","wmic logicaldisk",
"fsutil", "mountvol", "robocopy"
)
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessCommandLine, ProcessId
| order by TimeGenerated asc
| extend rn = row_number()
```
***FLAG 6 – 连接性和名称解析检查***
**目标:** 识别验证网络可达性和名称解析的检查。
**标志值:** `RuntimeBroker.exe`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("ping","nslookup","Resolve-DnsName","Test-NetConnection","tracert","curl","Invoke-WebRequest","Invoke-RestMethod","wget","GetHostEntry","netstat","query session","qwinsta")
| project TimeGenerated, ChildFileName = FileName, ChildCommandLine = ProcessCommandLine, InitiatingProcessCommandLine, InitiatingProcessParentFileName
| order by TimeGenerated asc
```
***FLAG 7 – 交互式会话发现***
**目标:** 揭示检测主机上交互式或活动用户会话的尝试。
**标志值:** `2533274790397065`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("query session","qwinsta","quser","query user","whoami /all","whoami /groups")
| project TimeGenerated, FileName, InitiatingProcessParentId, InitiatingProcessCommandLine, InitiatingProcessUniqueId
| order by TimeGenerated asc
```
***FLAG 8 – 运行时应用程序清单***
**目标:** 检测正在运行的程序和服务的枚举,以了解风险和机会。
**标志值:** `tasklist.exe`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any (
"tasklist","tasklist /v","Get-Process","wmic process list",
"powershell -Command Get-Process","powershell -Command Get-Service"
)
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessFileName
| order by TimeGenerated desc
```
***FLAG 9 – 权限表面检查***
**目标:** 检测试图了解当前行为者可用的权限的尝试。
**标志值:** `2025-10-09T12:52:14.3135459Z`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("whoami /all","whoami /groups")
| project TimeGenerated, DeviceName, ProcessCommandLine, FileName
| order by TimeGenerated asc
```
***FLAG 10 – 访问证明与出口验证***
**目标:** 找到同时验证出站可达性并尝试捕获主机状态以获取泄露价值的行为。
**标志值:** `www.msftconnecttest.com`
```
DeviceNetworkEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where InitiatingProcessFileName in~ ("powershell.exe", "cmd.exe", "curl.exe", "wget.exe", "bitsadmin.exe")
| where RemoteUrl != ""
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, Protocol, RemotePort
| order by TimeGenerated asc
```
***FLAG 11 – 打包/准备工具***
**目标:** 检测将工具合并到单个位置或包以进行传输。
**标志值:** `C:\Users\Public\ReconArtifacts.zip`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ActionType in ("FileCreated", "FileCopied", "FileModified")
| where FileName has_any (".zip", ".txt", ".log", ".csv")
| project TimeGenerated, DeviceName, FileName, FolderPath, InitiatingProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 12 – 外部传输尝试(模拟)***
**目标:** 识别将数据从主机移出或测试上传能力的尝试。
**标志值:** `100.29.147.161`
```
DeviceNetworkEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where InitiatingProcessFileName in~ ("powershell.exe", "cmd.exe", "curl.exe", "wget.exe", "bitsadmin.exe")
| where RemoteUrl != ""
| project TimeGenerated, DeviceName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, Protocol, RemotePort
| order by TimeGenerated asc
```
***FLAG 13 – 计划重新执行持久性***
**目标:** 检测创建机制以确保行为者的工具在重用或登录时再次运行。
**标志值:** `SupportToolUpdater`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FileName =~ "schtasks.exe" or InitiatingProcessFileName =~ "schtasks.exe"
| where ProcessCommandLine has_any ("create", " /create ", "/sc", "/tn")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 14 – 自动运行回退持久性***
**目标:** 发现作为用户范围内备份持久性的轻量级自动运行条目。
**标志值:** `RemoteAssistUpdater`
*注意:由于日志保留限制,无法显示上述标志。但如果可用,我们将使用上述查询。*
***FLAG 15 – 植入叙事/封面工具***
**目标:** 识别旨在证明活动的叙事或解释性工具。
**标志值:** `SupportChat_log.lnk`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FolderPath has @"\Windows\Recent\"
| project TimeGenerated, DeviceName, FileName, FolderPath, ActionType
| order by TimeGenerated desc
```
## 2. 调查摘要
2025年10月9日,在 `gab-intern-vm` 上进行的威胁狩猎揭露了一个伪装成远程支持会话的行为者。行为者首先绕过PowerShell执行策略控制,然后准备了一个假的Defender篡改工具以误导调查人员。在约30秒的压缩窗口(12:51–12:52 UTC)内,他们进行了快速但彻底的环境扫描——收集剪贴板内容、通过 `wmic` 枚举驱动器、使用 `tasklist.exe` 编制运行进程清单、验证活动用户会话、确认权限并通过 `msftconnecttest.com` 测试出站连接性以与合法流量混合。所有收集到的数据都存档到 `C:\Users\Public\ReconArtifacts.zip` 并泄露到外部IP `100.29.147.161`。为了确保持续访问,植入了两个持久性条目——`SupportToolUpdater` 作为主要条目,`RemoteAssistUpdater` 作为低权限备份的 HKCU Run 键。最后,行为者创建了并打开了 `SupportChat_log.lnk`,这是一个植入的叙事,旨在将整个会话描绘为合法的故障排除。行为者检查了它以确认叙事具有说服力,然后结束了会话。
## 3. 攻击叙事
**阶段 1 — 入口点:执行策略绕过**
最早的异常活动是使用 `-ExecutionPolicy` 标志调用PowerShell,覆盖默认策略以允许未签名或受限制的脚本执行。这为所有后续活动奠定了基础,并且是行为者绕过非管理员工作站端点端点安全控制的经典指标。
**阶段 2 — 防御规避模拟**
创建 `DefenderTamperArtifact.lnk` 表明行为者要么模拟了Windows Defender篡改,要么准备了Windows Defender篡改的外观。此工具作为故意的误导——旨在暗示安全态势的改变,并可能混淆调查Defender相关警报的事故响应人员。
**阶段 3 — 快速发现扫描(12:51:44 – 12:52:14 UTC)**
在约30秒的窗口内,行为者使用原生Windows工具进行了全面但轻量级的环境调查。每次检查都很短暂且具有针对性:
**剪贴板** — PowerShell `-NoProfile -Sta` 在UTC 12:51:44时静默查询剪贴板内容。这种机会主义检查的目标是用户最近复制的凭据、令牌或敏感文本。
**磁盘** — `wmic logicaldisk get name,freespace,size` 枚举本地驱动器以识别数据存储库并评估可用的准备空间。
**网络** — `RuntimeBroker.exe` 用于DNS和网络连接检查,滥用受信任的Windows进程以与正常系统行为混合。
**会话** — 行为者检查了活动交互式用户会话(ID:`2533274790397065`),以确定是否有真实用户正在监控该机器。
**进程** — `tasklist.exe` 编制了所有正在运行的进程,以识别安全工具、监控软件和利用机会。
**权限** — 行为者在UTC 12:52:14时确认了可用的权限,以确定在不提升权限的情况下可能执行的操作的范围。
**连接性** — 对 `www.msftconnecttest.com` 的请求验证了泄露路径,使用合法的Microsoft域以与正常流量混合。
**阶段 4 — 收集与准备**
所有侦察输出都合并到 `C:\Users\Public\ReconArtifacts.zip`。选择公共文件夹是故意的——它是世界可读的,写入不需要特殊权限,并且是横向移动和泄露准备的良好已知位置。
**阶段 5 — 数据泄露**
数据被传输到外部IP地址 `100.29.147.161`。此IP与Microsoft或任何合法组织服务无关,表明行为者控制的基础设施。对 `msftconnecttest.com` 的先前连接性测试确认了行为者在传输数据之前验证了此路径。
**阶段 6 — 建立双重持久性**
部署了两个不同的持久性机制,提供主要和回退重入:
**主要** — `SupportToolUpdater`:命名以模仿合法支持工具并避免对启动条目的随意检查。
**备份(HKCU)** — `RemoteAssistUpdater`:写入到 HKCU(用户范围)Run 键,不需要管理员权限。此回退确保即使主要机制被发现并删除,也能重新进入。
**阶段 7 — 植入误导性工具**
创建了 `SupportChat_log.lnk`,并由行为者打开(由Windows最近 `.lnk` 工具的证明)。此文件旨在提供一个合理的掩护故事——一个支持聊天日志,将所有前面的活动描绘为合法的故障排除。行为者检查了它以确认叙事具有说服力,然后结束了会话。
## 4. MITRE ATT&CK 映射
| 战术 | 技术 | 证据 |
| --------------------------- | ------------------------------------------------------ | ------------------------------------------------------------- |
| 执行/防御规避 | T1059.001 — PowerShell | PowerShell -ExecutionPolicy bypass |
| 防御规避 | T1562.001 — 妨碍防御:禁用或修改工具 | DefenderTamperArtifact.lnk |
| 收集 | T1115 — 剪贴板数据 | Get-Clipboard (silent, no-profile) |
| 发现 | T1082 — 系统信息发现 | wmic logicaldisk get name,freespace,size |
| 发现 | T1016 — 系统网络配置发现 | RuntimeBroker.exe network/DNS check |
| 发现 | T1033 — 系统所有者/用户发现 | 活动会话枚举 |
| 发现 | T1057 — 进程发现 | tasklist.exe |
| 发现 | T1069 — 权限组发现 | 权限验证 |
| 发现 | T1016.001 — 互联网连接发现 | msftconnecttest.com 连接性测试 |
| 收集 | T1560.001 — 归档收集数据 | ReconArtifacts.zip 存档在公共文件夹中 |
| 泄露 | T1041 — 通过 C2 通道泄露 | 转移到 100.29.147.161 |
| 持久性 | T1547.001 — 启动或登录自动启动:注册表 Run 键 | SupportToolUpdater Run 键 , RemoteAssistUpdater HKCU Run 键 |
| 防御规避 | T1036 — 伪装 | SupportChat_log.lnk 误导 |
## 5. 建议
### 立即行动
- 立即隔离 gab-intern-vm 并在修复之前保存取证镜像。
- 在防火墙和代理级别阻止外部IP 100.29.147.161,并调查与此IP通信的其他任何主机。
- 从 HKCU 和 HKLM Run 键中删除两个持久性条目:SupportToolUpdater 和 RemoteAssistUpdater。
- 删除准备存档 C:\Users\Public\ReconArtifacts.zip 并调查其内容以确定数据敏感性
- 重置攻击窗口期间在 gab-intern-vm 上活动的所有账户的凭据。任何剪贴板内容(密码、令牌)都必须被视为已泄露。
- 审查并撤销10月9日会话期间使用的任何远程访问会话或支持工具凭据。
### 短期修复
- 在所有端点上启用并验证 DeviceRegistryEvents 记录。此狩猎确定了一个关键差距:由于缺少注册表审计日志,Run 键持久性完全不可见。
- 为 HKCU Run 键修改创建警报。用户范围持久性通常比 HKLM 和 HKLM 被优先考虑,并且是已知攻击者对低权限立足点的偏好。
- 在 PowerShell 脚本中警报 Get-Clipboard 的使用,尤其是在非交互式或 -NoProfile 环境中运行的脚本上,尤其是在非开发工作站上。
- 将在 C:\Users\Public\ 和其他世界可读准备位置创建存档文件标记为高保真泄露准备指标。
- 在短时间内从同一进程树中实施快速连续发现命令(wmic + tasklist + 权限检查)的行为检测。
- 在 PowerShell -ExecutionPolicy bypass 上警报,用于非管理员、非IT账户在标准工作站上。
### 长期加固
- 通过专用受监控的跳主机强制执行远程支持会话,并记录会话。直接访问实习生或标准工作站应需要明确的批准和记录。
- 在所有非管理员端点上实施 PowerShell 限制语言模式,以限制可以执行而无需提升权限的脚本的范围。
- 在应用程序控制(AppLocker 或 Windows Defender 应用程序控制)中部署,以阻止未签名脚本执行并限制现场二进制文件滥用。
- 使用基于白名单的方法应用出口过滤,以允许出站连接。默认情况下应阻止未知外部IP,例如 100.29.147.161。
- 对实习生和共享工作站应用更高的监控灵敏度,因为它们是常见的初始访问目标,因为安全基线较低且审查较少。
- 审查并执行日志保留策略,以确保所有 Device* 表(特别是 DeviceRegistryEvents)在所有已加入的端点上积极收集。
- 为恶意远程支持会话场景开发一个专门的应急响应计划,涵盖检测、隔离、证据保留和凭据撤销步骤。
**报告状态:** 完成
**下次审查:** 2025年11月15日
**分发:** 网络范围
***FLAG 1 – 初始执行检测***
**目标:** 检测可能代表入口点的最早异常执行。
**标志值:** `-ExecutionPolicy`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FileName in~ ("powershell.exe", "cmd.exe", "wscript.exe", "mshta.exe", "powershell", "powershell_ise.exe")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine, FolderPath
| order by TimeGenerated asc
```
***FLAG 2 – 防御禁用***
**目标:** 识别表明试图暗示或模拟改变安全态势的指标。
**标志值:** `DefenderTamperArtifact.lnk`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ActionType in~ ("FileCreated","FileModified","FileWrite","FileAccessed")
| where InitiatingProcessFileName in~ ("notepad.exe","explorer.exe","regedit.exe","cmd.exe","powershell.exe","mmc.exe")
| where FileName !startswith "__PSScriptPolicyTest"
| project TimeGenerated, ActionType, FileName, FolderPath, InitiatingProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 3 – 快速数据探测***
**目标:** 发现对易于获取的敏感内容的短暂、机会主义检查。
**标志值:** `"powershell.exe" -NoProfile -Sta -Command "try { Get-Clipboard | Out-Null } catch { }"`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("Get-Clipboard", "GetClipboard", "clip.exe", " clip ", "Get-Content | clip", "Set-Clipboard", "Get-ClipboardValue")
| project TimeGenerated, FileName, ProcessCommandLine, ProcessId
| order by TimeGenerated asc
```
***FLAG 4 – 主机上下文侦察***
**目标:** 发现对易于获取的敏感内容的短暂、机会主义检查。
**标志值:** `2025-10-09T12:51:44.3425653Z`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("qwinsta","quser","query session","query user","whoami","systeminfo","hostname","ipconfig","net user","net localgroup","wmic useraccount","wmic computersystem","Get-WmiObject","Get-CimInstance","Get-LocalUser")
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessFileName, ProcessId
| order by TimeGenerated desc
```
***FLAG 5 – 存储表面映射***
**目标:** 检测发现可能包含有趣数据的本地或网络存储位置。
**标志值:** `"cmd.exe" /c wmic logicaldisk get name,freespace,size`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any (
"dir ", "tree ", "net view", "net share", "net use","wmic logicaldisk",
"fsutil", "mountvol", "robocopy"
)
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessCommandLine, ProcessId
| order by TimeGenerated asc
| extend rn = row_number()
```
***FLAG 6 – 连接性和名称解析检查***
**目标:** 识别验证网络可达性和名称解析的检查。
**标志值:** `RuntimeBroker.exe`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("ping","nslookup","Resolve-DnsName","Test-NetConnection","tracert","curl","Invoke-WebRequest","Invoke-RestMethod","wget","GetHostEntry","netstat","query session","qwinsta")
| project TimeGenerated, ChildFileName = FileName, ChildCommandLine = ProcessCommandLine, InitiatingProcessCommandLine, InitiatingProcessParentFileName
| order by TimeGenerated asc
```
***FLAG 7 – 交互式会话发现***
**目标:** 揭示检测主机上交互式或活动用户会话的尝试。
**标志值:** `2533274790397065`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("query session","qwinsta","quser","query user","whoami /all","whoami /groups")
| project TimeGenerated, FileName, InitiatingProcessParentId, InitiatingProcessCommandLine, InitiatingProcessUniqueId
| order by TimeGenerated asc
```
***FLAG 8 – 运行时应用程序清单***
**目标:** 检测正在运行的程序和服务的枚举,以了解风险和机会。
**标志值:** `tasklist.exe`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any (
"tasklist","tasklist /v","Get-Process","wmic process list",
"powershell -Command Get-Process","powershell -Command Get-Service"
)
| project TimeGenerated, FileName, ProcessCommandLine, InitiatingProcessFileName
| order by TimeGenerated desc
```
***FLAG 9 – 权限表面检查***
**目标:** 检测试图了解当前行为者可用的权限的尝试。
**标志值:** `2025-10-09T12:52:14.3135459Z`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ProcessCommandLine has_any ("whoami /all","whoami /groups")
| project TimeGenerated, DeviceName, ProcessCommandLine, FileName
| order by TimeGenerated asc
```
***FLAG 10 – 访问证明与出口验证***
**目标:** 找到同时验证出站可达性并尝试捕获主机状态以获取泄露价值的行为。
**标志值:** `www.msftconnecttest.com`
```
DeviceNetworkEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where InitiatingProcessFileName in~ ("powershell.exe", "cmd.exe", "curl.exe", "wget.exe", "bitsadmin.exe")
| where RemoteUrl != ""
| project TimeGenerated, DeviceName, InitiatingProcessFileName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, Protocol, RemotePort
| order by TimeGenerated asc
```
***FLAG 11 – 打包/准备工具***
**目标:** 检测将工具合并到单个位置或包以进行传输。
**标志值:** `C:\Users\Public\ReconArtifacts.zip`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where ActionType in ("FileCreated", "FileCopied", "FileModified")
| where FileName has_any (".zip", ".txt", ".log", ".csv")
| project TimeGenerated, DeviceName, FileName, FolderPath, InitiatingProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 12 – 外部传输尝试(模拟)***
**目标:** 识别将数据从主机移出或测试上传能力的尝试。
**标志值:** `100.29.147.161`
```
DeviceNetworkEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where InitiatingProcessFileName in~ ("powershell.exe", "cmd.exe", "curl.exe", "wget.exe", "bitsadmin.exe")
| where RemoteUrl != ""
| project TimeGenerated, DeviceName, InitiatingProcessCommandLine, RemoteUrl, RemoteIP, Protocol, RemotePort
| order by TimeGenerated asc
```
***FLAG 13 – 计划重新执行持久性***
**目标:** 检测创建机制以确保行为者的工具在重用或登录时再次运行。
**标志值:** `SupportToolUpdater`
```
DeviceProcessEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FileName =~ "schtasks.exe" or InitiatingProcessFileName =~ "schtasks.exe"
| where ProcessCommandLine has_any ("create", " /create ", "/sc", "/tn")
| project TimeGenerated, DeviceName, FileName, ProcessCommandLine
| order by TimeGenerated asc
```
***FLAG 14 – 自动运行回退持久性***
**目标:** 发现作为用户范围内备份持久性的轻量级自动运行条目。
**标志值:** `RemoteAssistUpdater`
*注意:由于日志保留限制,无法显示上述标志。但如果可用,我们将使用上述查询。*
***FLAG 15 – 植入叙事/封面工具***
**目标:** 识别旨在证明活动的叙事或解释性工具。
**标志值:** `SupportChat_log.lnk`
```
DeviceFileEvents
| where DeviceName == "gab-intern-vm"
| where TimeGenerated between (datetime(2025-10-01) .. datetime(2025-10-15))
| where FolderPath has @"\Windows\Recent\"
| project TimeGenerated, DeviceName, FileName, FolderPath, ActionType
| order by TimeGenerated desc
```
## 2. 调查摘要
2025年10月9日,在 `gab-intern-vm` 上进行的威胁狩猎揭露了一个伪装成远程支持会话的行为者。行为者首先绕过PowerShell执行策略控制,然后准备了一个假的Defender篡改工具以误导调查人员。在约30秒的压缩窗口(12:51–12:52 UTC)内,他们进行了快速但彻底的环境扫描——收集剪贴板内容、通过 `wmic` 枚举驱动器、使用 `tasklist.exe` 编制运行进程清单、验证活动用户会话、确认权限并通过 `msftconnecttest.com` 测试出站连接性以与合法流量混合。所有收集到的数据都存档到 `C:\Users\Public\ReconArtifacts.zip` 并泄露到外部IP `100.29.147.161`。为了确保持续访问,植入了两个持久性条目——`SupportToolUpdater` 作为主要条目,`RemoteAssistUpdater` 作为低权限备份的 HKCU Run 键。最后,行为者创建了并打开了 `SupportChat_log.lnk`,这是一个植入的叙事,旨在将整个会话描绘为合法的故障排除。行为者检查了它以确认叙事具有说服力,然后结束了会话。
## 3. 攻击叙事
**阶段 1 — 入口点:执行策略绕过**
最早的异常活动是使用 `-ExecutionPolicy` 标志调用PowerShell,覆盖默认策略以允许未签名或受限制的脚本执行。这为所有后续活动奠定了基础,并且是行为者绕过非管理员工作站端点端点安全控制的经典指标。
**阶段 2 — 防御规避模拟**
创建 `DefenderTamperArtifact.lnk` 表明行为者要么模拟了Windows Defender篡改,要么准备了Windows Defender篡改的外观。此工具作为故意的误导——旨在暗示安全态势的改变,并可能混淆调查Defender相关警报的事故响应人员。
**阶段 3 — 快速发现扫描(12:51:44 – 12:52:14 UTC)**
在约30秒的窗口内,行为者使用原生Windows工具进行了全面但轻量级的环境调查。每次检查都很短暂且具有针对性:
**剪贴板** — PowerShell `-NoProfile -Sta` 在UTC 12:51:44时静默查询剪贴板内容。这种机会主义检查的目标是用户最近复制的凭据、令牌或敏感文本。
**磁盘** — `wmic logicaldisk get name,freespace,size` 枚举本地驱动器以识别数据存储库并评估可用的准备空间。
**网络** — `RuntimeBroker.exe` 用于DNS和网络连接检查,滥用受信任的Windows进程以与正常系统行为混合。
**会话** — 行为者检查了活动交互式用户会话(ID:`2533274790397065`),以确定是否有真实用户正在监控该机器。
**进程** — `tasklist.exe` 编制了所有正在运行的进程,以识别安全工具、监控软件和利用机会。
**权限** — 行为者在UTC 12:52:14时确认了可用的权限,以确定在不提升权限的情况下可能执行的操作的范围。
**连接性** — 对 `www.msftconnecttest.com` 的请求验证了泄露路径,使用合法的Microsoft域以与正常流量混合。
**阶段 4 — 收集与准备**
所有侦察输出都合并到 `C:\Users\Public\ReconArtifacts.zip`。选择公共文件夹是故意的——它是世界可读的,写入不需要特殊权限,并且是横向移动和泄露准备的良好已知位置。
**阶段 5 — 数据泄露**
数据被传输到外部IP地址 `100.29.147.161`。此IP与Microsoft或任何合法组织服务无关,表明行为者控制的基础设施。对 `msftconnecttest.com` 的先前连接性测试确认了行为者在传输数据之前验证了此路径。
**阶段 6 — 建立双重持久性**
部署了两个不同的持久性机制,提供主要和回退重入:
**主要** — `SupportToolUpdater`:命名以模仿合法支持工具并避免对启动条目的随意检查。
**备份(HKCU)** — `RemoteAssistUpdater`:写入到 HKCU(用户范围)Run 键,不需要管理员权限。此回退确保即使主要机制被发现并删除,也能重新进入。
**阶段 7 — 植入误导性工具**
创建了 `SupportChat_log.lnk`,并由行为者打开(由Windows最近 `.lnk` 工具的证明)。此文件旨在提供一个合理的掩护故事——一个支持聊天日志,将所有前面的活动描绘为合法的故障排除。行为者检查了它以确认叙事具有说服力,然后结束了会话。
## 4. MITRE ATT&CK 映射
| 战术 | 技术 | 证据 |
| --------------------------- | ------------------------------------------------------ | ------------------------------------------------------------- |
| 执行/防御规避 | T1059.001 — PowerShell | PowerShell -ExecutionPolicy bypass |
| 防御规避 | T1562.001 — 妨碍防御:禁用或修改工具 | DefenderTamperArtifact.lnk |
| 收集 | T1115 — 剪贴板数据 | Get-Clipboard (silent, no-profile) |
| 发现 | T1082 — 系统信息发现 | wmic logicaldisk get name,freespace,size |
| 发现 | T1016 — 系统网络配置发现 | RuntimeBroker.exe network/DNS check |
| 发现 | T1033 — 系统所有者/用户发现 | 活动会话枚举 |
| 发现 | T1057 — 进程发现 | tasklist.exe |
| 发现 | T1069 — 权限组发现 | 权限验证 |
| 发现 | T1016.001 — 互联网连接发现 | msftconnecttest.com 连接性测试 |
| 收集 | T1560.001 — 归档收集数据 | ReconArtifacts.zip 存档在公共文件夹中 |
| 泄露 | T1041 — 通过 C2 通道泄露 | 转移到 100.29.147.161 |
| 持久性 | T1547.001 — 启动或登录自动启动:注册表 Run 键 | SupportToolUpdater Run 键 , RemoteAssistUpdater HKCU Run 键 |
| 防御规避 | T1036 — 伪装 | SupportChat_log.lnk 误导 |
## 5. 建议
### 立即行动
- 立即隔离 gab-intern-vm 并在修复之前保存取证镜像。
- 在防火墙和代理级别阻止外部IP 100.29.147.161,并调查与此IP通信的其他任何主机。
- 从 HKCU 和 HKLM Run 键中删除两个持久性条目:SupportToolUpdater 和 RemoteAssistUpdater。
- 删除准备存档 C:\Users\Public\ReconArtifacts.zip 并调查其内容以确定数据敏感性
- 重置攻击窗口期间在 gab-intern-vm 上活动的所有账户的凭据。任何剪贴板内容(密码、令牌)都必须被视为已泄露。
- 审查并撤销10月9日会话期间使用的任何远程访问会话或支持工具凭据。
### 短期修复
- 在所有端点上启用并验证 DeviceRegistryEvents 记录。此狩猎确定了一个关键差距:由于缺少注册表审计日志,Run 键持久性完全不可见。
- 为 HKCU Run 键修改创建警报。用户范围持久性通常比 HKLM 和 HKLM 被优先考虑,并且是已知攻击者对低权限立足点的偏好。
- 在 PowerShell 脚本中警报 Get-Clipboard 的使用,尤其是在非交互式或 -NoProfile 环境中运行的脚本上,尤其是在非开发工作站上。
- 将在 C:\Users\Public\ 和其他世界可读准备位置创建存档文件标记为高保真泄露准备指标。
- 在短时间内从同一进程树中实施快速连续发现命令(wmic + tasklist + 权限检查)的行为检测。
- 在 PowerShell -ExecutionPolicy bypass 上警报,用于非管理员、非IT账户在标准工作站上。
### 长期加固
- 通过专用受监控的跳主机强制执行远程支持会话,并记录会话。直接访问实习生或标准工作站应需要明确的批准和记录。
- 在所有非管理员端点上实施 PowerShell 限制语言模式,以限制可以执行而无需提升权限的脚本的范围。
- 在应用程序控制(AppLocker 或 Windows Defender 应用程序控制)中部署,以阻止未签名脚本执行并限制现场二进制文件滥用。
- 使用基于白名单的方法应用出口过滤,以允许出站连接。默认情况下应阻止未知外部IP,例如 100.29.147.161。
- 对实习生和共享工作站应用更高的监控灵敏度,因为它们是常见的初始访问目标,因为安全基线较低且审查较少。
- 审查并执行日志保留策略,以确保所有 Device* 表(特别是 DeviceRegistryEvents)在所有已加入的端点上积极收集。
- 为恶意远程支持会话场景开发一个专门的应急响应计划,涵盖检测、隔离、证据保留和凭据撤销步骤。
**报告状态:** 完成
**下次审查:** 2025年11月15日
**分发:** 网络范围标签:AI合规