27017,27018 - Pentesting MongoDB

Reading time: 4 minutes

tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks

Основна інформація

MongoDB є системою управління базами даних з відкритим кодом, яка використовує модель бази даних, орієнтовану на документи, для обробки різноманітних форм даних. Вона пропонує гнучкість і масштабованість для управління неструктурованими або напівструктурованими даними в таких застосунках, як аналітика великих даних і управління контентом. Порт за замовчуванням: 27017, 27018

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

Перерахування

Вручну

python
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

Деякі команди MongoDB:

bash
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

Автоматичний

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

Shodan

  • Всі mongodb: "mongodb server information"
  • Шукати повністю відкриті mongodb сервери: "mongodb server information" -"partially enabled"
  • Тільки частково увімкнено автентифікацію: "mongodb server information" "partially enabled"

Login

За замовчуванням mongo не вимагає пароля.
Admin є загальною базою даних mongo.

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

Скрипт nmap: mongodb-brute перевірить, чи потрібні облікові дані.

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

Brute force

Перегляньте /opt/bitnami/mongodb/mongodb.conf, щоб дізнатися, чи потрібні облікові дані:

bash
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

Приклад з тут.

Mongo Object ID - це 12-байтові шістнадцяткові рядки:

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

Наприклад, ось як ми можемо розібрати фактичний Object ID, повернутий додатком: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 в десятковій системі = п'ятниця, 31 липня 2020 17:49:32
  2. 9fa6dc: Ідентифікатор машини
  3. 2500: Ідентифікатор процесу
  4. 314019: Інкрементний лічильник

З вищезазначених елементів, ідентифікатор машини залишиться незмінним, поки база даних працює на тій же фізичній/віртуальній машині. Ідентифікатор процесу зміниться лише в разі перезапуску процесу MongoDB. Часова мітка буде оновлюватися кожну секунду. Єдина проблема в тому, щоб вгадати Object ID, просто інкрементуючи значення лічильника та часової мітки, полягає в тому, що Mongo DB генерує Object ID та призначає Object ID на системному рівні.

Інструмент https://github.com/andresriancho/mongo-objectid-predict, отримавши початковий Object ID (ви можете створити обліковий запис і отримати початковий ID), повертає близько 1000 ймовірних Object ID, які могли бути призначені наступним об'єктам, тому вам просто потрібно їх брутфорсити.

Пост

Якщо ви root, ви можете модифікувати файл mongodb.conf, щоб не потрібно було вводити облікові дані (noauth = true) і увійти без облікових даних.


tip

Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)

Підтримайте HackTricks