
Analyse détaillée et exploit PoC pour CVE-2025-2825, un contournement d'authentification dans CrushFTP. Inclut des templates nuclei, un scanner multi-thread, et un script de création d'utilisateur pour les tests de pénétration.
Ce document présente l'étude de la vulnérabilité CVE-2025-2825 affectant la partie serveur de CrushFTP, une solution commerciale de transfert et de stockage de fichiers (FTP, SFTP, HTTP/S, interfaces de type S3, etc.).
Le défaut est classé comme contournement d'authentification, permettant à un attaquant distant non authentifié d'obtenir les droits d'administrateur. Une exploitation réussie donne un accès avec les privilèges crushadmin, la visualisation et la modification de fichiers, la gestion des comptes utilisateurs et l'exécution d'opérations administratives via l'interface web et l'API de CrushFTP.
Versions affectées signalées (selon les avis publics et les rapports de chercheurs) :
⚠️ Remarque : dans certaines publications, on trouve des doublons et des chevauchements d'identifiants CVE (par exemple CVE-2025-31161).
Analyser pas à pas la vulnérabilité et démontrer le cycle complet de l'étude, comprenant :
Selon les rapports publics, la vulnérabilité présente un risque critique :
Les instances présentant les caractéristiques suivantes sont critiques :
CrushFTP (toute édition avec interface web).CrushFTP implémente le support d'une API de type S3. Pour l'authentification, l'en-tête Authorization est utilisé :
Authorization: AWS4-HMAC-SHA256 Credential=<AccessKey>/<Date>/<Region>/s3/aws4_request, SignedHeaders=<Headers>, Signature=<Signature>
Le serveur extrait l'AccessKey de Credential et doit vérifier la signature. Cependant, une erreur a été commise dans le code lors de la gestion du flag lookup_user_pass .
// ServerSessionHTTP.java, méthode loginCheckHeaderAuth()
if (this.headerLookup.containsKey("AUTHORIZATION") &&
this.headerLookup.getProperty("AUTHORIZATION").trim().startsWith("AWS4-HMAC")) {
boolean lookup_user_pass = true; // ← erreur critique
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)) {
// Authentification réussie
}
}
Le flag lookup_user_pass est directement transmis comme anyPass :
if (anyPass && user.getProperty("username").equalsIgnoreCase(the_user)) {
return user; // authentification sans vérification du mot de passe
}
Ainsi :
Si le nom d'utilisateur est spécifié sans le caractère ~, le flag reste true.
La vérification du mot de passe n'est pas effectuée.
L'attaquant peut s'authentifier en indiquant uniquement un nom d'utilisateur existant (par exemple crushadmin).
Avec un cookie CrushAuth formellement valide et le paramètre c2f, cela permet de contourner l'authentification et d'obtenir un accès administratif.
Dans la version 11.3.1 et ultérieures, les développeurs :
Ont ajouté le paramètre s3_auth_lookup_password_supported (par défaut false), bloquant le scénario vulnérable.
Ont introduit des vérifications précoces du nom d'utilisateur avec ~.
Ont séparé la logique des flags, supprimant la substitution lookup_user_pass → anyPass.
Recommandation : mettre à jour immédiatement CrushFTP vers 11.3.1+ ou appliquer le workaround avec s3_auth_lookup_password_supported désactivé.
L'exploitation de CVE-2025-2825 est assez simple et ne nécessite pas de préparation complexe. L'attaquant doit simplement envoyer une requête HTTP spécialement conçue, contenant deux éléments clés :
Authorization au format AWS S3 contenant le nom correct d'un utilisateur existant (champ Credential avec AccessKey/nom d'utilisateur).CrushAuth au format attendu et le paramètre c2f dans l'URL/le corps de la requête, dont les valeurs correspondent logiquement (le format du cookie doit correspondre à la structure attendue par le serveur).Si le serveur est vulnérable (version dans la plage 10.0.0—10.8.3 ou 11.0.0—11.3.0 et correctif non appliqué), cette combinaison force le gestionnaire d'authentification à emprunter le chemin vulnérable, où le flag de recherche du mot de passe (lookup_user_pass) est interprété comme « tout mot de passe est accepté », et l'utilisateur est authentifié sur la seule base du nom sans vérification du mot de passe.
Remarque importante :
L'exploitation de cette vulnérabilité nécessite généralement l'envoi de deux requêtes successives. La première, dite de « préchauffage » (warm-up), déclenche le processus d'authentification vulnérable sur le serveur. Un signe caractéristique que le serveur est entré dans l'état souhaité est l'obtention d'une erreur
502 Bad Gatewayou simplement un délai d'attente (timeout). Immédiatement après, la seconde requête, principale, exécute l'action utile (par exemple, création d'un utilisateur) pendant que le serveur est encore dans l'état vulnérable à l'attaque.
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/
Pour le test, j'ai utilisé le laboratoire récent sur HTB — Soulmate, qui nécessite justement l'exploitation de CrushFTP.
