ouaffaqoussama/ioc-lab-cobalt-strike-investigation
GitHub: ouaffaqoussama/ioc-lab-cobalt-strike-investigation
一份基于 Elastic、Zeek 和 Sysmon 遥测数据对模拟 Cobalt Strike 入侵进行端到端取证重构的实战分析报告与 IOC 集合。
Stars: 0 | Forks: 0
# Cobalt Strike 入侵 — 取证日志分析与 IOC 开发
对模拟的 Cobalt Strike 攻击在三台主机 Windows 环境中入侵过程的端到端调查,基于 Elastic/Kibana、Zeek 和 Sysmon 遥测数据进行重构。
调查仅从原始日志索引开始,成功识别了初始利用向量、C2 基础设施、横向移动路径、持久化机制以及隐藏的恶意管理员账户——并最终产出了一套可操作的 IOC 集合和处置计划。
## 环境
| 主机 | 地址 | 角色 |
|---|---|---|
| WEB | 172.16.10.10 | 面向公网的 Web 服务器 (Python/Flask 应用) |
| FS1 | 172.16.10.8 | 文件服务器 |
| DC1 | 10.0.0.25 | 域控制器 |
数据集中共有七台独立主机;以上三台已被确认遭到入侵。
**遥测数据源:** Zeek 连接日志、Sysmon(Event ID 10 — 进程访问)、Windows 安全和 PowerShell 操作日志(Event ID 4104 — 脚本块日志),以及 Windows 服务安装事件。所有这些均被索引到 Elasticsearch 的 `logstash-*` 中,并通过 Kibana 进行查询。
## 执行摘要
外部攻击者利用了面向公网的 Web 服务器上的 Python Web 应用 (`app.py`),实现了远程命令执行。随后通过 PowerShell `IEX` 下载启动器从 `23.57.69.98` 获取了第二阶段 payload,并通过 80 和 443 端口建立了 Cobalt Strike C2 连接。被入侵的 Web 服务器随后被用作跳板机:通过 SMB 向文件服务器和其他主机进行横向移动,在域控制器上滥用 `rundll32` 进行内存执行,并将恶意二进制文件安装为 Windows 服务以实现持久化。在此期间,攻击者创建了隐藏的恶意管理员账户,且在 SMB 流量中观察到的 ZIP 压缩包表明其进行了数据集中打包,这与准备进行数据渗出的行为一致。
**零号病人:** 2022-01-13 11:29:19.246
**数据集中观察到的潜伏时间:** 从初始执行到服务持久化约 11 小时
## 调查过程
### 阶段 1 — 范围界定与发现
调查起步时没有任何特征指标,因此首要任务是摸清环境结构以及流量体量的集中分布情况。
- 对 `computer_name.keyword` 进行聚合以构建主机清单——共发现 **7 台独立主机**。
- 按交互次数对源/目的 IP 对进行排名。排名第一的交互对是 **77.83.199.29 ↔ 172.16.10.8**,这为后续的数据包检查设定了初步优先级。
- 对目标端口进行聚合分析。在流量巨大的交互对中发现了 **RDP (3389)** 活动,这提升了严重性评估等级:指向远程访问服务的高流量是暴力破解的特征,而非文件服务器的正常行为。



### 阶段 2 — 识别威胁行为者
从基于流量体量的分析转向信誉度和告警关联,以将恶意基础设施与无效噪音区分开来。共出现了三个明显的外部地址,各自扮演不同的角色:
| 地址 | 角色 | 证据 |
|---|---|---|
| 23.57.69.98 | 主要 C2 | 与 Cobalt Strike 告警相关联;Zeek 连接命中 22,281 次,`logstash-*` 总命中 67,491 次 |
| 89.187.174.89 | 渗透利用源 | 针对 172.16.10.10 的 SQL 注入活动 |
| 77.83.199.29 | 暴力破解 | 针对 172.16.10.8 的 RDP 暴力破解攻击 |
流量体量上的悬殊差距本身就是一种发现:针对单一外部主机的 22,281 次 Zeek 连接是典型的 beacon 行为,而非正常用户流量。



### 阶段 3 — 初始访问与确凿证据
在命令行遥测数据中搜索该 C2 地址,产出了决定性的证据:一个 PowerShell 下载启动器正在获取 `http://23.57.69.98/hablo2`,且关联到 Web 服务器上的 **PID 1876**。
从这个进程向后倒推,确定了入口点——即 Python Web 应用 **`app.py`** 就是渗透利用向量,这与源自 89.187.174.89 的 SQL 注入流量情况相符。这些证据共同构成了“远程命令执行随后获取阶段性 payload”的完整链条,标志着攻击从漏洞利用成功过渡到了建立实质性据点。


### 阶段 4 — 横向移动、持久化与爆炸半径
- **跳板:** 被入侵的 WEB 主机 (172.16.10.10) 被用作跳板机;**SMB (445)** 承载了向 FS1 及其他主机的横向移动。
- **在 DC 上的执行:** 滥用 `rundll32` (**PID 2436**) 进行内存执行——这是一种“靠生存环境作战”(Living off the Land)的技术,可避免在磁盘上留下独立的可执行文件。
- **持久化:** 文件 `85d2db3` 被安装为 Windows 服务 (`6759e42`),记录时间为 22:33。
- **Beacon 行为:** 观察到 DC1 通过 443 端口向 23.57.69.98 和 52.85.10.88 发起外部连接。
- **账户:** PowerShell 活动使用了 `WEB\Administrator` 账户;`bmctoots`(一个合法账户)被滥用于安装恶意服务;**`fake.admin`** 则被创建为隐藏的恶意管理员(首次出现于 2022-01-13 16:25:40)。
- **数据集中:** 在 SMB 流量中观察到 ZIP 压缩包(`wks1.zip`, `wks_admin.zip`)——这与数据渗出前的收集和打包行为一致。



## 入侵指标
机器可读版本位于 [`iocs/`](iocs/)。
**网络**
| 指标 | 类型 | 上下文 |
|---|---|---|
| 23.57.69.98 | IPv4 | 主要 Cobalt Strike C2 (80/443) |
| 89.187.174.89 | IPv4 | SQL 注入源 |
| 77.83.199.29 | IPv4 | RDP 暴力破解源 |
| 52.85.10.88 | IPv4 | 次要 beacon 目标 (443) |
| `http://23.57.69.98/hablo2` | URL | 第二阶段 payload 获取 |
**主机**
| 指标 | 类型 | 上下文 |
|---|---|---|
| 85d2db3 | 文件名 | 持久化作为服务的 payload |
| 6759e42 | 服务名 | 持久化机制 |
| win_svc_a8 | 服务痕迹 | 相关的服务命名 |
| svcctl | 命名管道 | SMB 服务控制 — 远程服务创建 |
| 1876 | PID | WEB 上的 PowerShell IEX |
| 2436 | PID | DC1 上的 rundll32 |
| 1816 | PID | 源进程,Sysmon Event 10 |
| wks1.zip, wks_admin.zip | 文件名 | 集中打包的压缩包 |
**账户**
| 账户 | 评估 |
|---|---|
| fake.admin | 攻击者创建的隐藏管理员 |
| WEB\Administrator | 已被盗用 — 用于 PowerShell 执行 |
| bmctoots | 被滥用于服务安装的合法账户 |
## MITRE ATT&CK 映射
包含各项技术详细证据的完整表格请参见 [`attack-mapping.md`](attack-mapping.md)。
| 战术 | 技术 |
|---|---|
| 初始访问 | T1190 — 利用面向公众的应用 |
| 执行 | T1059.001 — PowerShell |
| 命令与控制 | T1071.001 — 应用层协议:Web 协议 |
| 命令与控制 | T1105 — 入口工具传输 |
| 凭证访问 | T1110 — 暴力破解 |
| 横向移动 | T1021.002 — SMB / Windows 管理共享 |
| 横向移动 | T1021.001 — 远程桌面协议 |
| 防御规避 | T1218.011 — 系统二进制文件代理执行:Rundll32 |
| 持久化 | T1543.003 — 创建或修改系统进程:Windows 服务 |
| 持久化 | T1136 — 创建账户 |
| 收集 | T1074 — 数据暂存 |
## 建议的响应措施
**隔离控制**
隔离 DC1、FS1 和 WEB。在网络边界处封锁 23.57.69.98、89.187.174.89 和 77.83.199.29。
**证据保全**
在修复之前对受影响的主机进行磁盘镜像,并捕获 PID 1876 和 2436 的内存数据。收集 `6759e42` 的服务注册表项以及文件 `85d2db3`、`6759e42` 和 `win_svc_a8`。
**主动狩猎**
在整个网络范围内全面排查完整的指标集合——包括 payload URL、恶意的和被盗用的账户、打包的压缩包,以及上述服务名和命名管道。
**根除与恢复**
禁用 `fake.admin`,轮换 `WEB\Administrator` 和 `bmctoots` 的凭证,移除恶意服务,为 `app.py` 打补丁,并审计应用程序的输入过滤机制。
**预防**
减少 RDP 暴露面,强制实施 MFA,针对 80/443 出站流量实施 TLS 检查,并确保 Sysmon Event 10 和 PowerShell 4104 日志得到保留和监控——这两者在此案的调查中起到了决定性作用。
## 复盘与改进
本次调查主要依靠“优先关注大流量”的切入策略,这在本次事件中非常有效,因为攻击者的 beacon 非常嘈杂。如果换成一种带有抖动休眠机制、更隐蔽的植入体,这种方法就不会奏效;这时候第一切入点就需要放在进程的血缘关系上——因为由 Web 服务进程派生出的 PowerShell 子进程,无论其流量大小如何,本身就是一种异常。此外,在域控制器上发现 `rundll32` 的痕迹,本来也可以比“高频通信主机表”成为一个更快的调查起点。
## 仓库内容
```
├── README.md full investigation writeup
├── attack-mapping.md ATT&CK techniques with supporting evidence
├── timeline.md chronological reconstruction
├── iocs/ machine-readable indicator sets (CSV)
├── queries/ Elastic/Kibana queries to reproduce each pivot
└── screenshots/ evidence captures from the investigation
```
标签:AI合规, MIT许可证, OpenCanary, Rootkit, Sysmon, Zeek, 数字取证, 网络信息收集, 自动化脚本, 越狱测试