JibrizZi/ioc-lab-cobalt-strike-investigation
GitHub: JibrizZi/ioc-lab-cobalt-strike-investigation
基于 Elastic、Zeek 和 Sysmon 遥测数据对模拟 Cobalt Strike 入侵进行端到端取证重建的项目,包含完整攻击链分析、IOC 集合和 MITRE ATT&CK 映射。
Stars: 0 | Forks: 0
# Cobalt Strike 入侵 — 取证日志分析与 IOC 开发
对一个三主机的 Windows 环境中模拟的 Cobalt Strike 攻击进行端到端调查,该调查基于 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**,这为初始的数据包检测设定了优先级。
- 对目标端口进行聚合。在这些高频交互的 IP 对中出现了 **RDP (3389)**,这提高了严重性评估等级:针对远程访问服务的高频流量是暴力破解的特征,而不是文件服务器的正常行为。



### 阶段 2 — 识别威胁攻击者
从流量体量转向信誉度评估和告警关联,从而将恶意基础设施与干扰信息区分开来。最终突显出三个不同的外部地址,每个地址扮演不同的角色:
| 地址 | 角色 | 证据 |
|---|---|---|
| 23.57.69.98 | 主 C2 | 与 Cobalt Strike 告警相关联;22,281 次 Zeek 连接命中,总计 67,491 次 `logstash-*` 命中 |
| 89.187.174.89 | 漏洞利用源 | 针对 172.16.10.10 的 SQL 注入活动 |
| 77.83.199.29 | 暴力破解 | 针对 172.16.10.8 的 RDP 暴力破解活动 |
数据量的巨大差异本身就是一种发现:对单一外部主机的 22,281 次 Zeek 连接是典型的 beacon 行为,而非正常用户流量。



### 阶段 3 — 初始访问与铁证
在命令行遥测数据中搜索该 C2 地址,产生了一个决定性的工件:一个用于获取 `http://23.57.69.98/hablo2` 的 PowerShell 下载器,绑定在 Web 服务器的 **PID 1876** 上。
从该进程向后追溯,确定了入侵的入口点——即 **`app.py`**,这个 Python Web 应用程序就是漏洞利用向量,这与来自 89.187.174.89 的 SQL 注入流量情况相符。这些证据综合起来,表明系统经历了远程命令执行,随后进行了分阶段的 payload 获取,这标志着攻击从单纯的漏洞利用过渡到了实际立足点的建立。


### 阶段 4 — 横向移动、持久化与影响范围
- **跳板:** 受感染的 WEB 主机 (172.16.10.10) 被用作跳板机;**SMB (445)** 承载了针对 FS1 和其他主机的横向移动。
- **在 DC 上执行:** 滥用 `rundll32` (**PID 2436**) 进行内存内执行——这是一种“靠地生存”技术,旨在避免释放独立的可执行文件。
- **持久化:** 文件 `85d2db3` 被安装为 Windows 服务(`6759e42`),记录时间为 22:33。
- **Beaconing:** 观察到 DC1 在 443 端口上向 23.57.69.98 和 52.85.10.88 发起外部通信。
- **账户:** `WEB\Administrator` 被用于 PowerShell 活动;`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`。
**主动狩猎**
在整个网络资产中全面排查完整的 IOC 集合——包括 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合规, Cobalt Strike, IP 地址批量处理, MIT许可证, PE 加载器, 安全事件响应, 攻击诱捕, 数字取证, 网络信息收集, 自动化脚本, 越狱测试