Gophish+Evilginx3搭建企业钓鱼演练平台:合规、定制与实战排查
2026/9/24 18:41:55 网站建设 项目流程

我们团队最近把内部钓鱼演练平台重新搭了一遍,核心组件换成了 Gophish 加 Evilginx3 这套组合,做了不少深度定制,也踩了不少坑。这篇文章不聊那些宣传话术,直接讲我们在实际搭建和运营中的思路、参数、步骤和排查经验。这套东西做的是企业授权的安全意识演练,不是教人做坏事,整个前提是:你必须拿到明确的书面授权,在约定的范围内去做测试,所有数据要按隐私规范处理。如果你没有这个条件,下面的内容看看思路就好,千万别乱套。

Gophish 本身是一款开源钓鱼演练平台,负责邮件的发送、落地页托管、活动编排和数据统计,相当于整个演练的“指挥中枢”。Evilginx3 则是一个更底层的反向代理型工具,它的价值不是发邮件,而是让克隆出来的登录页在结构和交互上更接近真实站点。很多人一说到这一步,脑子里想的都是“破解”“绕验证码”之类的事,其实在企业红队演练里,它的作用是提升模拟真实度,让演练结果更可信——但前提仍然是只在授权范围内使用,而且不能真的去收集员工之外的任何真实账号数据。这篇文章会把合规边界、平台安装、模板设计、邮件送达、数据统计、常见坑全部过一遍,适合正在搭演练平台的安全工程师和红队成员参考。

1. 内容整体设计与思路拆解

1.1 钓鱼演练到底在解决什么问题

很多公司做安全意识培训,方式是发PPT、搞考试,员工当时看完觉得“哦有道理”,过两个星期收到一封伪装邮件照样点。原因很简单:安全意识是没办法靠课堂考试量化的,它必须在真实场景里被测试。

钓鱼演练的价值就在这里。通过向员工发送模拟钓鱼邮件,观察谁点开了链接、谁输入了账号密码、谁下载了附件,可以量化出组织的“安全薄弱点”,然后针对性地做培训。这不是为了抓典型批评人,而是为了拿到基线数据,让安全投入有方向。Gophish 这类工具之所以被广泛使用,就是因为它把“发邮件—托管页面—记录行为—输出结果”这条链路做成了标准产品,安全团队不需要自己写一套管理系统。

但标准版 Gophish 有一个体验问题:模板和页面太“模板化”,员工见多了之后一眼就能认出这是演练邮件,导致测试结果失真。这也是我们要做深度定制的核心原因——需要让模拟邮件更接近真实攻击,才能测出真实水平。

1.2 Gophish 与 Evilginx3 的定位为什么互补

Gophish 的强项是“管理”,它有用户分组、邮件模板、登陆页管理、活动统计、Web 控制台,运营一个演练项目非常方便。它的弱项是“模拟真实度”,尤其是落地页。系统自带的克隆功能会把目标站点的 HTML 抓下来,但很多动态页面、登录跳转逻辑是抓不全的,员工打开页面时一眼就能看出破绽。

Evilginx3 的强项正好相反。它不是抓取静态 HTML,而是用反向代理的方式,把真实目标站点“转发”给访问者。用户访问的是我们搭建的模拟域名,但看到的内容、跳转、界面都跟真实站点几乎一样。它甚至能模拟真实站点的会话流程,这在红队演练中非常有用。

放到实战里的组合方式是:Gophish 负责发邮件和统计,Evilginx3 负责承载高真实度的落地页。两层之间通过 URL 串联起来——Gophish 发出的邮件指向 Evilginx3 托管的页面,员工点击后的行为回流到 Gophish 的统计中。这套结构既不牺牲管理效率,又能显著提升模拟真实度。

1.3 合规与授权:所有定制的前提边界

这一节放在开头,是我必须提醒的。Evilginx3 这套东西一旦用在不该用的地方,后果很严重。根据国内的相关法规,未经授权获取计算机信息系统数据、冒充他人站点的行为都涉嫌违法。所以在我们团队,有两条铁律:第一,演练对象只限本公司员工,必须经过公司信息安全负责人和人事部门书面确认;第二,演练域名、IP、时间窗口、数据保存周期,全部提前报备,员工名单只能来自 HR 提供的内部通讯录。

“反检测”这个词在安全圈容易引起误解。我们在演练里说的“反检测”,不是绕过防火墙、杀毒软件、邮件网关的技术规避,而是“怎么让模拟邮件和页面不像演练”——也就是提高模拟真实度,让员工用对待真实威胁的方式去对待它。如果你把“反检测”理解成规避安全设备,那已经偏离合规边界了。我们的做法是:提前把演练域名加入安全团队白名单,让邮件能正常送达,同时也不会触发真正的安全告警。这个“白名单”本身就是授权流程的一部分,不是绕过。

2. 核心细节解析与实操要点

2.1 Gophish 的组件结构与端口规划

Gophish 启动后默认运行两个 Web 服务:

  • 管理后台(Admin)默认监听3333端口,需要登录后访问,所有活动配置都在这里完成;
  • 钓鱼服务(Phishing Server)默认监听80端口,用来接收员工点击,承载钓鱼页面和图片跟踪。

发送邮件和数据库是内置模块,不需要额外安装服务,但数据库默认是 SQLite,生产环境建议换成 MySQL 或 PostgreSQL,尤其是当演练人数上千时,SQLite 的并发写入会明显吃紧。

端口规划上,一个常见问题是演练机和办公网在同一网段,3333 端口直接暴露在内网,任何人都可以访问后台登录页。我们部署时用防火墙把 3333 只放开给安全团队的管理 IP,80 端口也只对员工所在网段开放。如果你的公司有公网边界,建议把演练机放在独立的 DMZ 区,不要跟核心业务环境混在一起。

2.2 邮件送达率的三个关键指标

钓鱼演练最尴尬的事情是邮件发了没人收到,演练没有效果。邮件送达率主要由三个因素决定:SPF、DKIM、DMARC。

  • SPF:声明哪些 IP 允许发送你的域名邮件,配置方式是在 DNS 里加一条 TXT 记录,例如v=spf1 ip4:203.0.113.10 -all
  • DKIM:对邮件签名,收件方验证签名是否有效,通常由邮件服务商提供公钥记录;
  • DMARC:告诉收件方如何处理未通过校验的邮件,建议演练期间先设为p=none,否则容易被直接拒收。

实际配置时,我用的是独立模拟域名,而不是拿公司主域名直接发。这样做的原因很实际:如果演练域的 SPF/DKIM 配置有问题,影响范围被限制在模拟域,不会污染公司主域的信誉。模拟域的命名也要有讲究,不能太像主域(比如rnicrosoft.com这种),太像的话会引发员工真实误报,甚至触发外部机构的品牌保护投诉。我们一般用一个与公司业务无关的历史域名,或者子域名。

2.3 模板定制的关键:变量替换与行为追踪

Gophish 的邮件模板支持{{.FirstName}}{{.LastName}}{{.Email}}这样的变量,发送时逐一替换成目标用户的真实信息。这个功能很好用,但有个细节:如果用户列表是从 CSV 导入的,字段名映射必须严格对应,否则变量不会被替换,模板里会直接显示{{.FirstName}}的原文。

邮件里的链接是核心行为追踪点。Gophish 会用{{.URL}}变量替换成每个用户独有的跟踪链接,点击链接会被记录到数据库中,再重定向到钓鱼页面。这里要特别注意:不要在模板里写死 URL,一定要用{{.URL}},否则拿不到点击数据。

页面图片追踪也有类似机制。Gophish 会在页面顶部插入一个透明的跟踪像素,邮箱客户端打开邮件时加载图片,就记录一次“打开”。但现代邮件客户端默认不加载远程图片,这个数据通常只是参考,不能作为核心指标。

2.4 数据隔离与隐私保护

演练过程中产生的最敏感数据,是“谁点了链接、谁输入了账号密码”。如果不做隔离,这个数据流落到不当的人手里,会变成内部工具。我们采取的做法是:Gophish 的数据库单独存放在加密盘上,Admin 后台采用二次认证登录,导出演练结果时只保留部门级汇总数据,个人明细数据在培训完成后 30 天内删除。这个周期是跟合规同事确认过的。

3. 实操过程从零搭建一套内部演练环境

3.1 安装 Gophish 与初始化安全设置

Gophish 的安装比较简单。从 GitHub 仓库下载对应平台的压缩包,解压后直接运行二进制文件。我第一次部署时用的是 Linux 服务器,命令大致是这样:

wget https://github.com/gophish/gophish/releases/download/v0.12.1/gophish-v0.12.1-linux-64bit.zip unzip gophish-v0.12.1-linux-64bit.zip chmod +x gophish

启动后,控制台会显示管理后台的临时密码,样式类似:

[/] Starting Gophish... [/] Available at: https://127.0.0.1:3333 [/] Login with admin / 随机密码

这里有个关键操作:首次登录后,立刻修改默认管理员密码。很多人忽略这一步,默认密码是官方写在文档里的,不换等于把后台大门敞开。还要同时修改 SSL 证书,Gophish 默认使用自签名证书,浏览器会告警,建议用公司 CA 签发的证书,或者用 Let's Encrypt 给演练域名签一张有效证书,这样员工打开落地页时不会看到“不安全连接”的红色警告,演练真实度也会高不少。

3.2 配置发信通道

