27017,27018 - Pentesting MongoDB

Tip

Apprenez et pratiquez le hacking AWS :HackTricks Training AWS Red Team Expert (ARTE)
Apprenez et pratiquez le hacking GCP : HackTricks Training GCP Red Team Expert (GRTE) Apprenez et pratiquez le hacking Azure : HackTricks Training Azure Red Team Expert (AzRTE)

Soutenir HackTricks

Informations de base

MongoDB est un système de gestion de base de données open source qui utilise un modèle de base de données orienté document pour traiter diverses formes de données. Il offre flexibilité et évolutivité pour gérer des données non structurées ou semi-structurées dans des applications telles que l’analyse de big data et la gestion de contenu. Port par défaut : 27017, 27018

PORT      STATE SERVICE VERSION
27017/tcp open  mongodb MongoDB 2.6.9 2.6.9

Énumération

Manuelle

from pymongo import MongoClient
client = MongoClient(host, port, username=username, password=password)
client.server_info() #Basic info
#If you have admin access you can obtain more info
admin = client.admin
admin_info = admin.command("serverStatus")
cursor = client.list_databases()
for db in cursor:
print(db)
print(client[db["name"]].list_collection_names())
#If admin access, you could dump the database also

Quelques commandes MongoDB :

show dbs
use <db>
show collections
db.<collection>.find()  #Dump the collection
db.<collection>.count() #Number of records of the collection
db.current.find({"username":"admin"})  #Find in current db the username admin

Automatique

nmap -sV --script "mongo* and default" -p 27017 <IP> #By default all the nmap mongo enumerate scripts are used

Shodan

  • Tous les serveurs mongodb : "mongodb server information"
  • Recherche des serveurs mongodb entièrement ouverts : "mongodb server information" -"partially enabled"
  • Authentification partiellement activée : "mongodb server information" "partially enabled"

Login

Par défaut, mongo ne requiert pas de mot de passe.
Admin est une base de données mongo courante.

mongo <HOST>
mongo <HOST>:<PORT>
mongo <HOST>:<PORT>/<DB>
mongo <database> -u <username> -p '<password>'

Le script nmap : mongodb-brute vérifiera si des creds sont nécessaires.

nmap -n -sV --script mongodb-brute -p 27017 <ip>

Brute force

Regardez dans /opt/bitnami/mongodb/mongodb.conf pour savoir si des identifiants sont nécessaires :

grep "noauth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#" #Not needed
grep "auth.*true" /opt/bitnami/mongodb/mongodb.conf | grep -v "^#\|noauth" #Not needed

Mongo Objectid Predict

Exemple d’ici.

Mongo Object IDs are 12-byte hexadecimal strings:

http://techidiocy.com/_id-objectid-in-mongodb/

Par exemple, voici comment on peut disséquer un Object ID réel retourné par une application : 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 en décimal = vendredi, 31 juillet 2020 17:49:32
  2. 9fa6dc: Identifiant machine
  3. 2500: Process ID
  4. 314019: Un compteur incrémental

Parmi les éléments ci‑dessus, l’identifiant machine restera le même tant que la base tourne sur la même machine physique/virtuelle. Le Process ID ne changera que si le processus MongoDB est redémarré. Le Timestamp est mis à jour chaque seconde. Le seul défi pour deviner des Object IDs en incrémentant simplement le compteur et le timestamp est que MongoDB génère et assigne les Object IDs au niveau du système.

L’outil https://github.com/andresriancho/mongo-objectid-predict, donné un Object ID de départ (vous pouvez créer un compte et obtenir un ID de départ), renvoie environ 1000 Object IDs probables qui auraient pu être assignés aux objets suivants, vous n’avez donc qu’à les bruteforce.

Post

Si vous êtes root vous pouvez modify le fichier mongodb.conf de sorte qu’aucun credentials ne soit nécessaire (noauth = true) et login without credentials.

MongoBleed zlib Memory Disclosure (CVE-2025-14847)

Une divulgation de mémoire non authentifiée généralisée (“MongoBleed”) affecte MongoDB 3.6–8.2 lorsque le zlib network compressor is enabled. L’en-tête OP_COMPRESSED fait confiance à un uncompressedSize fourni par l’attaquant, si bien que le serveur alloue un buffer de cette taille et le recopie dans les réponses alors que seul un payload compressé beaucoup plus petit a été fourni. Les octets supplémentaires sont des données de heap non initialisées provenant d’autres connexions, de /proc ou du cache WiredTiger. Les attaquants omettent ensuite le BSON \x00 terminator attendu, de sorte que l’analyseur de MongoDB continue de scanner ce buffer surdimensionné jusqu’à trouver un terminator, et la réponse d’erreur renvoie à la fois le document malveillant et les octets de heap scannés pre-auth sur TCP/27017.

