
Un serveur SSL-VPN délicieux, mais malveillant 🌮
NachoVPN est une preuve de concept qui démontre l'exploitation de clients SSL-VPN, à l'aide d'un serveur VPN malveillant.
Il utilise une architecture basée sur des plugins afin que la prise en charge de produits SSL-VPN supplémentaires puisse être apportée par la communauté. Il prend actuellement en charge plusieurs produits VPN d'entreprise populaires, tels que Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect et Ivanti Connect Secure.
Pour plus de détails, consultez notre article de blog, ainsi que la présentation HackFest Hollywood 2024 [diapositives|vidéo].
NachoVPN est développé et testé sur Ubuntu 22.04.
Installez python3-nftables et nftables
Utilisez éventuellement setcap pour éviter d'avoir besoin de sudo :
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
Activez le transfert IP :
sudo sysctl -w net.ipv4.ip_forward=1
NachoVPN peut être installé depuis GitHub avec pip. Notez que cela nécessite l'installation de git.
Tout d'abord, créez un environnement virtuel.
Sur Linux, assurez-vous que l'environnement virtuel a accès aux site-packages du système, afin que nftables fonctionne :
python3 -m venv env --system-site-packages
source env/bin/activate
Sur Windows, nftables (et donc le transfert de paquets) est désactivé, utilisez donc :
python -m venv env
.\env\Scripts\activate
Ensuite, installez NachoVPN :
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
Si vous préférez utiliser Docker, vous pouvez récupérer le conteneur depuis le GitHub Container Registry :
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
Tout d'abord, clonez ce dépôt, puis installez setuptools et wheel avec pip. Vous pouvez ensuite exécuter le script setup.py :
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
Cela générera un fichier wheel dans le répertoire dist, qui peut être installé avec pip :
pip install dist/nachovpn-1.0.0-py3-none-any.whl
Alternativement, pour le développement local, vous pouvez installer le paquet en mode éditable en utilisant :
pip install -e .
Vous pouvez construire l'image conteneur avec la commande suivante :
docker build -t nachovpn:latest .
Pour exécuter le serveur de manière autonome, utilisez :
python -m nachovpn.server
Alternativement, vous pouvez exécuter le serveur avec 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
Cela générera un certificat pour le SERVER_FQDN à l'aide de certbot, et l'enregistrera dans le répertoire certs, que nous avons monté dans le conteneur.
Alternativement, à des fins de test, vous pouvez ignorer la génération du certificat en définissant la variable d'environnement SKIP_CERTBOT.
Cela générera plutôt un certificat auto-signé.
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
Un fichier docker-compose d'exemple est également fourni pour plus de commodité.
Vous pouvez exécuter nachovpn avec les arguments de ligne de commande -d ou --debug afin d'augmenter la verbosité des journaux, ce qui peut faciliter le débogage.
Alternativement, si les journaux sont trop verbeux, vous pouvez utiliser l'argument de ligne de commande q ou --quiet à la place.
NachoVPN prend en charge les plugins et fonctionnalités suivants :
/pulse sur le serveur NachoVPN./sonicwall sur le serveur NachoVPN. Cela nécessite que SonicWall Connect Agent soit installé sur la machine cliente./delinea sur le serveur NachoVPN.NACAgent.exe avec un certificat auto-signé. À des fins de test, vous pouvez télécharger et installer ce certificat d'autorité de certification depuis /sonicwall/ca.crt avant de déclencher l'exploit. Pour les cas d'utilisation en production, vous devrez obtenir un certificat de signature de code valide auprès d'une autorité de certification publique, signer votre charge utile NACAgent.exe, puis la placer dans le répertoire payloads (ou la monter en volume dans /app/payloads, si vous utilisez Docker).NACAgent.exe par défaut est générée pour le plugin SonicWall et écrite dans le répertoire payloads. Elle lance simplement un nouveau processus cmd.exe sur le bureau de l'utilisateur actuel, s'exécutant en tant que SYSTEM.Pour désactiver un plugin, ajoutez-le à la variable d'environnement DISABLED_PLUGINS. Par exemple :
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN est configuré à l'aide de variables d'environnement. Cela le rend facilement compatible avec les déploiements conteneurisés.
Variables d'environnement globales :
Variables d'environnement spécifiques aux plugins :
Nous recommandons les mesures d'atténuation suivantes :
Nous accueillons volontiers les contributions ! Veuillez ouvrir une issue ou soumettre une Pull Request.
Si vous êtes intéressé par le développement d'un nouveau plugin, vous pouvez consulter l'ExamplePlugin pour commencer.
NachoVPN est sous licence MIT. Consultez le fichier LICENSE pour plus de détails.
| Plugin | Produit | CVE | RCE Windows | RCE macOS | Privilégié | Gestionnaire d'URI | Capture de paquets | Démo |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (correctif partiel) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (contourné) | ✅ | ✅ | ✅ | ✅ (Windows uniquement - désactivé par défaut dans 22.8R1) | ✅ | Windows |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows |
| Delinea | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
msi_version.txt soient présents dans le répertoire downloads. Ajoutez-les manuellement ou exécutez le script msi_downloader.py pour les télécharger.GlobalProtect.msi.old et GlobalProtect64.msi.old sont présents dans le dossier downloads. Ces fichiers doivent contenir les installateurs MSI non modifiés d'une version antérieure à 6.2.6 (par exemple 6.2.5).| Variable | Description | Défaut |
|---|
SERVER_FQDN | Le nom de domaine complet du serveur. | connect.nachovpn.local |
EXTERNAL_IP | L'adresse IP externe du serveur. | 127.0.0.1 |
WRITE_PCAP | Indique s'il faut écrire les fichiers PCAP capturés sur le disque. | false |
DISABLED_PLUGINS | Une liste de plugins à désactiver, séparés par des virgules. | |
USE_DYNAMIC_SERVER_THUMBPRINT | Indique s'il faut calculer dynamiquement l'empreinte du certificat serveur à partir du serveur (utile derrière un proxy). | false |
SERVER_SHA1_THUMBPRINT | Permet de remplacer l'empreinte SHA1 calculée pour le certificat serveur. | |
SERVER_MD5_THUMBPRINT | Permet de remplacer l'empreinte MD5 calculée pour le certificat serveur. | |
SMB_ENABLED | Active le partage SMB, disponible via le tunnel à \\10.10.0.1\<SMB_SHARE_NAME> | false |
SMB_SHARE_NAME | Le nom à utiliser pour le partage SMB | SHARE |
SMB_SHARE_PATH | Le chemin du répertoire à utiliser pour le partage SMB | smb |
TUNNEL_PRIVATE | Lorsqu'elle est définie sur true, active le tunneling mais désactive le transfert Internet pour les clients VPN. Les clients ne peuvent accéder qu'au partage SMB. | false |
TUNNEL_FULL | Lorsqu'elle est définie sur true, active le tunneling complet et permet aux clients VPN d'accéder à Internet. Implique également TUNNEL_PRIVATE=true. | false |
| Variable | Description | Défaut |
|---|
VPN_NAME | Le nom du profil VPN, qui est présenté au client pour Cisco AnyConnect. | NachoVPN |
PULSE_LOGON_SCRIPT | Le chemin du script de connexion Pulse Secure. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | Le chemin du script de connexion Pulse Secure pour macOS. | |
PULSE_DNS_SUFFIX | Le suffixe DNS à utiliser pour les connexions Pulse Secure. | nachovpn.local |
PULSE_USERNAME | Le nom d'utilisateur à pré-remplir dans la boîte de dialogue de connexion Pulse Secure. | |
PULSE_SAVE_CONNECTION | Indique s'il faut enregistrer la connexion Pulse Secure dans le client de l'utilisateur. | false |
PULSE_ANONYMOUS_AUTH | Indique s'il faut utiliser l'authentification anonyme pour les connexions Pulse Secure. Si elle est définie sur true, l'utilisateur ne sera pas invité à saisir un nom d'utilisateur ou un mot de passe. | false |
PULSE_HOST_CHECKER_RULES_FILE | Un fichier JSON contenant une liste de règles host-checker basées sur le registre pour ICS. Voir l'exemple dans src/nachovpn/plugins/pulse/test/example_rules.json | |
PALO_ALTO_MSI_ADD_FILE | Le chemin d'un fichier à ajouter à l'installateur MSI de Palo Alto. | |
PALO_ALTO_MSI_COMMAND | La commande à exécuter par l'installateur MSI de Palo Alto. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | Indique s'il faut forcer l'application du correctif sur l'installateur MSI s'il existe déjà dans le répertoire payloads. | false |
PALO_ALTO_PKG_COMMAND | La commande à exécuter par l'installateur PKG de Palo Alto sur macOS. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | La commande à exécuter par le script OnConnect.vbs de Cisco AnyConnect sur Windows. | calc.exe |
CISCO_COMMAND_MACOS | La commande à exécuter par le script OnConnect.sh de Cisco AnyConnect sur macOS. | touch /tmp/pwnd |