【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

admin 2022年9月14日16:12:16安全文章评论11 views7131字阅读23分46秒阅读模式

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

网安教育

培养网络安全人才

技术交流、学习咨询



01
 引言


众所周知,由于BC网站的特殊性,其运维团队每天的工资开销可达数十万元,这次拿到授权后,前前后后利用不同的漏洞多次拖了库,但不出意外,漏洞很快又被修复了,由于未拿到服务器权限,GA这边需要新的数据时,又只能去找漏洞拖库。时间久远,技术有限,现凭借回忆尽可能地还原整个测试过程,有错误和遗漏的地方还望表哥们多多指教!先上一波游戏截图:

【MongoDB】利用未授权访问和任意文件读取漏洞”拖库”及数据恢复

02
MongoDB未授权访问


1.漏洞成因


MongoDB服务安装后,默认未开启权限验证。如果服务监听在0.0.0.0,则可远程无需授权访问数据库

13.0之前版本的MongoDB,默认监听在0.0.0.0,3.0及之后版本默认监听在127.0.0.1
23.0之前版本,如未添加用户管理员账号及数据库账号,使用--auth参数启动时,在本地通过127.0.0.1仍可无需账号密码登陆访问数据库,远程访问则提示需认证;
33.0及之后版本,使用--auth参数启动后,无账号则本地和远程均无任何数据库访问权限。


MongoDB未授权访问漏洞分析及整改建议:https://www.freebuf.com/vuls/212799.html


2.第一次"拖库"


故事还得从一年前说起,记得是21年的3月,当天下午6点拿到站点目标,晚上9点就完成了拖库,中间甚至还上了一节选修课!老规矩,首先上fofa收集一下资产信息,27017端口,熟不熟悉?

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

直接上Navicat,一测试发现开局就送了一个未授权访问,还有这种事?

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

等于还没开始就结束了,我的工具我的脚本都还没用上,oh no!难道我"脚本小子"的称号要保不住了?

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

于是马上向领导汇报,得到批准后,立刻和室友py了一波,商量了一下拖库方案和注意事项,一切准备妥当后,直接上才艺!!!

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

接着就是漫长的等待和无尽的空虚......

上一波战果,发现这个站才新开了20天,就发展了12378个用户。后来才知道这个站是这伙人迁移过来的,有大部分是以前的老客户

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

03
任意文件读取/下载漏洞


MongoDB未授权访问的漏洞在第一次拖库后不久就被修复了,又过了一段时间,GA想要调取新的数据,压力又来到了我这边,只能继续找利用点,转头直接掏出AWVS,这玩意在没有WAF的时候真的香,可以扫漏洞、爬目录......,当然没有授权不要乱扫,要遵纪守法


1.寻找突破口


扫完后发现了一个目录遍历漏洞,但不是完全可控的目录遍历,所以不知道文件结构,只能fuzzing一下,目标是linux系统,先测试一下linux的敏感文件

上参考链接(大佬“谢公子”):https://blog.csdn.net/qq_36119192/article/details/86496362

 1Windows:
2   C:boot.ini  //查看系统版本
3   C:WindowsSystem32inetsrvMetaBase.xml  //IIS配置文件
4   C:Windowsrepairsam  //存储系统初次安装的密码
5   C:Program Filesmysqlmy.ini  //Mysql配置
6   C:Program Filesmysqldatamysqluser.MYD  //Mysql root
7   C:Windowsphp.ini  //php配置信息
8   C:Windowsmy.ini  //Mysql配置信息
9   ...
10Linux:
11   /etc/passwd                  #查看用户文件
12   /etc/shadow                  #查看密码文件,如果能读取该文件说明是root权限
13   /etc/my.cnf
14   /etc/httpd/conf/httpd.conf   #查看apache的配置文件
15   /root/.bash_history          #查看历史命令
16   /root/.mysql_history         #mysql历史命令记录文件
17   /var/lib/mlocate/mlocate.db  #本地所有文件信息
18   /etc/ssh/sshd_config         #ssh配置文件,如果对外开放可看到端口
19   /proc/self/fd/fd[0-9]*(文件标识符)
20   /proc/mounts
21   /porc/config.gz
22   /root/.ssh/authorized_keys
23   /root/.ssh/id_rsa
24   /root/.ssh/id_ras.keystore
25   /root/.ssh/known_hosts
26
27程序的配置文件
28apache:
29    /etc/httpd/conf/httpd.conf
30    /etc/apache2/httpd.conf
31    /etc/apache2/apache2.conf
32
33nginx:
34    /etc/nginx/nginx.conf
35    /usr/local/nginx/conf/nginx.conf
36    /usr/local/etc/nginx/nginx.conf
37redis:
38    /etc/redis.conf
39index.php?f=../../../../../../etc/passwd


查看历史命令/root/.bash_history时发现,很多mongodb的配置命令,这和我们之前的发现对应上了。在这之前还尝试了很多方法,目的是将目录遍历漏洞最大化利用,因为单单利用目录遍历漏洞想要getshell确实很困难,第一反应肯定是找数据库配置文件,然后在历史命令中找到了mongodb的配置文件路径:

/opt/mongodb/bin/mongodb.conf

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

这里可以看到允许任意地址连接的命令#bind_ip=0.0.0.0被注释掉了,这也能解释为什么后来数据库无法连接了,原来是在这里修复了。然后还发现了数据库路径:

dbpath=/opt/mongodb/data/db/和日志路径logpath

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

这里突然想到了一条思路,能不能利用任意文件读取/下载漏洞,将mongodb数据库的所有文件下载下来,再在本地恢复


2.MongoDB介绍


概念:

MongoDB是一个基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案。它是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。

以前没有接触过,所以这里前前后后花了很多时间去学习,从mongodb数据库的概念到安装、WT工具、数据打捞等等等等......附上截图:

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

目录结构:

数据库结构和常见的Mysql数据库完全不一样,如下图所示

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

 1|-- WiredTigerLAS.wt                   |存储的是内存里面lookaside table的持久化的数据
2|-- WiredTiger.wt                      |存储的是所有集合(包含系统自带的集合)相关数据文件和索引文件的checkpoint信息
3|-- WiredTiger.turtle                  |存储的是WiredTiger.wt这个文件的checkpoint数据信息
4|-- WiredTiger.lock                    |WiredTiger运行实例的锁文件,防止多个进程同时连接同一个Wiredtiger实例
5|-- WiredTiger                         |存储的是WiredTiger存储引擎的版本号,编译时间等信息
6|-- storage.bson                       |一个BSON格式的二进制文件,其内容与WiredTiger存储引擎的配置有关
7|-- sizeStorer.wt                      |存储所有集合的容量信息,如集合中包含的文档数、总数据大小
8|-- mongod.lock                        |MongoDB启动后在磁盘上创建的一个与守护进程mongod相关的锁文件
9|-- index-*--***.wt                    |索引文件
10|-- collection-*--***.wt               |数据文件
11|-- _mdb_catalog.wt                    |存储的是集合表名与磁盘上数据文件和索引文件间的对应关系


3.MongoDB拖库思路(第二次“拖库”)


接上文所说,想利用任意文件读取/下载漏洞来拖库,但是mongodb数据库的文件名大都是随机数命名的,由于目录结构未知,所以不知道文件名也没办法下载,然后又继续查阅资料(总结如上文的目录结构),发现mongodb数据库中的sizeSrorer.wt文件会存储所有集合的容量信息,如集合中包含的文档数、总数据大小。

试着先下载这个文件下来查看,打开后果然发现大量的集合名字,结合sizeSrorer.wt文件的定义,这里应该会包含所有数据库的集合名字

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

接着就将这个文件的所有collection-*--*.wt整理成规范的格式

然后测试sizeStorer.wt文件中的collection文件编号哪一个能正常下载

1collection-0-10888**
2collection-0-**23935***
3collection-0-**59974***


测试后发现collection-0-*23935***大部分能正常下载,由此判定该集合编号为当前还在使用的数据库,随后构造下载链接

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

注:

(1)第一次使用这个方法拖库时,以为索引inde和集合collection全部都要下载,后来发现只需要下载collection就可以了,因为索引index在后面会使用方法还原,这里就算下载下来也不能直接使用;

(2)一开始使用的是迅雷批量下载,但是使用中发现迅雷经常下载到一半就连接不上资源了,后来换用快车下载,稳定运行。

由于MongoDB数据库的特殊性,所有文件完整下载后并不能直接在本地复原,咨询了某宝数据恢复服务,居然要收我5500大洋,究竟是道德的沦丧,还是人性的泯灭!下一章将我自学的价值5500RMB的MongoDB数据库恢复教程分享给大家,方法不唯一,请大家指正!

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复


04
MongoDB数据库恢复


1.环境安装


MongoDB官网:https://www.mongodb.com/try/download/community

Wiredtiger官网:http://source.wiredtiger.com/index.html

我在kali上安装了MongoDB和Wiredtiger,本文环境路径:

MongoDB:/usr/local/mongodb/mongodb-linux-x86_64/bin/

Wiredtiger:/root/桌面/wiredtiger-3.2.1/wt


2.恢复步骤


(1)准备好需要的文件,目录结构如下:

1collection-2*-8***.wt    # 要恢复的collection文件若干
2_mdb_catalog.wt
3storage.bson
4WiredTiger
5WiredTiger.basecfg
6WiredTiger.lock
7WiredTiger.turtle
8WiredTiger.wt


【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

(2)使用wt打捞出可以被恢复的数据

这一步会读取指定的collection***.wt,忽略无法被恢复的数据,然后把新数据覆盖回去。

