欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

MongoDB未授权访问漏洞分析及整改建议

来源:本站整理 作者:佚名 时间:2019-09-11 TAG: 我要投稿

在前段时间的Defcon会议上,Nmap发布了7.8版本,包括了Npcap抓包驱动程序更新和80多项NSE脚本、库等更新,中文版更新详情看这里。查看更新内容是,突然发现关于Mongodb的NSE脚本更新似曾相识,点进去一看,还真是之前我提交的#1565bug修复请求。    年初MongoDB数据库未授权访问漏洞造成的数据泄露事件频发,因工作需要关注了这个漏洞,网上搜索资料,发现从漏洞检测到漏洞整改,网上已有的方法、工具均存在或多或少的问题,漏洞整改建议也不完整或过时。于是对当时已有的各个Mongodb版本均做了测试,重新梳理了漏洞检测方法及漏洞整改建议,形成了这篇文档。
一、漏洞危害
对外开放的MongoDB服务,未配置访问认证授权,无需认证连接数据库后对数据库进行任意操作(增、删、改、查高危动作),存在严重的数据泄露风险。
二、漏洞成因
MongoDB服务安装后,默认未开启权限验证。如果服务监听在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参数启动后,无账号则本地和远程均无任何数据库访问权限。
三、漏洞验证
MongoDB存在未授权访问漏洞时,使用MongoDB的高版本shell工具mongo(高版本兼容低版本)直接连接成功,执行show dbs命令,无报错信息,列表存在默认库local库,则判断存在未授权访问(local库即便删除,重启MongoDB后仍会生成)。
C:\ "C:\Program Files\MongoDB\Server\4.0\bin\mongo.exe" 127.0.0.1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
test    0.000GB
部分版本默认不存在admin库,但如果创建了用户管理员账号,这个库一定存在,如果存在admin库,可以进入该库查看是否有用户,有用户则表示添加了用户管理员账号,但未使用--auth参数启动。
> use admin
switched to db admin
> show users
{
        "_id" : "admin.admin",
        "user" : "admin",
        "db" : "admin",
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ],
        "mechanisms" : [
                "SCRAM-SHA-1",
                "SCRAM-SHA-256"
        ]
}
也可以使用图形化界面管理工具连接服务进行测试。
Robo 3T下载地址:https://robomongo.org/download,建议使用1.2.1版本,使用1.3及之后版本的话,服务端如果使用较低版本MongoDB,存在未授权访问时仍无法连接。
四、整改建议
4.1. 方案1:本地监听
如MongoDB只需在本地使用,建议只在本地开启监听服务,使用--bind_ip 127.0.0.1绑定监听地址。
$ mongod --bind_ip 127.0.0.1 --dbpath /tmp/test
或:在配置文件中指定监听IP,Linux下默认配置文件为/etc/mongod.conf。
# network interfaces
net:
  port: 27017
  bindIp: 127.0.0.1
指定配置文件启动
mongod --config /etc/mongod.conf
3.0及之后版本的MongoDB,监听服务默认在127.0.0.1开启。
4.2. 方案2:限制访问源
如果仅对内网服务器提供服务,建议禁止将MongoDB服务发布到互联网上,并在主机上通过防火墙限制访问源IP。
Linux主机,使用iptables进行限制:
iptables -A INPUT -s  -p tcp --destination-port 27017 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -d  -p tcp --source-port 27017 -m state --state ESTABLISHED -j ACCEPT
替换成需访问MongoDB服务的IP;第一条规则允许外部应用访问MongoDB默认服务端口27017,第二条规则允许MongoDB外出流量到达外部应用。Windows主机,可以通过图形管理界面添加防火墙策略或使用netsh命令添加,参考文档:https://docs.mongodb.com/manual/tutorial/configure-windows-netsh-firewall/
4.3. 方案3:启动基于角色的登录认证功能
MongoDB支持SCRAM、x.509证书认证等多种认证机制,SCRAM(Salted Challenge Response Authentication Mechanism)是3.x版本的默认认证机制,该机制通过用户名、密码验证,基于用户角色进行访问控制。下面是添加账号认证的方法:
MongoDB 3.0及以上版本启动时添加--auth参数开启认证访问,此时若数据库中无账号,本地登录则无权限进行任何操作,因此需要先以无认证的方式启动服务并创建系统用户管理员账号。
1)以无访问认证的方式启动MongoDB
$ mongod --dbpath /data/db
2)未开启认证的环境下,登录到数据库
$ mongo --host 127.0.0.1 --port 27017

[1] [2] [3]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载