Python武器库开发-武器库篇之Mongodb未授权漏洞扫描器(五十六)
MongoDB 未授权访问漏洞简介以及危害
MongoDB是一款非常受欢迎的开源NoSQL数据库,广泛应用于各种Web应用和移动应用中。然而,由于默认配置的不当或者管理员的疏忽,导致不少MongoDB数据库处于未授权访问的状态,从而产生了潜在的安全风险。
未授权访问漏洞指的是在MongoDB数据库中,没有设置正确的访问控制权限,导致攻击者可以直接访问数据库,获取或者修改敏感数据。这种漏洞的出现主要有以下几个原因:
-
默认配置问题:MongoDB在默认情况下是没有开启身份验证机制的,这就意味着任何人都可以直接连接数据库并执行操作。
-
管理员疏忽:在配置MongoDB时,管理员没有设置访问控制权限,或者设置了弱密码,容易被攻击者猜测或者暴力破解。
-
数据库暴露:有些MongoDB数据库直接暴露在公网上,没有进行网络隔离或者访问限制,这样攻击者可以直接访问数据库。
攻击者可以通过扫描公网IP或者进行端口强行连接的方式,探测MongoDB数据库是否存在未授权访问漏洞。一旦发现漏洞,攻击者可以通过数据库的各种操作命令,获取、修改或者删除数据库中的数据。这对于企业来说是非常危险的,可能导致重要数据的泄露或者篡改。
开启MongoDB服务时不添加任何参数时,默认是没有权限验证的,登录的用户可以通过默认端⼝⽆需密码对数据库任意操作(增、删、改、查高危动作)而且可以远程访问数据库。
造成未授权访问的根本原因就在于启动 Mongodb 的时候未设置 --auth ,也很少会有人会给数据库添加上账号密码(默认空口令),使⽤默认空口令这将导致恶意攻击者无需进行账号认证就可以登陆到数据服务器。
环境搭建
主机 | IP |
---|---|
kali | 192.168.41.132 |
在这⾥我们使⽤kali搭建Mongodb未授权环境,在Kali Linux上安装MongoDB并配置为未授权访问有以下步骤:
- 打开终端并执行以下命令以安装MongoDB:
python
sudo apt update
sudo apt install mongodb
- 安装完成后,MongoDB会自动启动。您可以使用以下命令检查MongoDB是否正在运行:
python
sudo systemctl status mongodb
- 确认MongoDB正在运行后,打开配置文件:
python
sudo nano /etc/mongodb.conf
在配置文件中找到bind_ip行并将其注释或将其更改为0.0.0.0,这将允许从任何IP地址访问MongoDB。
- 然后保存并关闭配置文件,在nano中保存并关闭配置文件的方法是按下Ctrl+O组合键,然后按下Enter键来保存文件,最后按下Ctrl+X组合键来关闭nano编辑器。然后重新启动MongoDB服务:
python
sudo systemctl restart mongodb
现在,MongoDB已经配置为允许未授权访问。
实验代码
首先,请确保已经安装了pymongo库,可以使用以下命令进行安装:
python
pip install pymongo
接下来我们用python写一段测试Mongodb未授权漏洞的代码,代码内容如下:
python
import pymongo
# 设置MongoDB连接参数
host = "host" # MongoDB的IP地址
port = 27017 # MongoDB的端口
# 尝试连接MongoDB
try:
client = pymongo.MongoClient(host, port, serverSelectionTimeoutMS=2000)
db = client.admin
# 使用isMaster命令检查是否授权访问
response = db.command('ismaster')
if response['ok'] == 1:
print("MongoDB 未授权访问漏洞存在")
else:
print("MongoDB 未授权访问漏洞不存在")
except pymongo.errors.ServerSelectionTimeoutError as err:
print("MongoDB连接失败:", err)
在代码中,我们使用pymongo
库连接到MongoDB实例,并尝试执行isMaster
命令来检查是否授权访问。如果成功执行,说明存在未授权访问漏洞,否则说明不存在此漏洞。
这段代码是用来检测MongoDB
是否存在未授权访问漏洞的。
首先,通过import pymongo
导入了pymongo
库,这是一个用于连接和操作MongoDB
数据库的Python库。
然后,定义了MongoDB
的连接参数host
和port
,分别表示MongoDB
的IP地址和端口。
接下来,使用pymongo.MongoClient
方法尝试连接MongoDB
,其中传入了host
、port
以及serverSelectionTimeoutMS=2000
参数。serverSelectionTimeoutMS
参数用于设置服务器选择超时时间,如果在指定时间内无法连接到MongoDB
,则会抛出pymongo.errors.ServerSelectionTimeoutError
异常。
如果成功连接到MongoDB
,会将连接对象赋值给client
变量,然后选择admin
数据库并将其赋值给db
变量。
然后,使用db.command('ismaster')
命令检查是否授权访问。ismaster
命令用于返回MongoDB
服务器的状态信息,如果返回的字典中ok键的值为1,则表示成功连接并授权访问;如果ok键的值不为1,则表示存在未授权访问漏洞。
最后,根据返回的状态信息输出相应的结果,如果ok值为1,则表示存在未授权访问漏洞,否则表示不存在未授权访问漏洞。
如果在连接过程中出现了pymongo.errors.ServerSelectionTimeoutError
异常,则说明连接失败,会输出连接失败的信息。
运行效果
如图我们的代码成功测试出了目标服务器上存在Mongodb未授权漏洞。