CVE-2021-22911
Pre-Auth Blinde NoSQL-Injection führt zu Remote Code Execution in Rocket Chat 3.12.1
- Die getPasswordPolicy-Methode ist anfällig für NoSQL-Injection-Angriffe und erfordert keine Authentifizierung/Autorisierung. Sie kann verwendet werden, um Konten zu übernehmen, indem Passwort-Reset-Tokens preisgegeben werden. Die Übernahme eines Admin-Kontos führt zu Remote Code Execution.
Erklärung
- Übernahme eines Benutzerkontos ( Unauthenticated )
- Es besteht eine NoSQL-Injection im getPasswordPolicy-Endpunkt im token-Parameter des Passwort-Resets, der ein JSON-Objekt akzeptiert, das uns die Verwendung des $regex-Operators erlaubt. Dies nutzen wir, um eine blinde NoSQL-Injection durchzuführen, um das Reset-Token zu erhalten.
- Privilege Escalation zu Admin ( Authenticated )
- Der Admin-Benutzer ist höchstwahrscheinlich durch 2FA geschützt. Selbst wenn wir das Passwort des Admins durch (1) ändern, wird beim Login ein 2FA-Code abgefragt.
- Der users.list-API-Endpunkt akzeptiert einen query-Parameter, der anfällig für NoSQL-Injection ist. Wir können auch Daten abrufen, indem wir einen Fehler auslösen.
- Wir führen die folgende Abfrage aus, um das 2FA-Geheimnis des Admins zu erhalten:
{"$where":"this.username==='admin' && (()=>{ throw this.services.totp.secret })()"}
- Als nächstes führen wir (1) aus, um das Admin-Passwort zurückzusetzen, und verwenden das 2FA-Geheimnis, um einen Code zu generieren, mit dem wir uns anmelden können.
- Aktualisiert: Sie können das Reset-Token auch auf die gleiche Weise abrufen, wie Sie das 2FA-Geheimnis abgerufen haben :
{"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
- RCE ( Autenticated - Admin )
- Rocket.Chat hat eine Funktion namens Integrationen, die das Erstellen eingehender und ausgehender Webhooks ermöglicht. Diesen Webhooks können Skripte zugeordnet werden, die ausgeführt werden, wenn der Webhook ausgelöst wird.
- Wir erstellen eine Integration mit dem folgenden Skript :
const require = console.log.constructor('return process.mainModule.require')();
const { exec } = require('child_process');
exec('command here');
- Als nächstes lösen wir einfach den Webhook aus, um RCE zu erhalten :)
Verwendung
- Sie benötigen die E-Mail-Adresse eines Benutzers mit niedrigen Rechten, der kein 2FA eingerichtet hat. ( -u )
- Sie benötigen außerdem die E-Mail-Adresse des Administrators. Kein Problem, wenn der Admin mit 2FA geschützt ist. ( -a )
Umgebung
- Getestet auf Rocket Chat 3.12.1
- Erstellen einer eigenen Testumgebung mit Docker :
docker run --name db -d mongo:3.6 --smallfiles --replSet rs0 --oplogSize 128
docker exec -ti db mongo --eval "printjson(rs.initiate())"
docker run --name rocketchat -p 80:3000 --link db --env ROOT_URL=http://localhost --env MONGO_OPLOG_URL=mongodb://db:27017/local -d rocket.chat:3.12.1
- Aktivieren Sie die Password Policy
- Aktivieren Sie 2FA für den Administrator
- Registrieren Sie einen normalen Benutzer.
HINWEIS: Wenn Sie nicht möchten, dass der Administrator durch 2FA geschützt ist, können Sie Folgendes tun.
- Senden Sie eine E-Mail zum Vergessen des Passworts
- Holen Sie sich das Reset-Token für den Administrator
- Ändern Sie das Passwort mit dem abgerufenen Reset-Token
# Admin Account Takover [ No 2fa ]
forgotpassword(adminmail,target)
token = resettoken(target)
changingpassword(target,token)
Credits
Exploit-db