Evilginx2中间人攻击:如何绕过双因素认证并窃取会话Cookie

Evilginx2中间人攻击:如何绕过双因素认证并窃取会话Cookie
1. 项目概述当双因素认证遇上“中间人”在网络安全领域双因素认证2FA长期以来被视为账户安全的“金钟罩”。它要求用户在输入密码之外再提供一项只有本人才拥有的凭证比如手机上的动态验证码、硬件令牌或生物特征。这个设计初衷是好的即使密码泄露攻击者没有第二重凭证依然无法得逞。然而安全攻防从来都是一场永不停歇的猫鼠游戏。当防御者筑起高墙时攻击者便开始寻找墙上的裂缝甚至直接伪造一扇“城门”。Evilginx2 正是这样一把专门针对“城门”的钥匙。它不是一个简单的钓鱼页面生成器而是一个高度自动化的中间人攻击框架。它的核心思路非常巧妙与其费力去破解或绕过2FA不如在用户完成整个认证流程时悄无声息地“坐在”用户与真实服务之间把两端的通信都接下来。用户以为自己成功登录了Gmail、LinkedIn或Microsoft 365实际上他们的用户名、密码以及最关键的——登录成功后服务器颁发的会话Cookie都流经了攻击者控制的服务器并被完整截获。有了这个会话Cookie攻击者就可以在用户不知情的情况下以用户的身份直接访问其账户2FA形同虚设。我第一次接触到这类技术时深感震撼。它颠覆了传统钓鱼攻击“一次性窃密”的模式实现了对会话的“持续性劫持”。对于安全研究人员和渗透测试工程师而言理解Evilginx2的工作原理是深入理解现代Web认证体系脆弱性的绝佳途径。这不仅能帮助我们设计更安全的系统也能让企业意识到仅依赖2FA并不足以应对所有威胁。本指南将深入拆解Evilginx2的架构、部署细节、实战应用以及背后的防御思考无论你是想提升防御视野的安全工程师还是在进行授权测试的渗透测试员都能从中获得扎实的实操知识。2. Evilginx2 核心架构与工作原理拆解要有效防御或理解一种攻击必须先吃透它的运作机制。Evilginx2 的优雅之处在于其清晰的架构设计它完美地模拟了用户在正常登录过程中与网站服务器的所有交互环节。2.1 中间人攻击的精髓代理与镜像传统网络钓鱼就像伪造一个银行的ATM机放在路边等着人上钩。用户插入卡片、输入密码机器记录下信息然后吐出一张“机器故障”的纸条。这种攻击的缺点是显而易见的伪造的页面可能粗糙且一旦用户发现没有真正登录成功可能会立即警觉并修改密码。Evilginx2 则采用了更高级的“代理”模式。想象一下攻击者在用户去往真实银行的必经之路上开设了一家外观、内饰、乃至柜员都与真银行一模一样的“镜像银行”。用户走进来办理所有业务——存款、取款、修改密码一切都感觉无比正常。用户离开时心满意足。但他不知道的是这家“镜像银行”在后台同步将他所有的业务请求和凭证都转发给了隔壁街区的真实银行办理同时把真实银行的回应原样带回。对于用户和真实银行来说业务都完成了但对于“镜像银行”的经营者攻击者来说用户的所有秘密包括开保险箱的密码会话Cookie他都看得一清二楚。在技术层面Evilginx2 实现这一点的核心是一个高度定制化的 Nginx 服务器。它扮演了这个“镜像银行”的角色。当用户访问攻击者设定的钓鱼域名如secure-login.linkedin.yourowndomain.com时Evilginx2 会接收请求监听80/443端口接收用户的HTTP/HTTPS请求。动态请求转发将用户的请求包括登录表单提交、API调用等几乎实时地转发给真正的目标网站如www.linkedin.com。响应处理与篡改接收来自真实网站的响应然后进行关键性的处理修改其中所有的链接和域名引用将它们指向攻击者控制的钓鱼域名确保用户在站内的后续浏览流量依然经过Evilginx2。凭证与Cookie捕获在整个代理过程中Evilginx2 会像筛子一样过滤所有经过的数据流。当用户提交登录表单时它捕获用户名和密码当真实网站返回响应并在其中设置会话Cookie通常是通过Set-Cookie头时Evilginx2 会将其完整地保存下来然后再将这个Set-Cookie头原样返回给用户的浏览器。这样用户的浏览器会认为自己正在与真实的LinkedIn通信并愉快地保存下这个“有效”的会话Cookie。而这个Cookie正是攻击者梦寐以求的“万能钥匙”。2.2 Phishlet攻击的场景化剧本Evilginx2 的强大之处在于其模块化设计。它并不针对某个具体网站硬编码攻击逻辑而是通过一种名为Phishlet的配置文件来定义攻击行为。你可以把 Phishlet 理解为一个针对特定网站如 Gmail、Office 365、Facebook的“攻击剧本”。一个典型的 Phishlet 文件YAML格式会包含以下核心信息目标主机名要冒充的真实网站域名。代理配置定义哪些路径如/login,/auth需要被代理转发哪些静态资源如图片、CSS可以直接从本地或真实站点获取以提高性能。凭证捕获点指定登录请求提交的URL路径、方法POST/GET以及请求体中用户名和密码字段的名称如username,password。Cookie 捕获规则定义需要窃取哪些关键的Cookie名称如SESSION,SSID。这些Cookie通常标记了用户的登录状态。域名映射与伪装如何将真实域名linkedin.com的子域名映射到攻击者的钓鱼域名上使得accounts.linkedin.com的流量被导向accounts.linkedin.phishdomain.com。通过编写或使用现成的Phishlet攻击者可以快速地将Evilginx2武器化针对数十种主流云服务和社交平台发起精准攻击。这种灵活性使得防御变得困难因为攻击面不再是一个固定的钓鱼页面而是一个能够动态适应目标网站结构的代理系统。注意Phishlet的编写需要对目标网站的登录流程有深入理解需要分析其网络请求、重定向逻辑和Cookie使用方式。错误的配置可能导致钓鱼失败或容易被识破。2.3 自动化与隐匿内置的HTTP/DNS服务器为了让整个攻击链更加平滑和自动化Evilginx2 还内置了必要的服务组件HTTP/HTTPS 服务器基于修改版Nginx处理Web流量。DNS 服务器这是实现无缝钓鱼的关键。攻击者需要控制一个域名例如evil.com并将其DNS解析指向自己的服务器。Evilginx2内置的DNS服务器可以动态响应查询。例如当Phishlet配置为捕获login.microsoft.com的流量时Evilginx2 可以配置DNS使得任何对login.microsoft.evil.com的查询都返回攻击者服务器的IP地址。对于用户而言他们访问的域名看起来非常可信包含了微软的真实子域名极大地降低了警惕性。这种一体化的设计使得部署一个功能完整的钓鱼环境变得异常简单几乎是一条命令的事情极大地降低了攻击的技术门槛。3. 环境搭建与实战部署详解理解了原理我们来看看如何亲手搭建一个用于授权安全测试的Evilginx2环境。再次强调以下所有操作必须在完全可控、隔离的测试环境如本地虚拟机、拥有完全权限的VPS中进行且仅用于法律允许的教育和研究目的。3.1 服务器准备与域名配置你需要一台拥有公网IP的服务器。对于测试我推荐使用DigitalOcean、Linode或Vultr等VPS提供商最基础的套餐约5美元/月选择Ubuntu 22.04 LTS或Debian 11系统。第一步获取并配置域名注册一个域名。Namecheap、GoDaddy或国内的阿里云、腾讯云都可以。选择一个看起来不那么可疑的普通域名。在域名管理后台设置自定义DNS服务器Nameserver。你需要创建至少两个NS记录指向你的VPS服务器ns1.yourdomain.com-你的VPS公网IPns2.yourdomain.com-你的VPS公网IP这个过程可能需要几小时到48小时全球生效请耐心等待DNS传播。第二步服务器基础环境配置通过SSH登录你的VPS进行以下操作# 更新系统 sudo apt update sudo apt upgrade -y # 安装必要的工具 sudo apt install -y git curl wget # 由于Evilginx2需要监听53端口(DNS)、80端口(HTTP)、443端口(HTTPS)确保这些端口未被占用。 # 停止可能冲突的服务 sudo systemctl stop systemd-resolved sudo systemctl disable systemd-resolved # 编辑 /etc/systemd/resolved.conf设置 DNSStubListenerno然后重启systemd-resolved或直接重启服务器。重要提示在云服务器上确保防火墙如UFW或云服务商的安全组规则允许TCP 80、443和UDP 53端口的入站流量。3.2 Evilginx2 的安装与初始化这里我们选择从源码编译安装以便获得最新的特性和更好的控制。# 1. 安装 Go 语言环境 (版本 1.19) wget https://go.dev/dl/go1.21.0.linux-amd64.tar.gz sudo tar -C /usr/local -xzf go1.21.0.linux-amd64.tar.gz echo export PATH$PATH:/usr/local/go/bin ~/.profile source ~/.profile go version # 验证安装 # 2. 获取 Evilginx2 源码 git clone https://github.com/kgretzky/evilginx2.git cd evilginx2 # 3. 编译 make # 编译成功后会在当前目录生成 bin/evilginx 可执行文件。 # 你可以选择全局安装或直接运行当前目录的二进制文件。 # 全局安装 sudo make install # 之后就可以在任何位置使用 evilginx 命令。 # 4. 首次运行与基础配置 # 以root权限运行因为需要绑定53等特权端口 sudo ./bin/evilginx # 或者如果全局安装了 sudo evilginx # 进入Evilginx2的交互式命令行界面后进行初始配置 config domain yourdomain.com config ip 你的VPS公网IP # 例如config domain test-lab.net, config ip 192.0.2.100至此Evilginx2的核心服务就运行起来了。它现在正在监听53DNS、80HTTP、443HTTPS端口。3.3 配置Phishlet并发起测试攻击假设我们想测试针对一个模拟登录页面的攻击。Evilginx2自带了一些示例Phishlet。我们以其中一个为例进行演示。列出可用Phishlet在Evilginx2命令行中输入phishlets会显示phishlets目录下所有可用的剧本。配置钓鱼主机名我们需要为选定的Phishlet指定一个子域名。这个子域名将是我们钓鱼链接的一部分。# 语法phishlets hostname phishlet_name phishing_hostname phishlets hostname linkedin accounts.linkedin.test-lab.net这条命令告诉Evilginx2当有人访问accounts.linkedin.test-lab.net时就启动针对LinkedIn的钓鱼剧本。启用Phishlet并获取证书phishlets enable linkedin执行此命令后Evilginx2会尝试为accounts.linkedin.test-lab.net自动申请Let‘s Encrypt的免费SSL证书。成功后会显示证书信息。HTTPS是钓鱼成功的关键现代浏览器对非HTTPS网站会显示“不安全”警告极易引起怀疑。生成钓鱼链接phishlets get-url linkedin https://www.google.com这条命令会生成一个长长的、带有令牌的URL。这个URL就是发给“受害者”的钓鱼链接。当用户点击这个链接会被带到我们的钓鱼代理。参数中的https://www.google.com是“着陆页”即当用户完成或尝试完成登录后会被重定向到的地址通常设置为一个无害的页面如谷歌搜索页以减少用户疑虑。监控捕获结果在Evilginx2命令行中使用sessions命令可以查看所有捕获到的会话列表。每个会话有一个ID。使用sessions id可以查看该会话的详细信息包括捕获的凭证、所有的Cookie以JSON格式展示以及时间戳、用户IP等元数据。此时如果你将生成的钓鱼链接发送给测试目标必须是完全知情并同意的测试人员当他在浏览器中打开链接输入用户名密码甚至2FA验证码后他的所有凭证和会话Cookie就会出现在你的sessions列表中。4. 深度解析Evilginx2如何精准绕过双因素认证这是整个框架最精妙的部分。很多人疑惑2FA验证码是一次性的而且通常只在登录时有效Evilginx2是如何得手的关键在于它窃取的不是2FA代码本身而是2FA验证成功后服务器颁发的那个“通行证”。4.1 会话Cookie身份验证的“临时身份证”现代Web应用在用户成功登录包括通过2FA验证后服务器不会让客户端在每次请求时都重新验证密码和2FA。那样体验太差。取而代之的是服务器会生成一个会话Cookie可能叫sessionid,token,SSID等发送给用户的浏览器。这个Cookie就像一张盖了章的“临时身份证”在接下来的一段时间内比如几小时或几天浏览器只要在每次请求时出示这张“身份证”服务器就认为你是已经通过完整身份验证的合法用户。Evilginx2的攻击目标正是这张“临时身份证”。4.2 攻击流程全景再现让我们结合一个具体的例子如Microsoft 365登录来拆解整个攻击链用户收到钓鱼链接链接指向login.microsoftonline.com.evil.com。由于子域名包含login.microsoftonline.com用户警惕性下降。DNS解析与连接建立用户的浏览器查询login.microsoftonline.com.evil.com的IP。由于攻击者控制了evil.com的DNS并指向自己的Evilginx2服务器浏览器最终连接到攻击者的服务器。HTTPS握手Evilginx2 出示了为login.microsoftonline.com.evil.com申请的合法Let‘s Encrypt证书浏览器显示绿色小锁连接安全。代理登录页面Evilginx2 将请求转发给真正的login.microsoftonline.com获取登录页面HTML然后修改其中所有的链接和表单提交地址使其指向自己的域名再将修改后的页面返回给用户。用户看到一个与真实登录页一模一样的界面。窃取第一重凭证密码用户输入邮箱和密码点击登录。这个POST请求被发送到Evilginx2。Evilginx2 捕获其中的邮箱和密码字段同时将请求转发给微软的真实服务器。代理2FA挑战真实服务器返回响应要求进行2FA例如发送验证码到手机。这个响应经过Evilginx2修改后返回给用户。用户在自己的手机上收到验证码。窃取第二重凭证2FA代码及会话Cookie用户在钓鱼页面上输入收到的6位数验证码并提交。Evilginx2 再次捕获这个代码并将其转发给真实服务器。最关键的一步此时真实服务器验证密码和2FA代码均正确认为用户是合法的。于是它生成会话Cookie例如一个名为ESTSAUTH的长字符串通过Set-Cookie响应头发送给客户端同时返回一个登录成功的重定向比如跳转到Outlook邮箱首页。Evilginx2的丰收时刻Evilginx2 拦截到这个响应。它做两件事保存Cookie将Set-Cookie头中的完整会话Cookie值保存到自己的数据库中。转发响应将这个包含Set-Cookie头的响应以及跳转到Outlook首页的指令原封不动地返回给用户的浏览器。用户视角用户的浏览器收到了Set-Cookie指令保存了这个会话Cookie。然后根据重定向指令跳转到了outlook.office.com同样经过Evilginx2的域名伪装。用户看到了自己的收件箱一切正常登录成功。他毫无察觉。攻击者视角在Evilginx2的sessions界面攻击者看到了一个新会话里面包含了用户的邮箱、密码虽然可能已经没用了以及最重要的——那个有效的ESTSAUTH会话Cookie。4.3 利用窃取的Cookie实现账户接管攻击者现在可以打开一个全新的浏览器或使用Cookie编辑插件将窃取到的ESTSAUTHCookie直接植入。然后访问outlook.office.com。服务器看到这个Cookie就会认为这是来自合法用户的浏览器直接授予其完全的邮箱访问权限无需再次登录也完全绕过了2FA。这个过程之所以能成功是因为2FA验证的是“登录”这个动作而Cookie代表的是“登录后的状态”。Evilginx2 窃取的是“状态”而不是去破解“动作”的验证。这就是所谓的“中间人”攻击它没有破坏认证流程而是完整地参与了流程并从中窃取了果实。5. 防御策略与安全加固指南了解了攻击的犀利我们更迫切地需要知道如何防御。防御Evilginx2这类高级钓鱼攻击需要从技术、流程和意识三个层面构建纵深防御体系。5.1 用户层面提升警惕与验证习惯用户是第一道也是最后一道防线。再好的技术也可能被一个疏忽击穿。永远检查URL养成在输入敏感信息前仔细检查浏览器地址栏的习惯。警惕那些包含真实品牌名但域名主体不对的URL如login.paypal.secure-service.com。确保你访问的是官方域名。使用密码管理器优秀的密码管理器如Bitwarden、1Password通常具有域名检测功能。如果你保存的密码对应的网站域名与当前访问的域名不匹配密码管理器不会自动填充。这能有效阻止在钓鱼网站上自动输密码。对未预期的登录请求保持怀疑如果你收到了登录请求或2FA验证码但自己并未操作应立即意识到账户可能正在被尝试入侵。不要批准该请求并立即修改密码。利用硬件安全密钥WebAuthn/FIDO2硬件密钥如YubiKey是防御此类钓鱼的终极武器。因为认证过程依赖于密码学挑战-响应且与具体的网站域名RP-ID绑定。即使你在gmail.evil.com上插入了YubiKey它也无法为真正的gmail.com生成响应。浏览器和密钥会直接拒绝。5.2 企业与管理层面实施强技术控制对于企业IT和安全团队应采取更主动的防御措施部署防钓鱼多因素认证积极推动使用基于FIDO2/WebAuthn的硬件密钥或生物识别。如果条件不允许使用推送通知认证App如Microsoft Authenticator、Duo也比短信验证码好因为App通常会显示登录请求的地理位置和设备信息供用户判断。实施条件访问策略利用Microsoft Entra IDAzure AD、Okta等身份平台的“条件访问”功能。可以制定策略例如阻止从陌生国家、陌生IP段登录。要求从公司网络外登录时必须使用合规设备或硬件密钥。对高风险登录行为如短时间内地理跳跃要求二次验证。网络与终端防护DNS安全部署DNSSEC并考虑使用DNS过滤服务阻止员工访问已知的恶意或钓鱼域名。邮件安全网关配置高级反钓鱼策略检测并隔离包含欺骗性链接、相似域名的邮件。终端检测与响应在员工设备上部署EDR软件监控并阻止可疑的进程行为如未知代理工具。安全意识定期培训与模拟钓鱼定期对员工进行安全意识教育并通过专业的模拟钓鱼平台如KnowBe4开展测试。让员工亲身体验一次高仿真的钓鱼攻击比十次理论培训都有效。测试后要及时给予反馈和指导。5.3 开发者层面构建更安全的认证系统应用和服务的开发者也能从架构上增加攻击难度绑定用户代理与IP在颁发会话Cookie时可以将其与用户首次登录时的User-Agent字符串、IP地址或IP段进行弱绑定。当检测到Cookie来自差异巨大的环境时要求重新进行部分认证如输入密码。使用短期会话与频繁重认证对于高权限操作如修改密码、财务交易强制要求近期内重新输入密码或进行2FA验证即使会话仍然有效。实施严格的同源策略和Cookie安全属性为Cookie设置HttpOnly属性防止通过JavaScript窃取虽然Evilginx2作为中间人能直接看到HTTP头但这个属性能防御其他XSS攻击。设置Secure属性确保Cookie仅通过HTTPS传输。考虑使用SameSiteStrict或Lax属性这能限制第三方网站发起的跨站请求携带Cookie但对Evilginx2这种完全代理了第一方流量的攻击效果有限。监控异常登录模式在服务端建立用户行为基线监控异常登录如新设备、新地点、异常时间。发现异常时可以主动使旧会话失效并通过备用联系方式通知用户。防御Evilginx2这类攻击没有银弹它考验的是一个组织综合的安全成熟度。核心思路是增加攻击者的成本和不确定性。通过层层设防即使攻击者突破了某一层如通过钓鱼获取了凭证后续的防御层如条件访问、硬件密钥、异常检测也能及时阻止或发现入侵将损失降到最低。