Exposure requirements & quick checks

  • La version du serveur doit appartenir aux plages vulnérables (3.6, 4.0, 4.2, 4.4.0–4.4.29, 5.0.0–5.0.31, 6.0.0–6.0.26, 7.0.0–7.0.27, 8.0.0–8.0.16, 8.2.0–8.2.2).
  • net.compression.compressors ou networkMessageCompressors doivent inclure zlib (par défaut sur de nombreuses builds). Vérifiez depuis le shell avec :
db.adminCommand({getParameter: 1, networkMessageCompressors: 1})
  • The attacker n’a besoin que d’un accès réseau au port MongoDB. Aucune authentification n’est nécessaire.

Processus d’exploitation et de collecte

  1. Initier le handshake du wire-protocol en annonçant compressors:["zlib"] afin que la session utilise zlib.
  2. Envoyer des trames OP_COMPRESSED dont le uncompressedSize déclaré est bien plus grand que la charge utile réellement décompressée pour forcer allocation de heap surdimensionnée remplie de données anciennes.
  3. Façonner le BSON embarqué without a final \x00 pour que le parser dépasse attacker-controlled data et continue dans le tampon surdimensionné en cherchant un terminateur.
  4. MongoDB émet une erreur qui inclut le message original plus les octets du heap qui ont été scannés, leaking memory. Répéter avec des longueurs/décalages variables pour agréger des secrets (creds/API keys/session tokens), les stats WiredTiger et les artefacts /proc.

Le PoC public automatise le sondage des offsets et le carving des fragments retournés:

python3 mongobleed.py --host <target> --max-offset 50000 --output leaks.bin

Signal de bruit de détection (connexions à haut débit)

L’attaque génère généralement de nombreuses requêtes de courte durée. Surveillez les pics de connexions entrantes vers mongod/mongod.exe. Exemple de XQL hunt (>500 connections/min per remote IP, excluding RFC1918/loopback/link-local/mcast/broadcast/reserved ranges by default):

Cortex XQL connexions Mongo à haute fréquence ```sql // High-velocity inbound connections to mongod/mongod.exe (possible MongoBleed probing)

dataset = xdr_data | filter event_type = ENUM.NETWORK | filter lowercase(actor_process_image_name) in (“mongod”, “mongod.exe”) | filter action_network_is_server = true | filter action_remote_ip not in (null, “”) | filter incidr(action_remote_ip, “10.0.0.0/8”) != true and incidr(action_remote_ip, “192.168.0.0/16”) != true and incidr(action_remote_ip, “172.16.0.0/12”) != true and incidr(action_remote_ip, “127.0.0.0/8”) != true and incidr(action_remote_ip, “169.254.0.0/16”) != true and incidr(action_remote_ip, “224.0.0.0/4”) != true and incidr(action_remote_ip, “255.255.255.255/32”) != true and incidr(action_remote_ip, “198.18.0.0/15”) != true | filter action_network_session_duration <= 5000 | bin _time span = 1m | comp count(_time) as Counter by agent_hostname, action_remote_ip, _time | filter Counter >= 500

</details>


## Références

- [Unit 42 – Note sur la menace : Vulnérabilité MongoDB (CVE-2025-14847)](https://unit42.paloaltonetworks.com/mongobleed-cve-2025-14847/)
- [Tenable – CVE-2025-14847 (MongoBleed) : Vulnérabilité Memory Leak de MongoDB exploitée in the Wild](https://www.tenable.com/blog/cve-2025-14847-mongobleed-mongodb-memory-leak-vulnerability-exploited-in-the-wild)
- [Avis de sécurité MongoDB SERVER-115508](https://jira.mongodb.org/browse/SERVER-115508)
- [Censys – Avis MongoBleed](https://censys.com/advisory/cve-2025-14847)
- [MongoBleed PoC (joe-desimone/mongobleed)](https://github.com/joe-desimone/mongobleed)

---

> [!TIP]
> Apprenez et pratiquez le hacking AWS :<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="../../../../../images/arte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">\
> Apprenez et pratiquez le hacking GCP : <img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training GCP Red Team Expert (GRTE)**](https://training.hacktricks.xyz/courses/grte)<img src="../../../../../images/grte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
> Apprenez et pratiquez le hacking Azure : <img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">[**HackTricks Training Azure Red Team Expert (AzRTE)**](https://training.hacktricks.xyz/courses/azrte)<img src="../../../../../images/azrte.png" alt="" style="width:auto;height:24px;vertical-align:middle;">
>
> <details>
>
> <summary>Soutenir HackTricks</summary>
>
> - Vérifiez les [**plans d'abonnement**](https://github.com/sponsors/carlospolop) !
> - **Rejoignez le** 💬 [**groupe Discord**](https://discord.gg/hRep4RUj7f) ou le [**groupe telegram**](https://t.me/peass) ou **suivez-nous sur** **Twitter** 🐦 [**@hacktricks_live**](https://twitter.com/hacktricks_live)**.**
> - **Partagez des astuces de hacking en soumettant des PR au** [**HackTricks**](https://github.com/carlospolop/hacktricks) et [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) dépôts github.
>
> </details>