
متصفح وسيط مسلح (BitM) لمختبري الاختراق

متصفح-في-الوسط (BitM) متعدد المستخدمين مسلح لمختبرى الاختراق. يمكن استخدام هذا الهجوم لتجاوز المصادقة متعددة العوامل في العديد من تطبيقات الويب عالية القيمة. يعمل حتى مع التطبيقات التي لا تستخدم رموز الجلسة، وبالتالي لن تكون قابلة للاستغلال باستخدام هجمات سرقة الرموز التقليدية. هذه أداة هندسة اجتماعية ولا تستغل أي ثغرات تقنية في الخدمة المستهدفة.
هذه الأداة هي خادم ويب متخصص. صُممت لتشغيل على خادم Linux Debian 11 (Bullseye) وتعتمد على معلومات IP العامة لحماية وظائف الإدارة. لا تتوقع أن تتمكن من الاختبار محليًا دون تجاوز بعض العقبات الكبيرة.
تحذير: Chromium غير مدعوم على ARM. بينما من الممكن تقنيًا فرض استخدام ثنائي Chromium لـ ARM، ستفقد جميع الميزات/الحماية الإضافية لـ puppeteer-extra.
يستخدم هذا الإعداد المثال Caddy للتعامل مع TLS و SNI وإضافة بعض الرؤوس المخصصة مثل 'X-Real-IP' لكل طلب. ليس عليك استخدام Caddy مع Cuddlephish، حيث يمكن إعداد نفس الوكيل العكسي باستخدام Nginx أو Apache إلخ. أنا أفضل Caddy لأنه سهل التثبيت باستخدام Docker ويحتوي على إضافات لإدارة شهادات Letsencrypt لمعظم مسجلي النطاقات. يُظهر مثال Caddyfile كيفية إعداده لـ Gandi. راجع الوثائق الخاصة بمسجلك.
قم بتثبيت Docker و Node و XVFB وبعض التبعيات الأخرى:
git clone https://github.com/fkasler/cuddlephish
cd cuddlephish
sudo bash install_deps.sh
يمكنك بعد ذلك استخدام Docker لبناء Caddy مع إضافة شهادة أحرف بدل لمسجلك. المثال لـ Gandi. راجع الوثائق هنا وقائمة وحدات موفري DNS هنا. يمكنك تعديل Dockerfile لمسجلك قبل البناء:
sudo docker build -t caddy .
الآن قم بتعديل ملف Caddyfile لاستبدال نطاقك ومفتاح API لـ Gandi (أو أي مسجل آخر)، ثم ابدأ Caddy. أوصي ببدء تشغيله في نافذة screen أو tmux حتى تتمكن من تشغيل خادم Node في نافذة أخرى بعد قليل:
sudo docker run -p 80:80 -p 443:443 -p 2019:2019 -v $PWD/Caddyfile:/etc/caddy/Caddyfile --network=host caddy:latest
بعد أن يتولى Caddy حركة المرور على المنفذين 80 و 443، يمكننا أخيرًا تشغيل الأداة!
قم بتثبيت تبعيات Node:
npm install
بعض التعديلات على الإعدادات: خطوة حاسمة: تأكد من تعديل ملف config.json لإضافة عناوين IP العامة المعتمدة لديك للوصول الإداري. قائمة IP البيضاء هذه هي التي تتحكم في الوصول إلى واجهة الويب "/admin". يجب أيضًا تغيير مفتاح المقبس الافتراضي إلى شيء أكثر أمانًا.
الأداة ليست مهيأة لاستهداف أي صفحات تسجيل دخول افتراضيًا، لذا ستحتاج إلى إضافة بعضها. يوجد نص برمجي 'add_target.js' لتسهيل هذه الخطوة. فقط قم بتشغيل النص والصق عنوان URL لبوابة تسجيل الدخول التي تريد استهدافها عند الطلب:
node add_target.js
سيقوم هذا بجلب اسم الخدمة وعنوان التبويب والأيقونة المفضلة لك وإضافة إدخال إلى 'targets.json'. يمكنك تشغيل هذا النص عدة مرات وسيقوم بإلحاق الأهداف الجديدة. سيقوم النص بتسمية كل خدمة بناءً على النطاق، بدون المستوى الأعلى. لذا، بالنسبة لـ 'https://www.example.com/login.php' ستكون الخدمة مجرد 'example' عند تحديد هدفك عندما...
قم بتشغيلها!
node index.js example
بعد بضع ثوانٍ، يجب أن ترى رسالة في وحدة التحكم عندما يتصل أول مثيل Chrome آلي لديك عبر websockets. الآن يجب أن يرى زوار موقع التصيد الخاص بك ما يبدو وكأنه صفحة تسجيل الدخول الهدف ولكنها في الواقع بث فيديو لمثيل المتصفح الآلي لديك. يمكنهم أيضًا التفاعل مع مثيل المتصفح لديك وتسجيل الدخول نيابة عنك.
إذا قمت بتكوين عناوين IP الإدارية بشكل صحيح في config.json، يجب أن تكون قادرًا على عرض واجهة ويب خاصة '/admin' لتتبع المستخدمين وعرض سجلات المفاتيح والسيطرة على مثيلات المتصفح المسجلة الدخول وسرقة ملفات تعريف الارتباط وحذف مثيلات المتصفح غير المرغوب فيها.
ملاحظة: لن ترى أي شيء في صفحة الإدارة حتى يكون لديك بعض الضحايا. بمجرد أن يكون لديك ضحية، يجب أن يظهر مثيل المتصفح الخاص به في واجهة المستخدم الإدارية.
واجهت عدة أشخاص يفتحون مشكلات حول "صفحة بيضاء فارغة"، وهو عرض للعديد من المشكلات المحتملة، وليس مشكلة في حد ذاتها. يرجى عدم فتح مشكلات تحت أسماء أعراض غامضة. بدلاً من ذلك، إذا كانت لديك صفحة فارغة على جانب المستخدم، فحاول أولاً النظر في ما يلي:
على مستوى عالٍ، إذا رأيت فقط صفحة فارغة على الواجهة الأمامية، فهذا يعني أن هناك خللاً يحدث في سلسلة تدفق البيانات من "بدء WebRTC" > "حدد تبويب للبث" > "تفاوض ICE مع متصفح الضحية" > "بث الفيديو". خطوات استكشاف الأخطاء وإصلاحها أعلاه تهدف إلى مساعدتك في تتبع البيانات عبر هذه العملية. عند العمل بشكل صحيح، يجب أن تتوقع رؤية تدفق سجل على الخادم مشابه لما يلي:
آمل أن يساعد هذا في أي مشكلات، وكما هو الحال دائمًا، المعلومات الكافية لتكرار المشكلة باستمرار هي شرط أساسي لتقديم المشكلات لمزيد من التحقيق.
قم بتشغيل حمولة يدويًا لتنزيلها على نظام الضحية عبر JavaScript. يبدأ كل هدف بـ 'payload.txt' كحمولة اختبار. فقط قم بتبديل موقع الملف في targets.json لإرسال حمولة مخصصة.
يرسل تغيير window.location للضحية لإرساله إلى بوابة تسجيل الدخول الحقيقية. سيبدو كما لو أنه يجبر على إعادة المصادقة ويمنعه من مشاهدتك وأنت تتولى زمام الأمور. إذا قمت بتعديل الكود، يمكنك القيام ببعض الأشياء الفاخرة الأخرى بهذه التقنية العامة ;)
يسمح لك بالتدخل والتحكم في مثيل المتصفح مباشرة من بوابة الإدارة. لإيقاف التحكم في المثيل، اضغط على مفتاح ESCAPE. ملاحظة، سيؤدي هذا إلى سحب التحكم من ضحية التصيد وسيكون قادرًا على مشاهدة تحركاتك إذا لم تقم بطرده أولاً. لقد تم تحذيرك.
يسمح لك بإعادة التحكم يدويًا للمستخدم في مثيل المتصفح الآلي. قد يكون هذا مفيدًا في بعض سيناريوهات الهندسة الاجتماعية عند انتحال صفة تكنولوجيا المعلومات. يمكنك إخبار المستخدم بأنك تبدأ جلسة مساعدة، وتتولى التحكم وتنتقل إلى الخدمة الهدف، ثم تعيد التحكم وتجعلهم يسجلون الدخول، ثم تتولى التحكم مرة أخرى، إلخ.
يستخرج جميع عناصر ملفات تعريف الارتباط والتخزين المحلي من مثيل المتصفح، ويقوم بتنزيلها كملف JSON. لحقن هذه المواد المعتمدة مرة أخرى في مثيل متصفح يعمل على نظامك المحلي، يوجد نص برمجي في المشروع يسمى 'stealer.js'. من المفترض أن يتم تشغيله من جهازك، وليس من الخادم، لذا لاستخدامه ستحتاج أيضًا إلى تثبيت مكونات Node الخاصة بالمشروع على نظامك.
node stealer.js ~/Downloads/cuddle_asdf1234.json
يقتل مثيل المتصفح عندما لا تحتاجه. في بعض الأحيان لا يقوم المستخدمون بتسجيل دخول كامل. في بعض الأحيان يفشل اتصال WebRTC. في بعض الأحيان تنتهي صلاحية الجلسة قبل أن تتمكن من استخدامها. في هذه الحالات، يمكن أن يساعدك هذا الزر في تنظيف مثيلات المتصفح غير المفيدة عبر بوابة الإدارة.
يتم إنشاء كل متصفح بمعرّف متصفح عشوائي خاص به ودليل بيانات مستخدم مطابق في مجلد "user_data" الخاص بالمشروع. في بعض الحالات التي لا يعمل فيها 'stealer.js'، قد تحتاج إلى تكرار بيانات المستخدم لهذا المثيل أيضًا. يمكن أن يكون هذا مفيدًا في حالات استهداف الخدمات بميزة "تذكر هذا المتصفح" اعتمادًا على كيفية تنفيذ هذه الميزة.
يوجد أيضًا ملف keylog.txt في كل دليل بيانات مستخدم مع سجل كامل لمفاتيح الضحية. يحاول سجل المفاتيح العام في بوابة الإدارة مراعاة أشياء مثل مسافات الرجوع، بينما سيحتوي هذا keylog.txt على جميع ضغطات المفاتيح المسجلة.
مثال pm.json:
{
"tacking_id": "id",
"logging_endpoint": "https://www.phishmongerserver.com/create_event",
"admin_cookie": "admin_cookie=s3cret",
"post_url_search": "ppsecure"
}
تعمل هذه الأداة عن طريق ربط زوار موقع التصيد بمتصفح Chrome آلي، يعمل على خادم التصيد. يتم بعد ذلك بث بث فيديو لمثيل Chrome الذي يتحكم فيه المهاجم إلى ضحية التصيد عبر WebRTC، ويتم إعادة توجيه جميع حركات الماوس وإدخالات لوحة المفاتيح التي يوفرها المستخدم من متصفح الضحية إلى مثيل Chrome المرتبط بهم. يستخدم الخادم websockets لتتبع الضحايا، وإقرانهم بالمتصفحات، ووساطة بث الفيديو WebRTC، والتوسط في إدخالات المستخدم. لكل زائر جديد، يقوم الخادم بإنشاء مثيل Chrome جديد. نظرًا لأننا نستخدم Chrome Devtools Protocol (CDP) لقيادة كل مثيل Chrome، يمكننا استخدام واجهات برمجة تطبيقات مثل "Storage.getCookie" لاستخراج ملفات تعريف ارتباط الجلسة للمواقع المستهدفة بمجرد أن يقوم المستخدم بتسجيل الدخول لنا. يمكننا أيضًا التدخل في أي وقت وقيادة كل مثيل Chrome مباشرة، مستفيدين من نفس الطريقة التي نستخدمها لإعطاء الضحايا التحكم عن بُعد في المقام الأول.
يقوم خادم Node بما يلي:
من فهمي، تم نظريًّا هذه التقنية وحتى تسليحها لعدة سنوات (انظر التحيات). لذا، بينما يمكن للممثلين الخبيثين الاستفادة من هذه التقنية، وربما فعلوا ذلك لبعض الوقت، لم يكن لدى محترفي الأمن الهجومي طريقة سهلة لتكرار هذه التقنية وقد يكونون غير مدركين لوجودها. قصدي من إصدار الأداة هو السماح لمختبرى الاختراق وفريق الأحمر باستخدام BitM في العمليات لإظهار تأثيرها المحتمل ومساعدة المدافعين عن الشبكات على الاستعداد للتهديدات الحقيقية.
أولاً، افهم أن هذا الهجوم يعتمد على الهندسة الاجتماعية لخداع المستخدم لزيارة موقع ويب ضار. قائمة النطاقات البيضاء ستساعد كثيرًا في منع هذا وغيره من أنواع الهندسة الاجتماعية. إذا اعتمدنا على المستخدمين لإدارة 100٪ من بيانات الاعتماد (كلمة المرور، OTP، SMS، PhoneFactor، إشعار الدفع، إلخ) لخدمة ويب، فسنكون عرضة لهذا الهجوم. لذلك، لإحباط هذا الهجوم، نحتاج إلى الاستفادة من بيانات الاعتماد التي لا يديرها المستخدمون. على سبيل المثال، يمكن إصدار شهادات TLS للعميل للأجهزة العميلة، وستكون صالحة فقط للخدمة الويب الحقيقية. تتم إدارة الشهادة بواسطة المتصفح ونظام التشغيل، ولا توجد طريقة لخادم المهاجم للحصول على نسخة من شهادة TLS الخاصة بالضحية. خيار آخر هو استخدام U2F أو FIDO2 مع أجهزة مثل YubiKey لإدارة بعض بيانات الاعتماد المطلوبة. لا توجد طريقة لموقع الويب الخاص بالمتسلل للتفاعل مع YubiKey المتصل بجهاز الضحية.
أنا لست خبيرًا في Docker (بعد). إذا كان بإمكانك التوصل إلى إعداد Dockerized بسيط، فسأكون ممتنًا حقًا لطلب سحب.
إنه لعب على كلمة Cuttlefish، مخلوق بحري رائع يمكنه الاندماج مع محيطه، و Phishing، لأنه يتطلب هندسة اجتماعية لتنفيذ الهجوم، ومكتوب بشكل خاطئ عمدًا ليكون فريدًا ومرحًا وسخيفًا. يسعدني أن أتخيل أن اسم الأداة المضحك هذا سيتم ذكره بجانب نتائج المخاطر الحرجة في تقارير اختبار الاختراق.
بينما توصلت إلى هذه التقنية والتنفيذ بشكل مستقل، علمت منذ ذلك الحين أن باحثين آخرين سبقوني في الاكتشاف. كل منهم اتخذ نهجًا لاستخدام عملاء VNC المستندة إلى الويب لتحقيق نتيجة مماثلة. إنه نهج بديهي وقد يكون قابلاً للتطبيق لتنفيذ هجمات MitM ضد برامج أخرى، وليس فقط المتصفحات (VPN-في-المتصفح ربما؟). يستحق التحقق بالتأكيد:
Franco Tommasi, Christian Catalano & Ivan Taurino https://link.springer.com/article/10.1007/s10207-021-00548-5
@mrd0x https://mrd0x.com/bypass-2fa-using-novnc/
أيضًا:
تحية لدانيال آرون @majordmg لمساعدته في المراحل المبكرة من إثبات مفهوم WebRTC.
شكر كبير لـ RJ Stallkamp @Z3rO-C00L لإصلاح وتصميم واجهة الإدارة، والشعار الجديد الرائع.