UscTrojansDodgers56/gophish-phishing-simulation
GitHub: UscTrojansDodgers56/gophish-phishing-simulation
该项目是一个安全实验室,用于模拟钓鱼攻击并在 Splunk SIEM 中构建端到端的检测逻辑,帮助学习者掌握 SOC 防御与事件分析能力。
Stars: 0 | Forks: 0
# GoPhish 钓鱼模拟与检测
这是一个钓鱼攻击活动的构建与执行过程,仅针对我自己的测试账号发起,随后在我自己的 SIEM 中进行检测,未涉及任何真实人员。我设计了诱饵,完成了从策划到执行的全过程,在 60 秒内攻破了我自己拥有的测试邮箱,然后将日志转发至 Splunk,并编写了用于检测该攻击的规则。这是一个自学 SOC 检测系列的第 6 个实验。
**系列进展:** 这是邮件拆解的攻击与检测的另一面。两者结合,涵盖了初始访问的两个方面,从分析真实的钓鱼邮件到构建并检测它。
| | |
|---|---|
| **类型** | 钓鱼模拟(攻击)+ 检测(防御) |
| **工具** | GoPhish v0.12.1、Splunk、Ubuntu Server VM (VMware) |
| **目标** | 仅限自有测试账号 —— 参见授权与道德规范 |
| **方法** | 计划 → 构建 → 启动 → 追踪 → 报告,然后 检测 → 分析 → 关联 → 加固 → 验证 |
## ⚠️ 授权与道德规范
这是一个个人实验室。
- 每封邮件**仅发送到我拥有和控制的测试账号**。从未将任何真实人员、同事或第三方作为目标。
- **未捕获任何真实凭证** —— 提交的唯一值是我在自己测试收件箱中输入的虚假测试字符串。它们均未出现在此代码仓库中。
- 对真实人员进行钓鱼测试需要**书面的组织授权**,我没有也不寻求此类授权 —— 因此我从未接触过真实目标。
- 此仓库中的登陆页面已**禁用凭证捕获功能**(`action="#LAB-ONLY-CAPTURE-DISABLED"`)。它是一个用于演示技术和检测的教育产物 —— **而非可部署的钓鱼工具包**。
- 所有基础设施都是私有且隔离的:GoPhish 位于 NAT 隔离的 VM 上(私有 `192.168.220.x` 地址),捕获页面无法从互联网访问。
这个实验的重点是从内部理解攻击者的技术,**并证明我能够检测到它** —— 而不是为任何人提供一个可用的数据窃取工具。
## 免责声明
这是一个个人家庭实验室,并非专业的 SOC 经验。活动、目标和“受害者”都是我自己的。因为目标列表是一个单一的自有邮箱,这里的点击/提交计数展示了**漏斗模型和检测能力**,而不是现实世界的防范意识率(n = 1,这不是一项培训指标研究)。一切都如实陈述:模拟攻击、自有账号、针对真实活动数据编写并验证的真实检测逻辑。
## 环境
| 项目 | 值 |
|---|---|
| 攻击者基础设施 | GoPhish v0.12.1,位于独立的 Ubuntu Server VM 上,通过 NAT 隔离 |
| SIEM | Splunk,位于**独立**的 VMware Ubuntu VM 上(遥测数据需要传输;SIEM 绝不与攻击者共用一台机器) |
| 邮件处理 | 两个自有的测试邮箱 —— 一个真实的发件人和一个真实的收件人,均属于我(在此仓库中显示为占位符) |
| 分析员主机 | 用于审查的 Windows 11 |
| 网络 | 私有实验室地址(`192.168.220.x`);NAT 确保捕获页面无法从互联网访问 |
## 第 1 部分 — 构建与运行活动(计划 → 构建 → 启动 → 追踪 → 报告)
| 阶段 | 我所做的工作 |
|---|---|
| **计划** | 选择了密码重置诱饵(故意设计得很普通 —— 越普通的东西越容易被点击)。目标列表 = 一个自有测试邮箱。 |
| **构建** | 搭建 GoPhish v0.12.1;配置发送配置文件;编写包含 1×1 跟踪像素(`{{.TrackingURL}}`)和跟踪链接(`{{.URL}}`)的邮件模板;克隆了一个可在本地捕获提交数据的“重置您的密码”登陆页面。 |
| **启动** | 仅向我的测试收件箱发起了活动。主题:*"需要采取行动:您的密码将在 24 小时后过期。"* |
| **追踪** | 随着跟踪像素和链接事件传入,观察控制台中的漏斗模型逐个阶段亮起。 |
| **报告** | 导出活动报告(CSV),并将每个阶段与原始日志进行核对。 |
完整的可视化操作演示 —— 控制台、模板、登陆页面、漏斗模型和检测 —— 存在于关联的 LinkedIn 轮播图中(`gophish-splunk-carousel.pdf`)。
## 活动结果
仅显示汇总计数 —— 不包含捕获的数据。
| 指标 | 计数 |
|---|---|
| 发送邮件数 | 1 |
| 打开数(跟踪像素) | 1 |
| 链接点击数 | 1 |
| 数据提交数(测试凭证) | 1 |
| 报告数 | 0 |
**攻破时间:60 秒** —— 从邮件发送到凭证提交。
## 第 2 部分 — 检测活动(检测、分析、关联、加固、验证)
| 阶段 | 我所做的工作 |
|---|---|
| **检测** | 将 GoPhish 的访问日志从攻击者 VM 转发到 Splunk,通过自定义 sourcetype(`gophish_access`)进行摄取。在日志中找到了该活动:发送事件、Web 请求、凭证 POST。 |
| **分析** | 解析每一层 —— `"Email sent"` 事件、`GET /?rid=` 登陆页面加载(打开 + 点击),以及 `POST /?rid=` 凭证提交。 |
| **关联** | 使用 `rex` + `stats` 将发送、打开/点击、提交整合到一个时间线中,以目标为键值,确保发送事件保留在查询范围内。 |
| **加固** | 确定了真实组织可用于削弱此攻击的控制措施(见下文)。 |
| **验证** | 将计算出时间线与三个独立来源和原始日志、基于收件人 ID 的 Splunk 关联以及 GoPhish 自身的 CSV 导出进行了交叉核对,所有数据精确到秒且完全一致。 |
### 检测逻辑
自定义 sourcetype 摄取、`rex` 字段提取,以及直接从数据中计算攻破时间的 SPL:
```
sourcetype=gophish_access "Email sent" OR "rid="
| rex field=_raw "rid=(?\w+)"
| rex field=_raw "\"(?GET|POST) "
| rex field=_raw "email=\"[^<]*<(?[^>]+)>\""
| eval stage=case(match(_raw, "Email sent"), "Sent", method=="GET", "Opened/Clicked", method=="POST", "Submitted")
| eval target_email=coalesce(sent_email, "user1@lab.local")
| stats earliest(_time) as first_seen, latest(_time) as last_seen, values(stage) as stages by target_email
| eval time_to_compromise=last_seen-first_seen
| convert ctime(first_seen) ctime(last_seen)
| table target_email, stages, first_seen, last_seen, time_to_compromise
```
**关于这个数字的一个说明,因为我核对过。** 此查询的早期版本仅以 `rid` 为键值,并返回了 **7 秒** —— 这是错误的,因为 `"Email sent"` 事件不携带 `rid`,所以它仅仅测量了从点击开始的时间。通过对目标邮箱进行合并(Coalescing),将发送事件重新纳入了范围,并得出了真实的分钟数。上面的查询报告为 **61 秒**,因为它在控制台轮询请求上提前了一秒钟锚定;真实的发送→提交间隔正好是 **60 秒**(`17:18:32` → `17:19:32`)。这两个数字都记录在 `detection/gophish-detection.spl` 中,绝非信口开河。
## MITRE ATT&CK 映射
| 技术 | ID | 证据 |
|---|---|---|
| Phishing (钓鱼) | T1566 | 密码重置活动本身 |
| Spearphishing Link (鱼叉式钓鱼链接) | T1566.002 | 被跟踪的 `{{.URL}}` 链接 → 克隆的登陆页面 |
| User Execution: Malicious Link (用户执行:恶意链接) | T1204.001 | 目标的 `GET /?rid=` 登陆页面加载 |
| Input Capture: Web Portal Capture (输入捕获:Web 门户捕获) | T1056.003 | 在虚假登录页面上的 `POST /?rid=` 凭证提交 |
## 加固与安全意识建议
在真实组织中,哪些措施能降低点击/提交率并减轻影响 —— 坦诚地划分为初级分析师在告警时*应该做*的工作,以及管理层*应该实施*的工作:
- **处理告警(分析师):** 标记提交事件,将该账号作为已攻破账号进行升级处理,触发强制密码重置和会话/token 撤销,并建议对用户进行后续的安全意识跟进。
- **邮件层(实施):** 在 `p=reject` 级别强制执行 DMARC,并对齐 SPF/DKIM;在网关处对链接进行沙箱处理和重写;标记新注册的发件人域名。
- **身份层(实施):** 部署防钓鱼 MFA,使得仅凭被捕获的密码不足以造成危害 —— 这是应对此类攻击最有效的单一控制措施。
- **人员层(模拟的真正意义所在):** 定期的安全意识培训和简单的一键报告按钮,并随时间进行衡量。
- **检测层:** 将上述 SPL 安排为关联搜索,这样针对用户的发送→提交漏斗就会像在此实验中一样,在 SIEM 中触发告警。
## 时间线
活动自身的漏斗模型,按时间顺序排列:
```
17:18:32 Email sent — password-reset lure delivered T1566.002
17:19:25 Opened / Clicked — landing page loaded (tracked link) T1204.001
17:19:32 Submitted — test credentials captured (contained) T1056.003
Time-to-compromise: 60 seconds
```
(跟踪像素的打开合并到了单一的登陆页面 `GET` 请求中,这就是为什么打开和点击共享同一个时间戳。)
## 代码仓库结构
```
gophish-phishing-simulation/
├── README.md
├── LICENSE
├── templates/
│ ├── email-template.html (lure email, tracking placeholders)
│ └── landing-page.html (CAPTURE NEUTRALIZED — lab artifact only)
├── config/
│ └── campaign-settings.md (sending profile + group; creds REDACTED, targets = placeholders)
├── detection/
│ └── gophish-detection.spl (Part 2 Splunk detection + time-to-compromise)
├── results/
│ └── campaign-metrics.md (aggregate counts only, no captured data)
└── gophish-splunk-carousel.pdf (LinkedIn carousel — visual walkthrough)
```
## 作者
Sean White — [LinkedIn](https://linkedin.com/in/seanwhite56) · [GitHub](https://github.com/UscTrojansDodgers56)
标签:FOFA, GoPhish, SOC检测, 后端开发, 安全运营, 扫描框架, 网络安全, 网页分析工具, 隐私保护