天天看点

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

MongoDB未授权访问

漏洞危害

MongoDB服务开放在公网上时,若未配置访问认证授权,则攻击者可无需认证即可连接数据库,对数据库进行任何操作(增、删、改、查等高危操作),并造成严重的敏感泄露风险。

漏洞成因

MongoDB服务安装后,默认未开启权限认证,且服务监听在0.0.0.0.,会造成远程未授权访问漏洞

在mongo数据库服务监听在0.0.0.0的情况下,若未在admin数据库中添加任何账号,且未使用–auth参数启动mongoDB服务,则会造成未授权访问(二者缺一不可)。只有添加在admin中添加了账号,并使用–auth参数启动时,Mongodb的认证授权服务才能生效

环境搭建

测试机:

kali——ip:192.168.0.109

windows——ip:192.168.0.113

靶机:

CentOS7——ip:192.168.0.114

漏洞环境采用docker搭建

拉取mongo镜像

docker pull mongo
           

创建一个新的容器并运行命令

docker run -d -p 27017:27017 mongo
           

显示正在运行的容器

可以看到数据库mongodb服务的容器id:e4fce18258c2 和其开放ip段、端口为0.0.0.0:27017

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

查看mongodb数据库的版本

docker exec e4fce18258c2 mongo -version
           
MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

漏洞复现

通过上面的mongo状态可以看到,数据库开放地址为0.0.0.0:27017,且数据库未通过–auth登录过,所以此时mongodb数据库的认证机制不能正常工作的,外部可以无需认证即可直接连接数据库

复现

使用msf中mongodb登录的辅助模块进行攻击演示

use auxiliary/scanner/mongodb/mongodb_login
set rhost 192.168.0.114     
exploit
           

结果显示Mongo server没有开启认证

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

使用图像化界面连接MongoDB数据库

图形化工具下载地址

https://robomongo.org/download

下载——安装——连接,没什么好说的

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

连接成功

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

防御加固测试

在靶机上添加管理员用户

docker exec -it <容器id> /bin/bash
mongo 172.17.0.1        //不使用--auth参数连接数据库
>show dbs
>use admin
>db.createUser({user:"admin",pwd:"123456",roles:["root"]})
>db.createUser({user:"test",pwd:"123456",roles:["root"]})
           

创建成功

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

通过远程图形连接界面可以看到成功创建了两个管理员用户

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

我们靶机上是并没有通过–auth参数开启mongo服务的,所以即使现在创建了管理员账户也还是可以不用认证而连接mongo数据库

删除连接

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问
MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

再次直连

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

仍然可以无需认证而连接成功

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

接下来我们停止mongo服务,添加–auth参数再开启

mongo 172.17.0.1
>use admin
>db.shutdownServer()
           
MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

添加–auth参数开启docker,mongo

docker run -d -p 27017:27017 mongo --auth
           
MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

注意,因为我们关闭mongo服务时连docker一起关闭了,所以现在开启的mongo中是没有我们上面添加的账号信息的,为了验证授权登录,这里我们再次设置一个管理员账号

db.createUser({user:“admin”,pwd:“123456”,roles:[“root”]})

开启成功,再次使用图形化界面连接

连接失败,说明认证开启成功了

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

输入账号密码进行认证

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问
MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

授权验证连接成功

MongoDB未授权访问漏洞复现及docker.mongodb下--auth授权验证MongoDB未授权访问

防御

0.修改默认端口(不太有用)

1.只开启本地监听

2.限制访问源,只对内网提供服务

3.启动服务时,添加–auth参数开启访问认证

4.禁用HTTP和REST端口

参考

https://www.freebuf.com/vuls/212799.html

注:本文中极大的简化了启动mongo数据库服务时的命令参数,不建议开发人员参考本文使用mongodb数据库,如有意外,概不负责。

开发人员学习mongodb请移步https://www.runoob.com/mongodb/mongodb-databases-documents-collections.html