尧图网络科技YAOTU DIGITAL 获取报价
获取报价
首页 / 资讯中心 / 文章详情

Evilginx3+Gophish联动:高仿真钓鱼演练与反检测实战解析

发布时间:2026/9/29 9:20:13

资讯中心
01
ARTICLE

Evilginx3+Gophish联动:高仿真钓鱼演练与反检测实战解析

Evilginx3+Gophish联动:高仿真钓鱼演练与反检测实战解析
上个月给一家客户做钓鱼演练我照旧用 Gophish 克隆了他们的 OA 登录页。点击率做到了 40% 以上但客户安全团队第二天就发来一张截图问我说这页面干净得像产品演示邮件网关一抓一个准沙箱打开也是秒识别你们有没有更接近真实攻击的玩法这个问题其实是很多安全团队的共同困境。Gophish 这类传统钓鱼模拟平台强在投放、追踪和人员管理但它的“页面”是克隆出来的静态副本没有真实会话、没有双因子交互更谈不上动态内容还原。于是我开始把演练链路升级成另一套组合Evilginx3 做中间人代理Gophish 做投放和统计中枢再针对扫描器、沙箱和浏览器指纹做定制与反检测。这篇文章就记录一下我在授权红队演练里的完整落地思路供同样在做防御验证的朋友参考。先声明一句下面所有技术动作默认你已拿到目标资产所有者的书面授权。红队演练的底线是合规别把这一套用在没签合同的系统上。1. 为什么静态克隆页做不出高逼真的凭证捕获1.1 Gophish 擅长的事和不擅长的事Gophish 在钓鱼演练里依然是主力因为它把大型演练的工程复杂度拆得足够清楚用户组、邮件模板、发信配置、登录页、场景编排和结果统计全部都能在一个面板里完成还带完整的 REST API方便自动化。它的底层逻辑其实很简单把克隆好的 HTML 页面托管在自己的服务器上员工在页面上输入的内容会被记录到数据库仅此而已。它不会和真实系统做交互不会校验账号密码是否正确更不会给用户一个可用的登录会话。所以如果你的演练目标是“看看谁点了链接、谁填了密码”Gophish 是完全够用的。但如果你想模拟的是账户接管ATO、MFA 绕过、会话劫持这一类攻击路径静态克隆页就无能为力了。这恰恰是现代真实钓鱼攻击最常用的手段也是演练逼真度不足的根本原因。1.2 Evilginx3 中间人代理链路到底做了什么Evilginx3 是一个 Go 写的反向代理框架核心思路是站在目标用户和真实网站之间做“中间人”。我举一个很典型的例子假设要模拟的目标是某企业的 SSO 登录页你准备一个和目标域名高度相似的 lure 域名解析到你的 VPS 上员工点击钓鱼邮件里的链接浏览器请求先打到 Evilginx3Evilginx3 按 phishlet 配置去上游拉取真实登录页面对 HTML 做实时改写后再返回给用户用户看到的就是一个穿了自己企业域名的“正版”页面用户在页面输入账号密码Evilginx3 先截获明文凭证写入本地日志然后把请求原样转发给真实网站真实网站校验通过返回 session cookie 和登录后的页面Evilginx3 再把 cookie 记录下来把正常页面返回给用户。整个过程里员工以为自己一直在访问真实系统登录后还能正常跳转到内网首页不会出现“表单提交后白屏”这种穿帮情况。如果目标站点开了双因子验证短信验证码或动态口令同样会被 Evilginx3 实时中继真实系统那边校验通过它这边也同步把验证码记下来了。这就是 Evilginx3 和传统静态克隆页的本质区别它拿到的不只是一张表单截图而是一整套真实凭证和真实会话。这也是为什么很多安全测评报告里中间人钓鱼被列为当下 ATO 攻击的主流形态。1.3 两个工具的合理分工Gophish 和 Evilginx3 不是替代关系而是组合关系。Gophish 负责人员导入、邮箱投放、结果统计Evilginx3 负责 lure 页面、凭证捕获和会话转发。完整的攻击链路是这样的邮件由 Gophish 发出员工点击链接Gophish 侧按需记录一次点击事件然后跳转到 Evilginx3 的 lure 地址Evilginx3 代理真实站点捕获凭证和 cookie再把结果回传给 Gophish 或者你自己的数据中心。这里最关键的是把两个系统的事件流程串起来而不是简单地把两个工具装在同一台服务器上。下一节先讲 Evilginx3 侧的定制再讲联动设计。2. phishlet 定制决定钓鱼页“活性”的核心2.1 默认 phishlet 远远不够用Evilginx3 本身带了不少现成 phishlet社区仓库里也能找到各大常见平台的配置。但用现成的 phishlet 直接上目标你会很快撞见几个现实问题目标站点的登录表单带了 CSRF token、页面是纯 JS 渲染的 SPA、登录成功后的跳转链接是相对路径、静态资源走了 CDN 导致代理页面上出现大量 404。这些问题统一指向一个核心 phishlet 不是一个“配置开关”而是一套 HTML 重写规则。你得把真实站点在代理链路上的表现调到和直接访问一致才谈得上逼真。2.2 字符串替换与子过滤器的理解一套 phishlet 的核心配置大概长这样不同版本字段会有差异以你的实际版本为准# custom_sso.yaml节选仅作示意 hostname: login.real-target.example.com phish_title: Sign in to your account sub_filters: - action\/login\: action\https://lure.company-sso.example.com/login\ - href\/assets/: href\https://lure.company-sso.example.com/assets/ replacements: - csrf_token: csrf_token_x credentials_user: username credentials_param: passwordsub_filters的作用是告诉 Evilginx3 在从上游返回的 HTML 里把关键字符串替换成代理域名尤其是表单提交地址和静态资源地址。不替换的后果很直接表单 action 还指向真实域名用户提交时浏览器直接跑到真实站点去Evilginx3 什么都截不到。replacements则是更灵活的正则替换可以用来处理跳转逻辑和页面里的内联脚本。实操里我建议先用 curl 把上游登录页完整拉下来逐个检查表单 action、资源前缀、内联 JS 里的绝对 URL再写替换规则不要图省事做全量替换否则很多脚本会被误伤页面表现会很奇怪。2.3 动态渲染页面怎么办如果目标登录页是 Angular/Vue 这类 SPA字符串替换只能解决资源路径不能解决动态渲染。浏览器执行完 JS 之后表单结构才真正生成这时候替换规则根本没机会处理。我的做法是给真实页面注入一段 hook 脚本在页面加载完成后主动监听输入框内容变化并把值上报。用 phishlet 的注入能力把自定义 JS 写进响应体即可脚本里选一个表单加载完成的时间点把username和password字段的input事件转发给 Evilginx3 的凭证捕获逻辑。这里要注意的是注入脚本的触发时机太早执行会因为元素未渲染而取不到值需要加轮询或者DOMContentLoaded之后延迟执行。2.4 证书与域名一个最常见的影响逼真度的环节lure 域名必须配有效 TLS 证书这没什么好商量的。浏览器地址栏的证书报错和红色警告对逼真度是毁灭性的。我习惯用 Lets Encrypt 申请通配证书用 DNS-01 验证方式提前签发好这样后续上线新子域不需要重新验证certbot certonly --manual --preferred-challenges dns \ -d lure.company-sso.example.com申请完证书后把它配置到 Evilginx3 的对应 lure 配置里。有一个坑要提醒你证书续期任务别忽略。Evilginx3 自己不会帮你续证书如果某一天演练还没结束证书到期了浏览器会立刻给出警告整个演练就穿帮了。另外如果你在 l4 层启用了 CDN 或 WAF 流量清洗务必确认它不会改写上游返回的 HTML。很多云端 WAF 默认会重新压缩或者注入自己的脚本这在 Evilginx3 场景里会破坏替换规则的精准性。实战里我通常会关闭这类流量清洗或者只在源站层面做安全组控制。2.5 一个容易被忽略的细节登录后的跳转很多 phishlet 只关注登录页不关心登录后的跳转。真实系统登录成功后往往会把用户带到 dashboard 或首页如果 Evilginx3 对后续请求处理不当用户会发现登录后页面停在空白页或者跳回登录页这时候警惕心会立刻拉满。所以定制 phishlet 时建议把上游站点的登录后首页也纳入代理范围确认 cookie 能被持续转发让整个浏览过程从头到尾都“能用”。这比只做一张表单难一些但正是这种细节决定员工是否真的会填第二次验证码。3. Gophish 与 Evilginx3 的联动链路设计3.1 让用户标识跨系统流动两个工具分开部署之后第一个要解决的是统计口径Gophish 知道发了哪些人Evilginx3 知道你收到了谁的凭证中间怎么对应起来我的方案很简单让 lure 链接自带用户标识。在 Gophish 邮件模板里按钮地址不写成固定的https://lure.company-sso.example.com/signin而是拼上这个员工的唯一 IDhttps://lure.company-sso.example.com/signin?ref{{.Id}}Gophish 模板引擎渲染时每个员工收到的链接都带着自己的 ID。Evilginx3 的访问日志里能看到ref参数配合它自带的 webhook 或日志接收器就能把“谁在什么时间访问了 lure”完整还原出来。如果连提交凭证的用户名也要和员工 ID 对应建议在 lure 域名上加一层短链参数映射或者干脆把员工 ID 放在路径里。别小看这个设计没有它演练结束后你会面对一堆凭证字符串却不知道是谁交出来的。3.2 由 Gophish 管投放由 webhook 管回收Gophish 的核心职责是用户分组、发信和投递状态统计。实际部署中我把它的 Campaign 作为“邮件投放任务”看待不依赖它内置的 landing page 记录点击而是让它作为上游调度器。Evilginx3 捕获凭证后通过 webhook 把事件推给你的接收端。最简单的接收端就是一个 Flask 或者 Node 服务收到事件后调用 Gophish API 把结果写回curl -X GET \ https://phish-server.example.com/api/campaigns/3/results \ -H Authorization: Bearer ${GOPHISH_API_TOKEN}这里要强调的是建议你自己写一个简单的回填脚本因为 Gophish 自带的结果字段不一定能表达“已捕获有效凭证”和“只是点了链接”的差异。把 Evilginx3 捕获到的凭证状态映射到 Gophish 的status字段上报告会干净很多。补充一句Evilginx3 的凭证捕获日志默认是按时间戳存的如果你在一场演练里同时打多个 lure务必在配置里把每个 lures 的访问日志区分开归并日志是演练结束后最耗时的活。3.3 邮件投递质量决定了你能触达多少人说实话很多演练不是栽在页面环节而是栽在邮箱网关。如果你用的是一个小域名、刚注册两周、没有 SPF/DKIM/DMARC 记录大部分目标企业的邮件网关会直接隔离或者拒收。所以邮件投递缓存这一块我一般做三件事提前 2-4 周注册并“养”发送域名期间用真实业务口吻发一些正常邮件让域名积累基础信誉配全 SPF、DKIM、DMARCDKIM 签名务必正确很多邮件网关对 DKIM 校验失败会直接退信分批次发送而不是一次性全量发避免同一个 IP 在短时间内产生大量退信损耗发送者信誉。另外邮件内容要尽量本地化落到具体的人和具体的事上。安全团队早就把“账号异常登录”这类词加入关键词规则了模板写得太模板化邮件根本到不了员工的收件箱。3.4 并发和去重别把演练做成攻击演练和真实攻击有一个重要区别真实攻击可以无节制地扫描、重试、扩大目标演练则必须控制影响面。我建议分批投放例如每天只给 200-300 人发邮件目标系统上出现异常的密度要控制在安全团队能够接受的范围避免对真实业务系统和 IdP 造成压力。这里还有一个去重细节同一个员工可能在一天内点多次链接。webhook 回收时要以员工 ID 为单位做去重记录“第一次点击时间”和“最后一次提交时间”而不是把每次点击都算新事件。否则演练报告里的数据会虚高蓝队也会觉得你们在刷量。4. 反检测让流量更像真实用户而不是自动收集器4.1 会被哪些低等级检测拦下来很多演练样本不是被人的分析拦下来的而是被基础设施层面的自动检查拦下来的。我总结过最常见的三类沙箱和无头浏览器安全分析平台用 Headless Chrome 或 Selenium 访问链接检测页面里是否有钓鱼特征然后丢给 urlscan 这类在线沙箱做截图主动扫描器和威胁情报平台对 lure 域名做主动探测拉取证书、请求根路径、访问常见路径比对域名年龄和信誉库TLS 指纹和协议栈检查部分安全网关会对 HTTPS 流量做 JA3/JA4 指纹比对如果指纹和常见浏览器不一致命中可疑标记。这些检测不会直接判定你“恶意”但会让你的域名迅速进入低信誉名单后续再发邮件就非常吃亏。4.2 落地过的一组反检测手段我常配置的一组规则如下大概可以描述为“对不同的来访请求给出不同的回答”。请求特征判定倾向我的响应策略curl、wget、非浏览器 UA扫描器/脚本直接返回 404 或空白页HeadlessChrome、phantomjs、webdriver沙箱/爬虫返回真实站点首页或 302 到无害页面普通浏览器 UA、真实 JS 执行真实用户返回 lure 页面高频目录枚举路径扫描器返回 404并限制 IP 频率具体到实现非浏览器 UA 和路径枚举这类规则我放在 Nginx 前置层处理不需要 Evilginx3 参与。Nginx 配置里简单判一下$http_user_agent匹配到已知爬虫特征就return 404;能挡住至少七成的扫描流量。另外一个成本不高但很有效的做法是在 lure 页面里注入一段 JavaScript 检测脚本if (navigator.webdriver || !window.chrome || navigator.userAgent.includes(HeadlessChrome)) { window.location.href /normal-home; }这段脚本命中沙箱或自动化浏览器时立刻把跳转改成普通页面在线沙箱截到的图就会变成无害内容。4.3 延迟渲染让沙箱“等不起”沙箱的一大弱点是等待耐心非常有限大部分沙箱只会等 5-15 秒。利用这一点可以在 lure 页面里把登录表单的渲染延迟 8-10 秒前端先显示一个 loading 动画再做表单渲染。真实用户会等一下但沙箱大概率在表单生成前就完成了截图和 DOM 分析。这个技巧在真实攻击里很常见但在演练里同样有价值。它能让你的样本在 urlscan 里截不到关键表单从而降低被标记的概率。4.4 Nginx 前置反代解决 TLS 指纹差异Evilginx3 默认用 Go 的标准库处理 TLSJA3 指纹和主流浏览器差别比较大对防御水平较高、接了 TLS 指纹检测网关的企业这个差异会成为可疑标记。我在实战中通常在 Evilginx3 前面加一个 Nginx由 Nginx 终结 TLS再把流量转发给 Evilginx3 端口server { listen 443 ssl http2; server_name lure.company-sso.example.com; ssl_certificate /etc/letsencrypt/live/lure.company-sso.example.com/fullchain.pem; ssl_certificate_key /etc/letsencrypt/live/lure.company-sso.example.com/privkey.pem; location / { proxy_pass http://127.0.0.1:8080; proxy_set_header Host $host; proxy_set_header X-Forwarded-For $remote_addr; proxy_set_header X-Forwarded-Proto $scheme; } }这样能让 TLS 指纹更接近常见的 Nginx 站点而不是暴露 Go HTTP 服务器的特征。同时Nginx 前置层也方便挂对手动扫描器、路径枚举等自动化流量做拦截不用在 Evilginx3 里写一堆分支逻辑。4.5 节奏也是反检测的一部分还有一个经常被忽略的点新域名上线后不要立刻铺开发送。先注册域名建好证书放一个正常的静态页面养 1-2 周期间用这个小域名发一些完全无害的测试邮件等它在公开 DNS 和邮件信誉库里的记录有了一定基础再做正式投放。同时lure 服务器的访问频率要控制。Evilginx3 的日志里如果出现同一个 IP 短时间反复请求多个 lure说明你的域名可能已经被情报平台拉进扫描队列了。这时候要么换域名要么暂停两天再继续。5. 演练反过来指导防御ATO 检测与加固清单5.1 从演练数据里提炼 ATO 指标一场演练结束除了报告“多少人点了链接、多少人提交了密码”更值钱的是那些被安全团队忽略的异常事件。我习惯把 Evilginx3 记录的访问日志和真实业务日志做交叉分析重点关注这几个指标同一个 IP 在短时间内登录了多个不同账号同一个 UA 指纹出现在多个会话中用户在“登录成功”后的访问行为和平时的工作时段、常用设备差异很大2FA 验证码被输入后又迅速重放间隔通常只有几秒。这些指标本身也是真实账户接管攻击的典型行为。把演练样本导入 SOC 的告警规则可以有效补齐检测盲区。5.2 蓝队怎么反向识别这种代理钓鱼从防御角度看判断一个访问是不是 Evilginx3 这类代理框架发出的有几个切入点证书透明度日志的主动监控。在 crt.sh 上跑一个定时任务对近似域名做模糊匹配凡是新出现的证书绑定到陌生 IP 的一律人工确认。lure 域名必须配证书这一步能发现至少一半的钓鱼基础设施。客户端指纹的异常度评分。给登录请求标注浏览器指纹可信度数据中心 IP、非常见语言包、TLS 指纹异常组合在一起风险分数会非常高。登录后的 Cookie 重放检测。真实用户从一个网络环境切换到另一个通常会有时间和地理上的逻辑一致性Cookie 在几秒内出现在两个不同 IP 上基本可以判定为会话被转发。邮件网关的链接信誉策略。对邮件中出现的链接做实时信誉查询结合域名年龄、发件域名一致性、DMARC 结果在链接被点击前就做隔离。5.3 演练后的加固清单每次演练结束后我会向客户交付一份参考清单内容大致包括对点击过 lure 且输入过真实密码的员工立即强制重置密码并在一周后复查防止演练产生的真实凭证被用于后续攻击对高风险且频繁访问敏感系统的账号启用条件访问策略新设备登录必须走设备合规检查邮件安全方面把新建域名、低信誉域名链接启用 URL 重写和点击时隔离对 DKIM 校验失败的邮件标记为可疑身份侧启用异常登录的风险评分对跨地域跳跃、新设备、深夜访问等行为做自动化阻断。这套清单的价值在于把一次模拟攻击的发现真正转化成可量化的安全能力提升。演练不是目的让演练结果推动防御改进才是关键。最后再分享一点个人经验Evilginx3 和 Gophish 的组合最难的不是装起来而是你愿意花多少时间去打磨细节。页面活性、动态渲染处理、邮件投递质量、日志对应关系每一个环节偷懒都会在演练中途某个时间点以穿帮的形式反馈给你。反检测的思路也一样它不是让你变成隐形人而是把你的样本从“一眼假”推进到“需要蓝队认真分析才能判定”的水平。这个水平线才是演练的真实价值所在。
02
RELATED NEWS

相关资讯

更多网站建设与数字化升级内容

03
WHY YAOTU

想打造同款高转化官网?

懂行业、懂生意,从建站到增长一站式陪跑

◈

场景化定制

不做模板站,围绕你的业务场景量身设计,小众不撞款。

◐

营销型架构

以转化目标组织内容与路径,让官网真正带来询盘。

▲

全周期服务

设计、开发、运营、运维一体,上线只是开始。

免费获取你的建站方案

留下需求,专属顾问 24 小时内为你输出方案建议。