Background
打津门红帽的时候发现有一个国外的比赛就报了名,简单看了看题感觉有趣新颖,后来就没怎么细看,所以比赛结束结合offical writeups 我来写一下我的收获
gets-request
nodejs题目,po 代码
const spawn = require('child_process').spawn;
const express = require('express');
const PORT = process.env.PORT || 8080;
const app = express();
const BUFFER_SIZE = 8;
app.get('/prime', (req, res) => {
if(!req.query.n) {
res.status(400).send('Missing required parameter n');
return;
}
if(req.query.n.length > BUFFER_SIZE) {
res.status(400).send('Requested n too large!');
return;
}
let output = '';
const proc = spawn(__dirname + '/primegen');
proc.stdout.on('data', data => output += data.toString());
proc.on('exit', () => res.send(output));
// call our super-efficient native prime generator!
proc.stdin.write(`${req.query.n}\n`);
})
app.use('/', (req, res) => {
res.sendFile(__dirname + '/index.html');
});
app.use('*', (req, res) => {
res.status(404).send('Not Found');
});
app.listen(PORT, () => {
console.log(`prime generator listening at http://localhost:${PORT}`)
})
当时第一遍看觉得一点问题没有,就一个简单的代码,也没有flag相关字样 尤其看到BUFFER_SIZE字样我以为是webpwn,就直接不看了
赛后一看,还真的蛮有意思的
其实一想到弱类型语言传参就该考虑有没有啥特殊的情况,这道题设置BUFFER_SIZE为8位
if(req.query.n.length > BUFFER_SIZE) {
res.status(400).send('Requested n too large!');
return;
}
我们的长度是不能超过8位的 不然就直接return
proc.stdin.write(`${req.query.n}\n`);
而这个东西是要被写进去的,所以我们如果想办法让他overflow 退出之后可能就会获得flag
所以思路就变成了绕过上面的if
这里面我们如果尝试以数组方式的传入 .length将会等于数组里面的种类,
如果我们input n[]=6666666666666666666666666
.length=6是小于8的 然后我们不断增加数字的个数来试探overflow
最终payload:n[]=55555355255515555545556557555555555556
任意即可
buffer overflow! sdctf{B3$T_0f-b0TH_w0rLds}
其实这种题目 google2020 Dice2021都有提及
原因是
app.use(bodyParser.urlencoded({
extended: true
}));
此设置允许传入其他类型(数组,对象),而不仅仅是字符串。
git-good
访问在robots.txt下面有
/admin.html
/.git/
再结合git -good 应该是git泄漏
访问admin.html
我的githack并没有获得好效果,后来发现师傅们都在用gittools,首先使用Dumper全down下来,然后使用extractor恢复
在commit修改记录里面发现有users.db 如果我们恢复数据库 应该也就结束了
登陆admin.html页面即可
Pentest lab
一个有趣的方法学Linux命令 看着还没更新几关就顺便做了
第一个lab
直接ls
cat flag.txt即可
但是他拓展了我们几个命令
pwd 和 id
pwd是当前的工作目录
id是当前的组
第二个lab
flag在其他用户的home目录下
直接贴我的过程了
第三个lab
从这个开始变得有趣了起来
他对另一个用户的家目录设置了权限,第八位到第十位是我们当前用户对此目录的权限。 我们可以看到没有读权限
但我们直接cat flag.txt是可以的 他只对目录有权限 对文件并没有设置
第四个lab
要找.开头的文件
隐藏文件需要ls -a
第五个Lab
find命令的学习
find /home -name .bash_history
第六个lab
alias加别名
alias ls="ls -a"
等号中间不能有空格
第七个lab
find /home -name .bashrc -exec grep export {} ;
export设置环境变量来查找