1./wt -v -h /root/桌面/dyj -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R salvage collection-2*-8***.wt
2


运行上述命令会输出WT_SESSION.salvage 600这样的结果,后面那个数量就是所有能被恢复的数据,但是现在还不能把这个直接恢复到MongoDB。

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

(3)wt --> dump

因为wt文件还没法直接用MongoDB读,所以这一步将刚打捞出来的wt文件dump到上级目录的collection.dump文件

1./wt -v -h /root/桌面/dyj -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R dump -f ../collection1.dump collection-2*-8***


(4)创建新的collection以接收恢复数据

 1#启动一个新的Mongo实例
2./mongod --dbpath tmp-mongo --storageEngine wiredTiger --nojournal
3#启动MongoDB
4./mongod --config /usr/local/mongodb/etc/mongodb.conf
5#创建一个叫做test1的数据库
6./mongo
7> use test1
8> db.brokedCollection.insert({test: 1})
9> db.brokedCollection.remove({})
10#stats()方法可以查看集合所对应的wt文件名称,如下图所示,记录下该名称后面会用到
11> db.brokedCollection.stats()
12#关闭MongoDB
13> use admin
14> db.shutdownServer()


【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复


(5)dump --> new wt

把第三步转出来的dump文件读入上一步生成的collection文件

1./wt -v -h /usr/local/mongodb/data -C "extensions=[./ext/compressors/snappy/.libs/libwiredtiger_snappy.so]" -R load -f /root/桌面/collection1.dump -r collection-2*-8***


(6)备份与恢复

1./mongod --config /usr/local/mongodb/etc/mongodb.conf
2./mongodump
3./mongorestore --drop


(7)导出数据库

1./mongoexport --db test1 --collection brokedCollection --out /home/test1.json


05
网站后台


1.后台地址


某天GA发来消息,说在某犯罪嫌疑人的聊天记录里发现了该网站的后台地址,为了更准确地理解数据库的数据,GA要求拿到后台权限。GA提供的后台地址:http://***/****/admin/login.html

打开后发现,登录需要手机验证码(这里可以发送验证码后再拖库拿到验证码,但是害怕打草惊蛇就放弃了)


2.信息再收集


因为后台地址中admin上一层/*/为强口令,所以想着在这一层级再目录扫描一次,看有没有新发现。使用dirsearch扫描后发现了一个新的登录地址,并且该登录地址不需要验证码登录:

无需验证码登录地址:http:///****/adminLogin.html


3.BurpSuite爆破


数据库中拿到了4个管理员账号,但是密码加密方式未知,都未破解成功。于是掏出BurpSuite挂了个爆破,弱口令又是弱口令。。。其中一个账号爆出了弱口令,成功登录

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

真正的测试过程肯定不如文章中一步一步走的这样顺利,其中有很多曲折和弯路,最重要的一点就是耐心,不断地信息收集与利用终能找到突破口!


【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

文:MD labs

原文链接:http://www.mdlabs.cn/index.php/2022/04/01/%e6%b8%97%e9%80%8f%e7%ac%94%e8%ae%b0%ef%bc%9a%e4%bb%8e%e4%bb%bb%e6%84%8f%e6%96%87%e4%bb%b6%e8%af%bb%e5%8f%96%e6%bc%8f%e6%b4%9e%e5%88%b0%e6%8b%96%e5%ba%93%e5%8f%8a%e6%8b%bf%e5%88%b0%e7%bd%91/

版权声明:著作权归作者所有。如有侵权请联系删除


开源聚合网安训练营

战疫期间,开源聚合网络安全基础班、实战班线上全面开启,学网络安全技术、升职加薪……有兴趣的可以加入开源聚合网安大家庭,一起学习、一起成长,考证书求职加分、升级加薪,有兴趣的可以咨询客服小姐姐哦!

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复

加QQ(1005989737)找小姐姐私聊哦



精选文章


环境搭建
Python
学员专辑
信息收集
CNVD
安全求职
渗透实战
CVE
高薪揭秘
渗透测试工具
网络安全行业
神秘大礼包
基础教程
我们贴心备至
用户答疑
 QQ在线客服
加入社群
QQ+微信等着你

【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复


我就知道你“在看”
【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复




原文始发于微信公众号(开源聚合网络空间安全研究院):【MongoDB】利用未授权访问和任意文件读取漏洞”拖库”及数据恢复

特别标注: 本站(CN-SEC.COM)所有文章仅供技术研究,若将其信息做其他用途,由用户承担全部法律及连带责任,本站不承担任何法律及连带责任,请遵守中华人民共和国安全法.
  • 我的微信
  • 微信扫一扫
  • weinxin
  • 我的微信公众号
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年9月14日16:12:16
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                  【MongoDB】利用未授权访问和任意文件读取漏洞拖库及数据恢复 http://cn-sec.com/archives/1294660.html

发表评论

匿名网友 填写信息

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: