pwnhub杯CUIT第十三届校赛pwn出题及运维心得

0x00: 前言

​ 这次应该是我参与的第三次校赛了,第一次大一的时候是参赛者,和柠檬、K1n9还有管理小姐姐组队;后面两次都是以出题者身份参与,在出题中学习到了很多。第一次出题的时候太naive…也没参与运维,都是学长在做配置、维护,这次自己上阵,虽然准备了不少,但是还是有很多问题暴露出来。

​ 这次文章涉及出题心得,出题中的一些思考、反思;运维中的一些问题,以及对问题的解决和以后的预防方案。

0x01:出题心得

1. pwn50 python jail

​ 这是一个python jail,题目是根据一个以前的ctf改的,我过滤了一些函数、字符,熟悉一点python的同学就能容易绕过,使用getattr去做函数调用。算是一个送分题吧 233333。

2. pwn100 lemon water

​ 本来pwn100是学弟的…后面出了点问题,他甩锅了TAT。 我就想着随便出一个吧,就放了这么一个format string的盲打。

​ 这种题目的思路也很简单,先用%p,确定arch,然后再确定输入在stack的位置,这次这个题目是%6$,后面的就很简单了,dump出来bin file,然后确定got表,有了fmt这种任意地址读的,构造leak就可以拿system地址了,后面直接hijacking printf got,输入一个/bin/sh,就拿shell啦~

​ 但是这种题目以后最好不要出,一是没什么意思,二是对服务器的资源消耗很严重,很容易gg。这是自己的问题,背锅背锅…这个题目出的不好TAT 不过顺手黑了一波lemon同学 233333

3. pwn200 file share

​ 先说下这个题目的想法吧。开始是基友byg0ne写的一个file share,我拿来修改的,他那个程序是解析http的,有点类似server上运行一个python -m EasyHTTPServer 这种,wget去获取文件。

​ 对于这样的一个程序怎么塞进去两个洞呢?我首先想到ngnix那个BROP,解析http的时候栈溢出,嗯…我可以写进去一个login功能,然后有这个漏洞。另外需要一个泄露,怎么做呢?之前看了长亭杨博士的三个漏洞搞定路由器,提到了snprintf的滥用导致heap info leak,我也加了进去。所以原本的题目是这样的…但是后来测试的时候发现,信息泄露可以正常玩,泄露了堆信息,然后根据offset 和一些泄露出来的信息,能确定libc base addr,提供libc.so,就能拿到需要的信息了。但是问题出在栈溢出部分,想增加一个crack canary,然后再让他dup改标准输入输出,然后ROP拿shell…死在crack canary了,一些不可显字符接收有问题-。- 就gg了

​ deadline逼近,我就改了题目…一下子改简单了,我背锅…还造成多解情况。

​ 修改后题目的原本设想:fmt 泄露程序加载地址,确定get flag函数地址,crack canary,然后覆盖返回地值拿到flag。但是socket这种!fork server的啊,不重启加载地址一样的啊,可以无限fmt leak的啊TAT

结果就是…一个fmt就可以撸了。。泄露完了直接fmt 日返回地值

​ 这个题目如果按照原本思路可能更好一点。或者这个题目去掉get flag函数,给libc,可以让泄露完了之后通过offset拿到dup,改标准输入输出,然后ROP拿shell。

4. pwn300 notebook

​ 常规的heap题目,很简单。塞进去了堆溢出、UAF、释放后的heap未清空。

​ 利用的话,利用fastbin的去leak info,然后堆溢出hijacking 函数指针,UAF 调用释放后的块中的方法get shell。很常规的一道题目吧,感觉也没啥难度….师傅们秒的贼快。

5. pwn400 && pwn500

ox9a82学弟的题目,关注他的博客就好啦~他会写的很详细。

题目出的很有质量,heap玩出了花,但是代码量挺大的,可能有些地方没测试到,出漏了也是有可能的 23333

膜一发9a82大佬 XD

0x02:运维

不运维不知道辛苦啊…配服务器的时候觉得自己简直是个智障一样。

  1. 选择使用socat还是xinetd

纠结再三使用了socat,其实都差不多,socat更简单一点。

1
nohup socat TCP-LISTEN:50004,fork,reuseaddr EXEC:'/home/pwn400/pwn400' > /dev/null 2>&1 &

大概这样的吧,具体的其他需求可以看socat文档去修改。

  1. 权限问题

啥也别说了所有写权限都ban掉,命令也做好权限,最好只留下ls cd cat这三个。

还有就是,我开始忘记给.bashrc去掉w权限了,被joker师傅写了

1
echo :p ;exit 0

我服务都没起来…一脸懵逼的问了他,后面改了改…师傅又给我上了一课TAT

还有就是pwn 服务相关文件最好加上chattr +a一下…

  1. 其他

fork bomb这个真是没想到…结果被joker师傅pwn50打进来,fork bomb搞崩了好几次…后面改了配置文件,限制用户启的进程数目,重启之后好了一点。但是这样有个问题就是,当socat 启动的进程到一定数目之后,到了设置的max值,就起不来进程啦,就要重启服务了,很麻烦。最好的办法是,题目里都写上alarm,但是问题是像pwn100那种,没法这么干…比较尴尬,写个crontab自动重启好了

  1. 流量

抓流量就是为了反作弊,事实证明这次抓流量帮了大忙。呵呵, 现在CTF风气这样,我能怎么办,我也很绝望,我就是要怼。

部署了tcpdump,写了crontab去抓流量,以小时为单位。

当然了,这种方案不是很好,而且这次题目没token,导致我后面分析流量类死了,一个包一个包的看。以后的话可以参考杭电explore师傅的黑域,流量抓的更全,直接存数据库里,方便check。

  1. 自动化啊自动化

一定要做好自动化,比如服务重启(比如那个pwn100),写crontab自动重启,要不然好累啊,觉都睡不好。

0x03: 随便瞎bb

CTF风气慢慢变得很差,拿这次pwn50我抓到的流量来说,有这几种情况:

  1. payload 几乎一样的
  2. 没有任何尝试直接使用关键函数去命令执行的
  3. 只是随便交互的,一点意义都没,但是那个ip又提交了flag,可能是学校原因吧出口ip一样。
  4. 那些提交时间间隔不到1min、3min的。

爱怎么搞怎么搞吧。

我不懂,那是个python的jail啊,你不尝试我过滤了哪些字符,哪些函数,怎么确定用getattr的?

去买彩票吧同学,中了大奖记得分我 233333

0x04: 结束语

​ 比赛还是办的没啥大的问题,也学到很多东西,知道自己很多不足,以后多学习。感谢师傅们的支持、包容和理解。比赛时间比较尴尬,对不住大家了,导致很多师傅没来玩,比较遗憾,我们的锅TAT

​ 还有就是通过比赛又认识了一波师傅,比如nonick这位,非常强以后多交流学习 -。- 又可以进步啦