# 27017,27018 - Pentesting MongoDB {{#include ../banners/hacktricks-training.md}} ## 基本情報 **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 show collections db..find() #Dump the collection db..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 #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 mongo : mongo :/ mongo -u -p '' ``` nmapスクリプト: _**mongodb-brute**_ は、認証情報が必要かどうかを確認します。 ```bash nmap -n -sV --script mongodb-brute -p 27017 ``` ### [**ブルートフォース**](../generic-hacking/brute-force.md#mongo) _/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 予測 Example [from here](https://techkranti.com/idor-through-mongodb-object-ids-prediction/). Mongo Object IDsは**12バイトの16進数**文字列です: ![http://techidiocy.com/_id-objectid-in-mongodb/](../images/id-and-ObjectIds-in-MongoDB.png) 例えば、アプリケーションから返された実際のObject IDを分解すると、次のようになります:5f2459ac9fa6dc2500314019 1. 5f2459ac: 1596217772(10進数)= 2020年7月31日金曜日 17:49:32 2. 9fa6dc: マシン識別子 3. 2500: プロセスID 4. 314019: インクリメンタルカウンター 上記の要素のうち、マシン識別子はデータベースが同じ物理/仮想マシンで実行されている限り同じままです。プロセスIDはMongoDBプロセスが再起動されるとのみ変更されます。タイムスタンプは毎秒更新されます。カウンターとタイムスタンプの値を単純にインクリメントしてObject IDsを推測する際の唯一の課題は、Mongo DBがObject IDsを生成し、システムレベルでObject IDsを割り当てるという事実です。 ツール[https://github.com/andresriancho/mongo-objectid-predict](https://github.com/andresriancho/mongo-objectid-predict)は、開始Object IDを与えると(アカウントを作成して開始IDを取得できます)、次のオブジェクトに割り当てられる可能性のある約1000の推定Object IDsを返しますので、それらをブルートフォースするだけです。 ## Post もしあなたがrootであれば、**mongodb.conf**ファイルを**変更**して、認証情報が不要になるようにできます(_noauth = true_)そして**認証情報なしでログイン**できます。 --- {{#include ../banners/hacktricks-training.md}}