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检测, 后端开发, 安全运营, 扫描框架, 网络安全, 网页分析工具, 隐私保护