发信通道的配置在“Sending Profiles”里。这里需要填 SMTP 服务器的地址、端口、发件人邮箱。我们用的是公司自有邮件系统搭建的测试通道,配置类似:

  • 服务器:smtp.example.com
  • 端口:465(SSL 加密)或587(STARTTLS)
  • 发件人:security-notice@example.com
  • 用户名与密码:独立服务账号,不要用个人邮箱

配置完成后建议先发一封测试邮件到自己的邮箱,确认能正常收到且不是进入垃圾箱。这里有一个坑:很多公司邮件网关会把外部 SMTP 发来的邮件默认标记为外部邮件,即使 SPF/DKIM 正确,也可能被加上“外部邮件警告”。如果你的演练邮件被加了警告标签,员工会本能地警惕,影响演练真实性。我们的做法是在邮件网关里配置白名单,或者使用公司内部的“营销邮件通道”来发演练邮件。

3.3 设计一个合格的演练模板

模板设计是整个演练能否成功的关键。我建议从简单的场景开始,不要一上来就搞极端复杂的“金融转账”类场景。

一个经典且有效的模板是“密码过期通知”。这类通知员工见过太多次,几乎不会有警觉,非常适合做基线测试。邮件文案可以是这样:

主题:你的账号密码将在24小时后过期

你好 {{.FirstName}},

检测到你的账号密码将于明天 18:00 过期,请尽快更新以保持正常访问。
更新入口:{{.URL}}

请勿回复本邮件,此邮箱无人值守。

这个模板有几个细节值得注意:主题里加上“24小时”制造紧迫感;正文里不写真实系统名,避免被老员工立刻识破;“请勿回复”是为了减少员工的后续疑问。URL 使用{{.URL}}自动替换,确保每个员工都有独立跟踪链接。

落地页的设计也要配合。我们在落地页放了一个模拟的登录表单,输入框和按钮尽量接近公司真实系统的风格。这里不用 Evilginx3 的场景可以先跳过,后面单独说。表单提交后不要真的验证账号密码,直接跳转到一个“服务维护中,请稍后再试”的提示页,这样员工即使输入了密码,也只会以为自己遇到了系统维护,不会立即意识到被骗。

3.4 导入用户名单与分组策略

用户管理是 Gophish 的一个高频使用功能。支持手动添加,也支持 CSV 批量导入。CSV 格式大致是:

First Name,Last Name,Email,Position,Department 张三,李四,zhangsan@example.com,工程师,研发部

导入后会自动生成一个“User Group”,可以针对不同部门创建不同的组,便于按部门统计演练结果。这里有一个容易踩的坑:Gophish 默认会用邮箱地址作为唯一标识,如果两个用户的邮箱重复,导入可能会覆盖。导入前务必对 CSV 做去重,否则演练数据会错乱。

分组策略上,我们通常第一轮只做“全公司抽样”,比如每个部门抽 20% 的员工,目的是拿到基线数据,而不是一开始就给全员发。全员演练适合在基线数据出来之后做。

3.5 启动演练与查看结果指标

以上都准备好后,创建 Campaign。关键配置项包括:邮件模板、落地页、用户组、发送时间。发送时间我建议选工作日上午 10 点到 11 点之间,这个时间段员工刚处理完早上的邮件,注意力相对集中但又不会太防备,打开邮件的概率更高。凌晨或下班后发更容易被忽略,数据没有参考价值。

演练启动后,在“Dashboard”里可以看到实时数据。Gophish 默认统计四个维度:

  • Sent已发送
  • Opened已打开邮件
  • Clicked已点击链接
  • Submitted Data已提交表单数据

这里需要留意信息层级:打开不等于点击,点击不等于提交,提交才是最严重的行为。我们做分析时,更关注“点击率”和“提交率”的相对关系。如果点击率很高但提交率低,说明员工警惕性还行;如果两者都高,说明那批员工的意识培训需要加强。

3.6 引入 Evilginx3 作为高真实度落地页组件

Gophish 默认的 Landing Page 适合做简单演练,但涉及模拟公司真实 OA 或邮箱登录页时,默认克隆会漏掉很多前端交互逻辑。这时候可以引入 Evilginx3 作为落地页托管层。

Evilginx3 的工作思路可以通俗地理解成“中间代理”:员工访问我们搭的模拟域名时,Evilginx3 在后台把真实目标站点的内容拉取回来,再原样呈现给员工。页面上的资源、字体、逻辑都是真实站点的,员工很难察觉异常。

但这里我必须强调一个边界:在企业授权演练中,Evilginx3 通常只用于“展示登录页长什么样”和“模拟会话流程”,不是为了收集真实系统的账号密码。我们在部署时会在 Evilginx3 的配置里把转发目标指到一套专门为演练搭建的测试系统上,而不是公司的真实认证服务器。这样既保证了模拟真实度,又不会让任何真实账号凭证进入演练数据库。

如果你没有条件搭建测试系统,建议使用 Gophish 自带的落地页加模拟表单就够了,不要为了“显得高级”去拿真实系统做中间人代理。这个风险不值得冒。

3.7 演练完成后的数据导出与处理

演练结束后,第一步是把 Campaign 状态改成“Completed”,停止继续发送。第二步是导出结果,Gophish 支持导出 CSV,里面包含每个员工的发送状态、打开时间、点击时间、提交的数据和 User-Agent 等信息。

这里有一个细节:导出的 CSV 如果包含员工提交的“密码”,即使只是员工随手输入的模拟密码,也属于敏感信息。导出时要先把“Submitted Data”字段脱敏,或者只在内存中分析,不要直接存到本地电脑。我们处理方式是:导出后用 Python 脚本把密码字段全部替换成星号,只保留用户名和提交时间用于统计分析。

4. 常见问题与排查技巧实录

4.1 邮件进垃圾箱的排查顺序

这是出现频率最高的问题。排查顺序从前到后依次是:

  1. 检查 SPF 记录是否生效:用dig TXT 你的模拟域名确认 DNS 记录已经生效,注意有些 DNS 修改要等待 10 分钟到 2 小时;
  2. 检查 DKIM 签名:用邮件头分析工具查看Authentication-Results字段,确认dkim=pass
  3. 检查收件人邮箱的网关策略:有些公司会对外部域名的邮件做严格过滤,即使 SPF/DKIM 通过也会被拦,这时就需要邮件网关管理员手动放行。

另外还要检查发送频率。如果你一次性发送几千封邮件,任何正常的邮件系统都会觉得你有问题。我们的做法是分批次发送,每批控制在 100 人以内,间隔 15 分钟以上,模拟真实营销邮件的发送节奏。

4.2 追踪数据异常:为什么打开率为 0

很多团队一上来就看到“Opened”是 0,第一反应是平台出问题了。其实绝大多数原因是员工的邮箱客户端没有加载远程图片。Gophish 的“打开”追踪依赖在邮件里嵌入一个远程图片,Outlook 默认设置是“不自动下载图片”,所以打开率低是很正常的,不用纠结。真正需要关注的是“点击率”,这个数据是通过链接跳转记录的,不依赖图片加载。

如果点击率也是 0,再检查模板里的链接是不是用了{{.URL}}变量,或者检查 Campaign 的 URL 有没有被邮件网关改写。一些高级邮件网关会把邮件正文里的外部链接改成网关自己的跳转地址,这会导致 Gophish 无法正确记录点击。

4.3 落地页显示异常或被浏览器拦截

Gophish 自带的克隆功能抓取的是目标站点首次请求时返回的 HTML,很多页面是动态渲染的,克隆下来后 JavaScript 逻辑不完整,页面显示会错乱。解决办法一是改用 Simple 页面手工搭建一个更贴近实际的表单,二是使用 Evilginx3 这类真实代理方案。

浏览器拦截的问题更直接:如果你使用的是未备案的海外域名,或者域名被其他恶意活动波及,浏览器会直接展示红色拦截页面。稳妥的做法是使用已备案的国内域名,并配置有效的 HTTPS 证书。

4.4 员工向安全团队举报了演练邮件怎么办

这在演练运营中一定会发生。我们的处理方式是:在演练方案里提前留一个“举报响应窗口”,安全团队收到举报后,首先确认这是否对应本次演练的域名和模板,确认后答复员工“这是一个内部演练,感谢你的警惕”,并把员工标记为“高安全意识”。如果多次演练中该员工都进行了举报,后续可以考虑把该员工从演练名单里移除。

反过来,如果员工没有举报而是直接点击并提交了密码,后续要做的是把培训材料发给他,而不是公开点名。

写在最后

做了几轮钓鱼演练之后,我的体会是:演练的真正价值不在“抓到多少人犯错”,而是通过数据发现组织的安全流程漏洞。比如某部门点击率异常高,可能是因为他们的工作性质决定了对邮件的依赖度高,需要针对性地设计更谨慎的操作规范,而不是简单归结为“意识差”。

另外,工具是次要的,流程才是核心。无论 Gophish 还是 Evilginx3,都是辅助手段,真正重要的是授权边界、数据保护和后续的培训闭环。个人建议新手团队先不要碰 Evilginx3,用 Gophish 标准功能做满三轮演练,把模板定制、数据分析和员工沟通流程跑熟了,再考虑引入更复杂的模拟组件。安全演练是一场长期的攻防拉练,不是一次性的“抓人游戏”,稳扎稳打比追求花活儿更重要。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询