MongoDB (port 27017) s'exécutait historiquement sans authentification et écoutait sur toutes les interfaces, donc les instances exposées restent un point d'ancrage courant d'accès aux données sans authentification. Cette page couvre le serveur atteint en tant que service ; les requêtes contrôlées par l'attaquant depuis une application web relèvent de l'injection d'opérateur NoSQL et se trouvent sous l'arborescence web.
Accès et énumération#
# Connect (mongosh, or the legacy mongo shell); no credentials where auth is off
mongosh "mongodb://<target>:27017"
# show dbs ; use <db> ; show collections ; db.<coll>.find()
# Fingerprint and check for no-auth access
nmap -p27017 --script mongodb-info,mongodb-databases <target>
JavaScript côté serveur#
Lorsque le JavaScript côté serveur est activé, $where et mapReduce évaluent le JavaScript de l'attaquant à l'intérieur du processus de la base de données, ce qui constitue un levier de déni de service et, sur les versions anciennes ou mal configurées, une voie vers l'exécution dans le contexte du moteur :
db.coll.find({ $where: "sleep(5000) || true" }); // timing / DoS oracle
db.coll.mapReduce(function(){ /* JS */ }, function(k,v){return v}, {out:"o"});
Notes d'exploitation#
- L'exposition sans authentification par défaut est l'élément marquant : énumérez avec
show dbset extrayez les collections directement là où l'authentification n'a jamais été activée. - Même avec l'authentification, vérifiez la présence d'un utilisateur applicatif sur-privilégié et des rôles
__systemou admin atteignables avec des identifiants faibles. - Le JavaScript côté serveur (
security.javascriptEnabled) reste activé par défaut (déprécié depuis MongoDB 8.0 mais non désactivé par défaut), donc$where/mapReducesont généralement disponibles à moins qu'un opérateur ne les ait désactivés. - MongoDB exposé sans authentification a fait l'objet de rançongiciels de masse dans la nature, donc une instance ouverte constitue à la fois un risque de vol de données et un risque d'intégrité lors d'une mission.
Outils#
- mongosh : shell natif pour l'énumération et les requêtes JavaScript.
- NoSQLMap : énumération MongoDB automatisée et test d'injection.
- nmap
mongodb-*: empreinte non authentifiée et listage des bases de données.