
Вкусный, но вредоносный 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.
Сначала создайте виртуальное окружение.
В Linux убедитесь, что виртуальное окружение имеет доступ к системным site-packages, чтобы работал nftables:
python3 -m venv env --system-site-packages
source env/bin/activate
В Windows 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 по умолчанию и записывается в каталог payloads. Она просто запускает новый процесс cmd.exe на рабочем столе текущего пользователя от имени SYSTEM.Чтобы отключить плагин, добавьте его в переменную окружения DISABLED_PLUGINS. Например:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN настраивается с помощью переменных окружения. Это обеспечивает лёгкую совместимость с контейнерными развёртываниями.
Глобальные переменные окружения:
Переменные окружения для конкретных плагинов:
Мы рекомендуем следующие меры защиты:
Мы приветствуем ваш вклад! Пожалуйста, открывайте issue или создавайте Pull Request.
Если вы заинтересованы в разработке нового плагина, вы можете посмотреть на ExamplePlugin, чтобы начать.
NachoVPN распространяется под лицензией MIT. Подробности см. в файле LICENSE.
| Плагин | Продукт | CVE | Windows RCE | macOS RCE | Привилегии | URI-обработчик | Захват пакетов | Демо |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (частичное исправление) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (обойдено) | ✅ | ✅ | ✅ | ✅ (только Windows — отключено по умолчанию в 22.8R1) | ✅ | Windows |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows |
| Delinea | Обработчик протокола | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
msi_version.txtdownloadsmsi_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-файл, содержащий список правил host-checker на основе реестра для 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 в Windows. | calc.exe |
CISCO_COMMAND_MACOS | Команда, которая будет выполнена скриптом OnConnect.sh Cisco AnyConnect в macOS. | touch /tmp/pwnd |