hacktricks/network-services-pentesting/27017-27018-mongodb.md
2024-02-11 02:07:06 +00:00

13 KiB

27017,27018 - Pentesting MongoDB

Leer AWS-hacking van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun:

Sluit aan by die HackenProof Discord bediener om te kommunikeer met ervare hackers en foutjagters!

Hacking-insigte
Gaan in gesprek met inhoud wat die opwinding en uitdagings van hacking ondersoek

Hack-nuus in werklikheid
Bly op hoogte van die vinnige wêreld van hacking deur middel van werklike nuus en insigte

Nuutste aankondigings
Bly ingelig met die nuutste foutjagbountes wat bekendgestel word en belangrike platform-opdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Basiese Inligting

MongoDB is 'n oopbron databasisbestuurstelsel wat 'n dokumentgeoriënteerde databasismodel gebruik om diverse vorms van data te hanteer. Dit bied buigsaamheid en skaalbaarheid vir die bestuur van ongestruktureerde of semi-gestruktureerde data in toepassings soos groot data-analise en inhoudsbestuur. Verstekpoort: 27017, 27018

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

Opstel

Handleiding

Om MongoDB-databasisse te enumerasieer, kan jy die volgende stappe volg:

  1. Identifiseer die IP-adres en poort van die MongoDB-diens.

  2. Maak 'n verbinding met die MongoDB-diens deur die mongo-klient te gebruik.

  3. Voer die volgende opdrag in om die lys van databasisse te sien:

    show dbs
    
  4. Voer die volgende opdrag in om die huidige databasis te kies:

    use <databasisnaam>
    
  5. Voer die volgende opdrag in om die lys van kolleksies in die databasis te sien:

    show collections
    
  6. Voer die volgende opdrag in om die dokumente in 'n spesifieke kolleksie te sien:

    db.<kolleksienaam>.find()
    

Deur hierdie stappe te volg, kan jy die MongoDB-databasisse en hul inhoud ondersoek.

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

Sommige MongoDB-opdragte:

# Show databases
# Wys databasisse
show databases

# Use a specific database
# Gebruik 'n spesifieke databasis
use <database_name>

# Show collections in the current database
# Wys versamelings in die huidige databasis
show collections

# Show documents in a collection
# Wys dokumente in 'n versameling
db.<collection_name>.find()

# Insert a document into a collection
# Voeg 'n dokument by 'n versameling in
db.<collection_name>.insertOne({<document>})

# Update a document in a collection
# Werk 'n dokument in 'n versameling op
db.<collection_name>.updateOne({<filter>}, {$set: {<update>}})

# Delete a document from a collection
# Verwyder 'n dokument uit 'n versameling
db.<collection_name>.deleteOne({<filter>})

Enumeration:

# Enumerate databases
# Enumereer databasisse
show databases

# Enumerate collections in a database
# Enumereer versamelings in 'n databasis
show collections

# Enumerate documents in a collection
# Enumereer dokumente in 'n versameling
db.<collection_name>.find()

Exploitation:

# Dump all databases
# Stort alle databasisse
mongodump --out <output_directory>

# Restore a database
# Herstel 'n databasis
mongorestore <input_directory>

# Execute OS commands
# Voer OS-opdragte uit
db.runCommand({$eval: "<command>"})

# Remote Code Execution (RCE)
# Verrekenaarkode-uitvoering (RCE)
db.runCommand({$where: "<code>"})

Privilege Escalation:

# Create a new user with root role
# Skep 'n nuwe gebruiker met 'n root-rol
use admin
db.createUser({user: "<username>", pwd: "<password>", roles: ["root"]})

# Authenticate as a user
# Verifieer as 'n gebruiker
use admin
db.auth("<username>", "<password>")

Exfiltration:

# Export a collection to a JSON file
# Voer 'n versameling uit na 'n JSON-lêer
mongoexport --db <database_name> --collection <collection_name> --out <output_file>.json

# Import a JSON file into a collection
# Voer 'n JSON-lêer in 'n versameling in
mongoimport --db <database_name> --collection <collection_name> --file <input_file>.json

Other:

# Show server status
# Wys bedienerstatus
db.serverStatus()

# Show current user
# Wys huidige gebruiker
db.runCommand({connectionStatus: 1})
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

Outomatiese

nmap -p 27017,27018 --script mongodb-info <target>

Hierdie opdrag gebruik die nmap-hulpmiddel om die poorte 27017 en 27018 op die teiken te skandeer en die mongodb-info skripsie uit te voer. Hierdie skripsie sal probeer om inligting oor die MongoDB-diens te verkry, soos die weergawe, die databasisse wat beskikbaar is en die dokumente binne-in die databasisse.

mongo --host <target> --port 27017

Hierdie opdrag maak 'n verbinding met die MongoDB-diens op die teiken deur die mongo-kliënt te gebruik. Dit vereis die spesifisering van die teiken se IP-adres (<target>) en die poort (27017). Hierdie opdrag sal jou in staat stel om direk met die MongoDB-diens te kommunikeer en verskillende opdragte uit te voer.

show dbs

Hierdie opdrag sal 'n lys van alle databasisse wat beskikbaar is op die MongoDB-diens toon.

use <database>

Hierdie opdrag sal oorskakel na die gespesifiseerde databasis (<database>) sodat jy opdragte binne-in daardie databasis kan uitvoer.

show collections

Hierdie opdrag sal 'n lys van alle versamelings binne-in die huidige databasis toon.

db.<collection>.find()

Hierdie opdrag sal alle dokumente binne-in die gespesifiseerde versameling (<collection>) in die huidige databasis toon.

db.<collection>.find(<query>)

Hierdie opdrag sal alle dokumente binne-in die gespesifiseerde versameling (<collection>) in die huidige databasis toon wat voldoen aan die gespesifiseerde vraag (<query>). Die vraag kan verskillende kriteria insluit, soos veldwaardes, vergelykingsoperatore en logiese operatore.

db.<collection>.insert(<document>)

Hierdie opdrag sal 'n nuwe dokument invoeg in die gespesifiseerde versameling (<collection>) in die huidige databasis. Die dokument moet in JSON-formaat wees en die veldwaardes moet ooreenstem met die versameling se skema.

db.<collection>.update(<query>, <update>)

Hierdie opdrag sal een of meer dokumente binne-in die gespesifiseerde versameling (<collection>) in die huidige databasis opdateer wat voldoen aan die gespesifiseerde vraag (<query>). Die opdatering moet in JSON-formaat wees en kan verskillende opdateringsoperasies insluit, soos $set, $unset, $inc, $push, ensovoorts.

db.<collection>.remove(<query>)

Hierdie opdrag sal een of meer dokumente binne-in die gespesifiseerde versameling (<collection>) in die huidige databasis verwyder wat voldoen aan die gespesifiseerde vraag (<query>).

exit

Hierdie opdrag sal die huidige mongo-sessie afsluit en jou terugbring na die opdraglyn.

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

Shodan

  • Alle mongodb: "mongodb bediener inligting"
  • Soek na volledig oop mongodb bedieners: "mongodb bediener inligting" -"gedeeltelik geaktiveer"
  • Slegs gedeeltelik geaktiveerde outentifikasie: "mongodb bediener inligting" "gedeeltelik geaktiveer"

Aanteken

Standaard vereis mongo nie 'n wagwoord nie.
Admin is 'n algemene mongo databasis.

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

Die nmap-skrip: mongodb-brute sal nagaan of geloofwaardigheidsbewyse benodig word.

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

Brute force

Kyk binne in /opt/bitnami/mongodb/mongodb.conf om uit te vind of geloofsbriewe benodig word:

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 Voorspelling

Voorbeeld van hier.

Mongo Object IDs is 12-byte heksadesimale strings:

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

Byvoorbeeld, hier is hoe ons 'n werklike Object ID kan ontleed wat deur 'n toepassing teruggegee word: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 in desimaal = Vrydag, 31 Julie 2020 17:49:32
  2. 9fa6dc: Masjien-identifiseerder
  3. 2500: Proses-ID
  4. 314019: 'n Inkrementele teller

Van die bogenoemde elemente sal die masjien-identifiseerder dieselfde bly solank as wat die databasis dieselfde fisiese/virtuele masjien gebruik. Die proses-ID sal slegs verander as die MongoDB-proses herlaai word. Die tydstempel sal elke sekonde opdateer word. Die enigste uitdaging in die raai van Object IDs deur eenvoudig die teller- en tydstempelwaardes te verhoog, is die feit dat Mongo DB Object IDs genereer en toewys op 'n stelselvlak.

Die instrument https://github.com/andresriancho/mongo-objectid-predict, gee 'n begin Object ID (jy kan 'n rekening skep en 'n begin-ID kry), dit stuur terug omtrent 1000 waarskynlike Object IDs wat moontlik toegewys kon gewees het aan die volgende voorwerpe, sodat jy hulle net hoef te kragtewerk.

Plaas

As jy root is, kan jy die mongodb.conf-lêer verander sodat geen geloofsbriewe nodig is (noauth = true) en sonder geloofsbriewe aanmeld.


Sluit aan by HackenProof Discord bediener om met ervare hackers en foutjagters te kommunikeer!

Hacking-insigte
Gaan in gesprek met inhoud wat die opwinding en uitdagings van hackering ondersoek

Real-Time Hack Nuus
Bly op hoogte van die vinnige hackeringwêreld deur middel van real-time nuus en insigte

Nuutste Aankondigings
Bly ingelig met die nuutste foutjagings wat begin en noodsaaklike platformopdaterings

Sluit aan by ons op Discord en begin vandag saamwerk met top hackers!

Leer AWS hackering van nul tot held met htARTE (HackTricks AWS Red Team Expert)!

Ander maniere om HackTricks te ondersteun: