
Análise detalhada e exploit PoC para CVE-2025-2825, uma bypass de autenticação no CrushFTP. Inclui templates nuclei, scanner multi-threaded e script de criação de usuário para testes de penetração.
Este documento apresenta uma pesquisa sobre a vulnerabilidade CVE-2025-2825, que afeta o servidor CrushFTP — uma solução comercial para transferência e armazenamento de arquivos (FTP, SFTP, HTTP/S, interfaces semelhantes ao S3, etc.).
O defeito é classificado como authentication bypass, permitindo que um invasor remoto não autenticado obtenha privilégios de administrador. A exploração bem-sucedida concede acesso com privilégios de crushadmin, visualização e modificação de arquivos, gerenciamento de contas de usuários e execução de operações administrativas através da interface web e API do CrushFTP.
Versões afetadas relatadas (de acordo com avisos públicos e relatórios de pesquisadores):
⚠️ Nota: em algumas publicações, há duplicatas e sobreposições de identificadores CVE (por exemplo, CVE-2025-31161).
Analisar passo a passo a vulnerabilidade e demonstrar o ciclo completo de pesquisa, incluindo:
De acordo com relatórios públicos, a vulnerabilidade tem risco crítico:
Instâncias com as seguintes características são críticas:
CrushFTP (qualquer edição com interface web).O CrushFTP implementa suporte a uma API semelhante ao S3. Para autenticação, é usado o cabeçalho Authorization no formato:
Authorization: AWS4-HMAC-SHA256 Credential=<AccessKey>/<Date>/<Region>/s3/aws4_request, SignedHeaders=<Headers>, Signature=<Signature>
O servidor extrai o AccessKey do Credential e deve verificar a assinatura. No entanto, foi cometido um erro no código ao lidar com a flag lookup_user_pass.
// ServerSessionHTTP.java, método loginCheckHeaderAuth()
if (this.headerLookup.containsKey("AUTHORIZATION") &&
this.headerLookup.getProperty("AUTHORIZATION").trim().startsWith("AWS4-HMAC")) {
boolean lookup_user_pass = true; // ← erro crítico
if (s3_username3.indexOf("~") >= 0) {
user_pass = user_name.substring(user_name.indexOf("~") + 1);
user_name = user_name.substring(0, user_name.indexOf("~"));
lookup_user_pass = false;
}
if (this.thisSession.login_user_pass(
lookup_user_pass,
false,
user_name,
lookup_user_pass ? "" : user_pass)) {
// Autenticação bem-sucedida
}
}
A flag lookup_user_pass é passada diretamente como anyPass:
if (anyPass && user.getProperty("username").equalsIgnoreCase(the_user)) {
return user; // autenticação sem verificação de senha
}
Assim:
Na versão 11.3.1 e posteriores, os desenvolvedores:
s3_auth_lookup_password_supported (padrão false), bloqueando o cenário vulnerável.lookup_user_pass → anyPass.s3_auth_lookup_password_supported desabilitado.A exploração do CVE-2025-2825 é bastante simples e não requer preparação complexa. O atacante só precisa enviar uma solicitação HTTP especialmente criada, contendo dois elementos principais:
Authorization no formato AWS S3, contendo o nome correto de um usuário existente (campo Credential com AccessKey/username).CrushAuth no formato esperado e parâmetro c2f na URL/corpo da solicitação, cujos valores correspondem logicamente (o formato do cookie deve corresponder à estrutura esperada pelo servidor).Se o servidor estiver vulnerável (versão no intervalo 10.0.0—10.8.3 ou 11.0.0—11.3.0 e sem o patch corretivo aplicado), tal combinação faz com que o manipulador de autenticação siga pelo caminho vulnerável, onde a flag de busca de senha (lookup_user_pass) é interpretada como "qualquer senha é aceitável", e o usuário é autenticado apenas pelo nome, sem verificação de senha.
Observação importante:
A exploração dessa vulnerabilidade geralmente requer o envio de duas solicitações sequenciais. A primeira, chamada de solicitação de "aquecimento", aciona o processo de autenticação vulnerável no servidor. Um sinal característico de que o servidor entrou no estado desejado é o recebimento de um erro
502 Bad Gatewayou simplesmente um timeout. Imediatamente após, a segunda solicitação principal é enviada, executando a ação útil (por exemplo, criação de usuário), enquanto o servidor permanece no estado vulnerável ao ataque.
GET /WebInterface/function/?command=getUserList&serverGroup=MainUsers&c2f=1111 HTTP/1.1
Host: target-server:8080
Cookie: CrushAuth=1743113839553_vD96EZ70ONL6xAd1DAJhXMZYMn1111
Authorization: AWS4-HMAC-SHA256 Credential=crushadmin/
Para o teste, usei o laboratório recente do HTB — Soulmate, que requer exploração do CrushFTP.

Graças a essa vulnerabilidade, é possível adicionar um novo usuário com direitos de administrador usando o comando setUserItem. Para isso, execute o script new_user.py
python3 new_user.py --target_host http://ftp.soulmate.htb/ --port 80 --target_user crushadmin --new_user literide --password literide