“没有一个系统是安全的”2016·西安SSCTF第五名&writeup

发表于:2016-02-29 21:30:00 来源:  合天网安实验室 阅读数(0人)

    编者按:周末一直在看坤哥热火朝天的ssctf比赛,看鬼斗精彩的直播解说,非常过瘾。比赛刚刚落定,我们的合粉队“没有一个系统是安全的”就发来了writeup,给广大合粉送来了福利。
    在强手如林的比赛中,他们斩获了第五名的成绩,位列国内高校队伍第三名,由衷为他们高兴!
    很荣幸,合天能够帮助他们成长!现在他们的writeup来了,剩下就看你们的了——我的所有合粉们!



队伍简介:

队伍由来自河南各个高校的信息安全爱好者组成,成立于2015年5月左右,参加过几次CTF比赛(XDCTF(第四名还是第五名忘了)、华山杯(那个时候叫龙虾兄弟)还有一些没有表现好的比赛就不提了),现在主要参加XCTF联赛,RCTF没有发挥好,ZCTF和这次SSCTF线上赛的运气还不错,不过线下赛的经验还不足,老是被人吊打~~
另外,本队招队员,希望有一定技术基础(二进制(逆向比较缺大牛)、WEB)的人可以加入我们队伍,联系邮箱ctf_nsis@163.com

对合粉说点什么:

我们一开始也是在合天网安实验室入的门哦,这里的实验还是不错的,当时也是羡慕那些大牛们,于是自己暗自努力,刷实验做(记得当时经常送合氏币,实验也便宜,O(∩_∩)O哈哈~,小编别打我),下面推荐几个实验:CTFPWN系列汇总、CTFReverse系列汇总、密码学原理、软件安全之恶意代码机理与防护、Docker 你应该会玩

pwn 类型


pwn1


惭愧,代码写得太长,是一个数字排序的游戏,关键就是内存的分配,内存分配是程序自己 实现的,漏洞出现在,update的时候可以越界修改一个DWORD(下一组数据的数组长度), 先泄露atoi的got表,然后利用reload可以得到一个长度自己设定的长数组,再利用index只需 要小于数组长度的特性,给出一个很大的index,在转换位置时候整形溢出,修改atoi的got 表。




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次就行了

脚本如下:




miscspeed data


拿到pdf一直以为是什么pdf方面的漏洞样本,于是找啊找,后来感觉方向不对,直觉告诉我 应该是隐写,于是google一下pdf 隐写,




下载一个名字叫做wbStego4open的工具,按照操作,几下就出来flag了,╮(╯_╰)╭无语




RE100


反编译后发现首先要求用户名处要填”secl007”( 在strings.xml里面可以找到),然后就调用 so文件进行判断。

在so文件中的getpl函数中,虽然程序比较复杂,在关键判断之前flag的明文已经被生成了。 搭建好动态调试环境之后可以直接在内存中找到flag。




RE200


程序会一开始先通过AfxBeginThread开启一堆线程,不过一开始是等待状态,后面再使用 ResumeThread将这些线程唤醒。

整个处理过程比较复杂,并且一开始的时候比较坑,输入被做了以下处理:




就是输入每8个一组被合成了一个,这样理论上是不可能逆推回flag的,或者是有多解。不过 既然既然已经有队做出来了,就说明是能做的。这就需要进行大胆的猜测。由于这里有 个”*2”的操作,猜测这里相当于是位操作,然后输入走到这里的时候每位只能是0或1,这样 才能保证可以逆推回去。

整个过程比较复杂,就不详细说了。解题代码如下:




其中有个地方逆推回去不是唯一的,这里会有四种情况。最后生成4个flag,拿网站上一个一 个试就可以了。

RE300


如果直接跟踪程序的话会发现首先输入要满足一个条件,但后来又会取输入的MD5值,要求 等于另一个MD5值。这两个条件是冲突的,不可能同时满足这两个条件。 不过翻翻代码的话会发现还有一些有意思的处理代码,这些应该才是真正的判断flag的代 码,比如这个地方就非常明显:




用PE资源编辑工具可以看到程序其实是有两个按钮,但其中的一个应该是在程序运行过程中 被隐藏了。可以使用ViewWizard将这个按钮显示,然后就可以愉快地动态调试了。 程序比较简单,就不详细说了。程序中有部分是通过乘法加法和取模将26个字母进行替换, 需要将这个过程逆回来。忘了这个加密方式叫啥名了,就暴力跑了一下,其中用到的代码 有:




RE400


先脱壳 程序总共有两步,首先是”Pls Input pAssW0rd”,应输入”[Xi`An4YeCaoAnQuanGongSi] [HP]!”,然后是”Pls Input Second layer password”,应输入”[//XinNianKuaiLe~//]”。由于程序 本身不是很难,这里就不详细讲这两个答案的过程了。

然后就可以看到程序开了一个窗口,里面有个圆的和一个方的在转呀转。可以在程序中找到 生成这个图像的代码部分:




注意到这里除了两个长方形和一个圆形以外还会输出byte_40F030部分的数据,不过奇怪的 是并没有看到这部分输出。可以查看到这部分数据在之前两个输入密码的处理过程中都被做 了改变,所以这是个很可疑的地方,猜测是像那个圆一样被方形遮住了一部分。

不过这里最坑的就是我patch了程序删除显示两个方形的代码之后并没有看到什么别的显 示。后来调了一下发现byte_40F030部分的数据对应的坐标都特别大,而方形和圆形的横纵 坐标都在1~ 1之间。

很纠结到底是哪里错了但找了半天也没找出来。发现程序还有一个输入的地方但好像并没有 太大作用,也不知道应该怎么到那去。不过发现一点:byte_40F030部分的数据在之前的过 程中的两次处理过程都是将其逐字节与某特定字节抑或,也就意味着最终byte_40F030部分 的数据只相当于原始数据逐位抑或特定字节得到的。于是想到可以把所有可能暴力跑一遍, 看看有没有坐标比较靠谱的。这样做的话,也就相当于之前解出两个密码的意义不大了,是 从另一个角度重新做这道题。

于是将byte_40F030部分的数据dump下来存为pos.bin,然后写了以下代码:




作用就是读取每个坐标,然后逐位抑或某个字节,生成一个.m文件,这个文件可以将这些点 再坐标系上打印出来并存为图片。

通过SHELL让octave依次执行这些.m文件,得到256张图片。这些图片中有些是空白的,有 些坐标非常大,但也有图片的坐标都在1~ 1之间,并且得到的结果看起来也比较规整。可以 得到这些图片都是原坐标抑或哪个值得到的。

试了下第一个比较靠谱的图片,动态调试程序,先把两个输出长方形的部分patch掉,然后 使得byte_40F030这部分输出在绘制之前的数据是原数据抑或该坐标得到的。可以得到这张 图:




不过两行中间都有条线,影响看到flag的具体坐标。再动态调试程序,将这些坐标改一下, 即可清楚地看到flag:




相关新闻

大家都在学

课程详情

信息安全实用工具

课程详情

web防御中的代码安全

课程详情

经典网安事件