编者按:
周末一直在看坤哥热火朝天的ssctf比赛,看鬼斗精彩的直播解说,非常过瘾。比赛刚刚落定,“没有一个系统是安全的”就发来了writeup,给广大合粉送来了福利。
在强手如林的比赛中,他们斩获了第五名的成绩,位列国内高校队伍第三名,由衷为他们高兴!
很荣幸,合天能够帮助他们成长!现在他们的writeup来了,剩下就看你们的了——我的所有合粉们!
(更多信息敬请关注XCTF,关注四叶草)
队伍排名
队伍由来自河南各个高校的信息安全爱好者组成,成立于2015月5月左右,参加过几次CT F比赛(XDCTF (第四名还是第五名忘了)、华山杯(那个时候叫龙虾兄弟)还有一些没有表现好的比赛就不提了),现在主要参加XCTF联赛,RCT F没有发挥好,ZCT F和这次SSCT F线上赛的运气还不错,不过线下赛的经验还不足,老是被人吊打~~
另外,本队招队员,希望有一定技术基础(二进制(逆向比较缺大牛)、WEB)的人可以加入我们队伍,联系邮箱ctf_nsis@163.com
pwn 类型
pwn1
惭愧,代码写得太长,是一个数字排序的游戏,关键就是内存的分配,内存分配是程序自己实现的,漏洞出现在,update的时候可以越界修改一个DWORD(下一组数据的数组长度),先泄露atoi的got表,然后利用reload可以得到一个长度自己设定的长数组,再利用index只需要小于数组长度的特性,给出一个很大的index,在转换位置时候整形溢出,修改atoi的got表。
PS:脚本太挫,后面需要手动输入index,再发个/bin/sh过去拿到shell
pwn2
这个脚本就更长了,题目和pwn1差不多,就是放数据的那块多了一个防止复写的
DWORD(是长度和随机数抑或得到的),思路和PWN1是一样的,只不过除了泄露strtol之外还要泄露随机数,根据随机数构造一个长度大的数组,然后如上更改strtol的got表到sytem,然后再发/bin/sh
PS:脚本太挫,最后还是要自己手动发index,和/bin/sh拿shell
Welcome
简单的题目
关注四叶草安全的微博,它就会把flag私信给你
Can you hit me?
XSS题目
非常巧合的事,过年和毕业的学长聊天,学长提到过angularjs。
没想到这次ctf正好碰上
看了看源码中的js.js,就能发现,其实这是angularjs
http://blog.portswigger.net/2016/01/xsswithouthtmlclientsidetemplate.html
这篇文章上讲的非常的清楚。
通过{{}}执行angularjs命令,绕过转义,从而弹窗。稍微有点不同的是,这里有些关键字比如 on , alert, eval 都被过滤了,但是没有做递归过滤,同样可以绕过。
最后的payload
Chain Rule
非常有意思的一道题目
首先拿到的文件夹中有很多的压缩文件。题目给的初始密码是: start 。我们不知道这个初始密码对应的是哪个压缩文件,于是我们需要遍历所有的压缩文件寻找。解压后又发现下一个压缩文件的密码,继续解密下去…….
script:
最后得到的是一个flag.zip 和 pwd.zip
这个pwd.zip 中有flag.zip 的密码,我们接下来就是要找到这个密码
解压pwd.zip 发现有很多的txt文件,一个指向下一个,然后继续下去….同时其中还有分叉的路口。
我们可以倒着将这个路径给恢复出来的
其中有个txt有这样的描述
这点太坑了,想了好久,找了好久,才发现其实这个comment是zip文件的一个特殊字段
pwd.zip中有的zip存在这个字段,有的没有,我们直接将其提取出来,发现全部为20 和 09,按照之前得到的路径的顺序排列起来,并且把09当作1,把20当作0。转换成2进制之后,再转换成字符串,就能得到密码。
解压flag.zip 得到flag
SSCTF{Somewhere_Over_The_Rainbow}
Nonogram
非常坑爹的一题,需要你玩一个叫Logic Pic的游戏。连上去后需要输入linux的命令,它会给你相对应的坐标,我们需要根据这个坐标来还原图像。
我们在网上搜索了一下,找到了一个解nonogram题目的网页,只需要输入对应的坐标,它就能给你恢复出图像来。我们只需要将题目给的坐标进行相应的处理就好了。
然后输入得到的参数,得到qrcode
扫描这个qrcode得到下一条命令,salt值,以及一个缺少一位的MD5
因此我们需要爆破这个MD5所缺少的那一位,再批量求解,从而解出flag中某一位。
我的过程基本上都是手工的,比较的累…….
最后得到flag
SSCTF{88c647e37b8d295b65aaf10a8fe117bf}
Legend?Legend!
最后做出来的
感觉这题目一直在变,有时候同样的语句却出来不同的结果
晚上测试单引号的时候报错: missing },显然这就是mongodb(白天还没有的)
参考wooyun的文章,首先查找看看有什么collection
得到
[ “f”, “news”, “system.indexes”, “user” ]
看了一圈,发现只有user中存在有用的东西
我们拿到数据库中的信息,接着需要登陆邮箱,得到flag
Up!up!up!
本来一开始没啥思路,后来更新完题目后顺手测试了下备份结果还真有。。于是乎直接拿到flag。
但是还是得做题,发现主要判断有两个:
即第一次判断文件不能是php,但是第二次判断是php才给flag。
但是注意到第一次会判断上传类型是要和multipart/formdata一样才会继续判断,那么只要我们不一样就好了。
FlagMan
一开始测了半天是用啥写的,啥php,asp,jsp都不是,那么就应该是python写的了。
然后通过github进入后,有自己的用户信息,但不知道是干啥的,想了半天也没思路,就顺手搜索了下ssctf,结果又这样一个用户:
于是乎这串代码
{%for c in [].class.base.subclasses()%}{%if c.name == ‘catch_warnings’%}
{{c.init.func_globals[‘linecache’].dict[‘builtins‘].open(‘ssctf.py’).read()}}{%endif%}
{%endfor%}
为自己的用户名,然后登陆,就得到flag:
HeHeDa
首先发现key只在这里出现,而且与t2是按位操作的,所以可以通过按位爆破得到key。同样得到key后可以按位爆破flag。
不过有个问题就是通过已知明文求得的密文和给的密文不一样长,不知道多出来的是啥=。=
Key爆破脚本:
Flag爆破脚本:
Hungry Game
0 直接进去
1 动画上可以该坐标,写脚本直接进去
2 写脚本直接发送足够的木头然后进去
3 脚本每次采取20块宝石发过去,凑够数然后进去
4 限制了打的速度,所以手动打15次就行了
脚本如下: