Arcanum-Sec/wraith

GitHub: Arcanum-Sec/wraith

WRAITH 是一款将 BeEF 式浏览器 hook 后渗透控制与 blind-XSS 回调战利品收集合二为一的现代红队浏览器 hook 框架。

Stars: 0 | Forks: 0

# WRAITH — 浏览器 hook 框架 **一个现代化、独立的浏览器 hook 框架,专为红队、安全研究人员和教育工作者设计——它是 BeEF 以及我们赖以生存的 blind-XSS 回调工具的净室(clean-room)继承者。** ## 为什么开发它 在 **Arcanum** 的工作过程中,我们经常需要使用两种不同的工具,并希望它们能合二为一。 一方面是 **BeEF**——浏览器利用框架——用于经典的*hook 浏览器,然后从其会话内部进行操作*的工作流程:记录伪造登录页面的键盘输入、对本地网络进行侦察、向实时受害者推送模块。这是我们在课堂上用来向人们展示浏览器中间人攻击(man-in-the-browser)真实感的工具。但它已经显出老态,其中很大一部分在当今的浏览器中已经不可靠,而且它的社会工程学覆盖层看起来就像是十年前的登录界面。 另一方面是我们最喜欢的 **blind-XSS 回调框架**(XSS Hunter、ezXSS):将 payload 投入输入框中,当它在你看不到的某个地方触发时,它会自动连回服务器并带回“战利品”——来源、cookie、DOM、屏幕截图。 我们越来越需要的是——尤其是当我们的目标越来越多地成为 **AI 应用生态系统**时,在这些系统中,不受信任的文本流经代理、工具输出、管理员审查队列和支持控制台,并*在没人监视的地方执行 JavaScript*——一个能同时实现**两者**的单一框架:具备 BeEF hook 那种交互式、持久化的后渗透控制能力,**同时**也能像即发即弃的 blind-XSS 回调那样收集“战利品”,合并在一个在当前浏览器中可靠运行、且看起来像当今真实登录界面的 payload 中。 所以我们开发了 **WRAITH**。 ## 提前预警:工作正在进行中 我们**提前发布**了 WRAITH,而且这是故意的。我们宁愿把它交到那些真正会用它进行教学和测试的人手里——听听有什么问题——也不愿一直把它藏着掖着,直到它“完成”。 这意味着:**预计会有粗糙的边缘和 Bug。** 有些模块比其他模块经过了更多的实战检验,浏览器行为经常在我们眼皮底下发生变化(见下文的网络扫描说明),并且 API 可能会在版本之间发生变化。如果你遇到了问题,请提交一个 issue——复现步骤、浏览器 + 版本以及你的预期结果对我们来说非常宝贵。 欢迎在项目的[贡献条款](#license--attribution)下提交 PR。 ## 快速开始(Docker) 最快的途径。你需要 Docker + Docker Compose。 ``` git clone https://github.com/Arcanum-Sec/wraith cd wraith ./setup.sh ``` `setup.sh` 会引导你完成所有步骤: 1. **检测你的公网 IP**(或让你输入一个域名 / 自定义主机),以便每个 hook 和 payload URL 都使用*你的*地址生成。 2. 让你为控制台登录**设置一个操作员用户名 + 密码**。 3. 生成会话签名密钥,写入一个被 gitignore 忽略的 `.env`(chmod 600),并**构建 + 启动容器**。 4. 在最后打印出你的实时 URL 和一个**直接可用的 XSS payload**: ``` Operator console : http://YOUR_IP:8090/operator/ Login page : http://YOUR_IP:8090/login (user "operator") Demo victim page : http://YOUR_IP:8090/demo/ Hook payload : http://YOUR_IP:8090/hook.js Drop-in XSS payload: "> ``` 使用标准的 compose 命令进行管理: ``` docker compose logs -f # watch it docker compose down # stop (keeps ./data) ./setup.sh # reconfigure (rotate password, change address, …) ``` 捕获的会话会持久化保存在宿主机的 `./data/` 目录中——**绝不**打包到镜像中,**绝不**被提交(`.env` 和 `data/` 已被 gitignore)。 ### 不使用 Docker 在本地运行(开发) ``` npm install npm start ``` 然后在浏览器中打开操作员控制台 http://127.0.0.1:3000/operator/ 以及演示受害者页面 http://127.0.0.1:3000/demo/(在第二个浏览器/配置文件中打开)。为了方便起见,在 localhost 上默认禁用了登录——服务器**拒绝**在没有操作员密码的情况下绑定到公共接口,因此你不会意外暴露一个开放的面板。 ## 它的功能 1. **Hook** — `/hook.js` 是一个小型 payload。将它投放在任何实验页面中(``),或者通过实验室目标中的 XSS 进行投递。加载它的浏览器会向操作员打开一个 WebSocket,并带着指纹(浏览器、OS、IP、页面、UA)出现在控制台中。它会自动重新连接并在页面跳转后继续存活。 2. **操作员控制台** — `/operator/` 显示每个被 hook 的浏览器的在线/离线状态,让你选择一个并**向其部署**覆盖层,实时流式传输受害者的**击键**以及最终**捕获的凭据**。它还附带了一个自动填充你的 hook URL 的 **XSS payload 目录**(XSS-Hunter 风格)。 3. **覆盖层模块** — 现代化的伪造登录覆盖层,在隔离的 shadow DOM 中渲染,因此它们在任何宿主页面上看起来像素级完美,并且它们会像真实的重新认证弹窗一样对背后的页面进行毛玻璃模糊处理: - **LinkedIn** — “会话已过期”重新认证 - **Facebook** — “您已登出”重新登录 - **Microsoft / Office 365** — 真实的两步验证(邮箱 → 密码) 4. **本地网络扫描**(任务模块) — 使用被 hook 的浏览器作为代理来访问受害者的**本地**服务 / LAN。经过校准的环回服务扫描,加上(如果浏览器允许)LAN 模式,以及 WebRTC 本地 IP 泄露。结果实时流式传输到控制台。 5. **页面捕获**(任务模块) — **blind-XSS** 的战利品:抓取**来源 + URL + referer**(payload 触发的位置)、受害者的 **cookie**(非 HttpOnly)、完整的 **DOM** 以及**屏幕截图**(html2canvas)。hook 在首次联系时会自动报告来源和可被 JS 读取的 cookie 数量,这反映了真实的 blind-XSS payload 回调的瞬间。 6. **页面镜像** — 从受害者的会话内部浏览其来源:*通过*被 hook 的浏览器(携带其 cookie)fetch 同源 URL,或者抓取实时的 DOM。 在 `modules/` 中添加一个模块只需要一个文件——参见 `modules/linkedin.js`(覆盖层)或 `modules/portscan.js` / `modules/capture.js`(后台任务)。 ### 内置练习实验室 挂载在 `/lab` 的是一个故意设置了存储型 XSS 漏洞节点的“支持台”,因此你可以端到端地演示整个链路,而且是同源的:提交一个恶意工单 → “客服”审查队列并且 payload 触发(blind-XSS 时刻)→ 镜像被 hook 的客服并获取一个只有在他们的认证会话*内部*才能解析的凭据库。它在设计上故意是不安全的,并包含植入的 flag。 ### 在该平台上教授 blind XSS hook 在加载的瞬间触发,就像将一个 blind-XSS payload 投放到一个存储字段中,随后该字段在某个你看不到的管理员/支持/日志/代理上下文中渲染一样。**页面捕获**就是这些框架收集的回调战利品。从数据中呈现出的课程: - **Cookie 只能被 JS 读取。** HttpOnly cookie 永远不会出现,这正是 HttpOnly 的全部意义所在。当列表为空时,查看器会说明这一点。 - **屏幕截图是尽力而为的。** html2canvas 可能会被 **CSP** 阻止,而**跨域图像会污染画布**导致其无法导出。这些失败会被如实地报告出来而不是被隐藏——它们就是这堂课的教材。 - **Origin + referer 告诉你着陆在哪里**,对于 blind XSS 来说,这是最核心的问题(“我的 payload 在哪里执行了?”)。 对于离线实验室,请自行托管 html2canvas — 参见 `public/vendor/README.md`。 ### 关于网络扫描(演示前必读) 它是一个**时序侧信道**,而不是一个真正的 socket 扫描器。JavaScript 无法读取跨域响应,但它可以发起一个请求并观察它如何失败以及失败的速度有多快,这会泄露端口状态。该模块是围绕在**当前浏览器(2025–2026)**中有效的方法重建的,因为旧的 BeEF 时代的 LAN 扫描现在行不通了。 **现代现实:** Chrome 142+(2025 年 10 月)发布了**Local Network Access (LNA)**,它将发往私有范围(10.x / 172.16.x / **192.168.x**)的请求限制在权限提示之后。盲目的 LAN 扫描再也无法触达网络。但是**环回地址(127.0.0.1)仍然是可以访问的**,而且扫描它才是现实世界中的攻击手段——eBay、Best Buy 等公司曾被发现在端口扫描访问者的 localhost,以指纹识别本地服务和远程访问工具。 因此该模块有三种模式: - **本机(localhost)** — **可靠的默认设置**。一个经过*校准*的 `127.0.0.1` 扫描,使用**两个独立的原语**探测每个端口:fetch 时序**和** WebSocket 时序(eBay 那个著名的 `check.js` 方法)。它首先探测已知的关闭端口,以了解该机器在每个通道上的 RST 基线,然后将任何解析、挂起或运行较慢的端口标记为 **OPEN**,标出可能的服务,并显示每个端口是 **fetch**、**ws** 还是**两者都**同意。目前可在 Chrome **和** Firefox 中使用。 - **LAN 主机** — 扫描单个私有 IP。只有在浏览器允许通过的情况下才有效;Chrome 142+ 通常会阻止它(模块会检测到这一点并提示说明)。 - **发现 LAN 主机** — 子网扫描。现在大部分被 LNA 阻止了;保留它是为了*展示*这种阻止作为课程教材。 **状态:** OPEN(服务应答 / socket 保持)、CLOSED(在校准基线附近的快速 RST)、FILTERED(挂起 — 仅限 LAN)、BLOCKED(浏览器拒绝的端口)。 ## 它如何映射到 BeEF(用于讲课) | BeEF | WRAITH | |---|---| | `hook.js` + XHR 轮询 | `public/hook.js` + WebSocket(实时、可靠) | | Ruby 服务器 + RESTful API | `server.js`(Node + `ws`) | | 在线/离线浏览器面板 | 操作员控制台“已 hook 的浏览器” | | Pretty Theft 模块 | 覆盖层 `modules/*.js`(现代化的 LinkedIn/Facebook/Microsoft) | | 网络发现 / 端口扫描器 | `modules/portscan.js`(经过校准,适应当前浏览器) | | 命令结果 | 实时击键 + 捕获的凭据 + 扫描结果 | | *(BeEF 没有 blind-XSS 回调)* | **页面捕获**(来源/cookie/DOM/屏幕截图) | ## “它与 blind XSS、Evilginx 或 EvilGoPhish 有什么不同?” 学生每次都会问这个问题。简短的回答是:这些工具处于**攻击的不同阶段**,并且滥用**不同的信任上下文**。它们是互补的,并且可以串联在一起。 | | WRAITH / BeEF | Blind-XSS 框架 (XSS Hunter, ezXSS) | AiTM 代理 (Evilginx, EvilGoPhish, Modlishka) | |---|---|---|---| | 它是什么 | 浏览器中间人**后渗透** C2(+ blind-XSS 战利品) | 带有一次性侦察的 XSS **检测 + 证明** | **中间人敌对代理**反向代理 | | 先决条件 | 你已经**在页面中运行了 JS**(XSS、恶意/被入侵的网站、注入) | 一样:你的 payload 在你看不到的某个地方执行 | 受害者**点击一个链接并在你的伪造域名上登录**。不需要 XSS | | 它滥用的来源 | 受害者的**真实会话 / 真实来源** | 易受攻击应用程序的来源 | 一个**单独的攻击者域名**代理真实网站 | | 受害者看到的 | 一个我们绘制在任何页面上的**伪造**对话框 | 什么也看不到(payload 只是触发) | **真实的**登录页面,透明代理 | | 你捕获的内容 | 输入的凭据 + 击键 + 浏览器/LAN 侦察 + blind-XSS 战利品 | “它触发了,而且在这里”:DOM、cookie、屏幕截图、来源 | 真实的凭据**以及 MFA 后的会话 token** | | 击败 MFA? | **否** — 你网络钓鱼的是一个静态凭据 | 只有当它在页面中搭载了一个实时认证会话时才可以 | **是** — 偷取认证后的会话 cookie 就是其目的 | 需要教授的真正区别:我们的覆盖层钓鱼收集的是**用户输入的内容**。它**不会**捕获真实会话,也**不会**绕过 MFA,因为用户从未完成过真正的代理认证流程。这正是它作为一个很好对比的原因——它展示了为什么静态凭据网络钓鱼比 AiTM 更弱,并引出了为什么行业转向了抗钓鱼的、绑定来源的认证(FIDO2 / WebAuthn / passkeys)**。一个现实的攻击链会使用这三者:blind XSS 发现并交付代码执行,WRAITH hook 提供交互式的会话内控制,而重定向可以将受害者引入 Evilginx 流程以获取真实的已通过 MFA 的会话。 ## 配置 一切都是由环境变量驱动的;相同的构建版本可以在任何地方运行,因为 `hook.js` 从它被提供的任何位置推导出其回调 URL。`setup.sh` 会将这些写入 `.env`;你也可以手动设置它们。 | 环境变量 | 默认值 | 用途 | |---|---|---| | `WRAITH_HOST` | `127.0.0.1` | 绑定接口(`0.0.0.0` 表示暴露;在 Docker 中强制设置) | | `WRAITH_PORT` | `3000` | HTTP + WebSocket 端口(`setup.sh` 默认为 `8090`) | | `WRAITH_PUBLIC_URL` | *(推导得出)* | 你的 IP/域名,用于打印正确的 hook URL | | `WRAITH_OP_USER` | *(空)* | 操作员登录用户名(可选;`setup.sh` 会设置一个) | | `WRAITH_OP_PASSWORD` | *(空)* | 操作员登录密码;**必须**设置才能公开绑定 | | `WRAITH_SECRET` | *(随机/启动)* | 签名会话 cookie;设置它以在重启后保持登录状态 | | `WRAITH_SESSION_HOURS` | `12` | 操作员会话生命周期 | | `WRAITH_AUTOCAPTURE` | `1` | 在 hook 上自动触发页面捕获(`0` = 手动,BeEF 风格) | 只要设置了 `WRAITH_OP_PASSWORD`,操作员控制台就会受到**登录限制**(一个签名的 HttpOnly 会话 cookie 同时覆盖面板和实时的 WebSocket)。Hook payload、演示页面和 `/ws/hook` 通道保持公开,以便受害者可以访问它们。作为一种故障保护,除非设置了密码,否则服务器**拒绝绑定到公共接口**。 有关替代 Docker 的裸机 / systemd 部署方式,请参见 [deploy/DEPLOY.md](deploy/DEPLOY.md)。 ## 文件 ``` server.js C2 server (HTTP + WS, two roles by path) config.js env-driven config store.js durable session/loot store (data/sessions.json) lab.js deliberately-vulnerable practice lab (/lab) public/hook.js the payload public/demo/ innocuous "victim" landing page public/operator/ operator console (GUI + payload catalog) modules/ linkedin.js facebook.js microsoft.js portscan.js capture.js + registry public/vendor/ optional self-hosted libs (html2canvas for offline screenshots) setup.sh interactive Docker installer Dockerfile / docker-compose.yml deploy/ bare-metal systemd alternative ``` ## 许可证与归属 WRAITH **© 2026 Arcanum Information Security**,在 [Apache License 2.0](LICENSE) 下发布。 你可以自由使用、修改和重新分发它——包括用于你自己的培训—— **但你必须保留归属信息**:在你分发或派生的任何内容中保留 `LICENSE` 和 `NOTICE` 文件以及 Arcanum 版权声明,并说明你所做的任何更改(Apache-2.0 §4)。参见 [NOTICE](NOTICE)。除了描述代码的来源之外,该许可证并未授予使用 Arcanum 名称或商标的权利。 由 Arcanum 用 ❤️ 构建 —
标签:MITM代理, XSS, 数据可视化, 浏览器劫持, 漏洞情报, 版权保护, 自定义脚本, 请求拦截