27017,27018 - Pentesting MongoDB

Reading time: 4 minutes

tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: 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"

로그인

기본적으로 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바이트 16진수 문자열입니다:

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

예를 들어, 애플리케이션에서 반환된 실제 Object ID를 분해해 보겠습니다: 5f2459ac9fa6dc2500314019

  1. 5f2459ac: 1596217772 (10진수) = 2020년 7월 31일 금요일 17:49:32
  2. 9fa6dc: 머신 식별자
  3. 2500: 프로세스 ID
  4. 314019: 증가 카운터

위 요소 중 머신 식별자는 데이터베이스가 동일한 물리적/가상 머신에서 실행되는 한 동일하게 유지됩니다. 프로세스 ID는 MongoDB 프로세스가 재시작될 때만 변경됩니다. 타임스탬프는 매초 업데이트됩니다. 카운터와 타임스탬프 값을 단순히 증가시켜 Object ID를 추측하는 데 유일한 도전 과제는 Mongo DB가 Object ID를 생성하고 시스템 수준에서 Object ID를 할당한다는 사실입니다.

도구 https://github.com/andresriancho/mongo-objectid-predict는 시작 Object ID를 제공하면 (계정을 생성하고 시작 ID를 얻을 수 있습니다), 다음 객체에 할당될 수 있는 약 1000개의 가능한 Object ID를 반환하므로 이를 브루트포스하면 됩니다.

게시물

루트 권한이 있는 경우 mongodb.conf 파일을 수정하여 자격 증명이 필요 없도록 할 수 있습니다 (noauth = true) 그리고 자격 증명 없이 로그인할 수 있습니다.


tip

AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)

HackTricks 지원하기