2017 GCTF(全球华人网络安全技能大赛)线上赛writeup

2017-06-19 214028人围观 ,发现 4 个不明物体 其他

*本文原创作者:王大白,本文属FreeBuf原创奖励计划,未经许可禁止转载

0×00 简介

CTF(Capture The Flag)中文一般译作夺旗赛,在网络安全领域中指的是网络安全技术人员之间进行技术竞技的一种比赛形式。CTF起源于1996年DEFCON全球黑客大会,以代替之前黑客们通过互相发起真实攻击进行技术比拼的方式。发展至今,已经成为全球范围网络安全圈流行的竞赛形式,而GCTF则是全球华人网络安全技能大赛,本届GCTF于2017年6月10日上午09:00-6月11日09:00举行,经过紧张刺激的24个小时,比赛落下帷幕。为了帮助更多刚入门的ctf玩家和对网络安全感兴趣的朋友,我们BOI战队,将我们的解题思路和过程呈现出来。希望本文可以帮到各位读者。

0×01 内容

1、Misc

题目:Stage1

FLAG: AlphaLab

显示看到图片里隐写了个二维码,抠出来并反色

1.png

扫码得到pyc文件的二进制码,扔去反汇编得到

1.png

1.png

得到flag:AlphaLab

题目:ReverseMe

FLAG:flag{4f7548f93c7bef1dc6a0542cf04e796e}

丢进010Editor,在文件最后发现有倒序排列的字符串

1.png

写脚本倒排一遍

1.png

flag{4f7548f93c7bef1dc6a0542cf04e796e}

题目:test.pyc

FLAG:flag:{126d8f36e2b486075a1781f51f41f41e144}

反编译不全,用工具跑得到了一串base64的倒序

1.png

1.png

解出来后倒过来明显的全字符的凯撒,偏移为-1

flag:{126d8f36e2b486075a1781f51f41f41e144} 

2、Reverse

题目:Hackme

FLAG:d826e6926098ef46

主函数:

1.png

表示v8是什么没搞懂来着,但是看到后面都是v8%22之类的使用,所以直接从0到21遍历了。照着上面的代码跑了一遍就出结果了,只是要注意v8和v15异或时用的是int8,所以和0xff做下与运算再异或就ok啦

Python代码:

str1 =[0x5f,0xf2,0x5e,0x8b,0x4e,0xe,0xa3,0xaa,0xc7,0x93,0x81,0x3d,0x5f,0x74,0xa3,0x9,0x91,0x2b,0x49,0x28,0x93,0x67]

str2 = ""

for i in xrange(22):

    v5= i

    v16= i

    v18= 0

    v15= str1[i]

    v13= i + 1

    v17= 0

    while(v17 < v13):

        v17= v17 + 1

        v18= 0x6d01788d * v18 + 12345

    v4= v18 & 0xffff

    printstr(v15 ^ (v18 & 0xff))

    printstr(hex(v15 ^ (v18 & 0xff)))

    str2+= chr(v15 ^ (v18 & 0xff))

print str2

flag{d826e6926098ef46}

题目:debug.exe

FLAG:  967DDDFBCD32C1F53527C221D9E40A0B

拿到题扔die查壳发现是Dotfuscator加壳过的,用de4dot脱壳,然后扔reflector分析,整个程序大概流程就是将 CreateByTenshine 字符串进行加密后和输入比较,加密也很简单,是和[0x2, 0x3, 0x5, 0x7, 0xb, 0xd, 0x11, 0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b,0x2f, 0x35,0x3b, 0x3d, 0x43, 0x47, 0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67,0x6b, 0x6d, 0x71] 里的第二个至第15个数轮流异或,把 – 删掉,然后计算md5值就是要提交的那串东东了(PS:提交的MD5里的字母都是大写……python跑出来的都是小写,o(╯□╰)o) )

python代码如下:

import hashlib

str1 = [0x2, 0x3, 0x5, 0x7, 0xb, 0xd, 0x11,0x13, 0x17, 0x1d, 0x1f, 0x25, 0x29, 0x2b, 0x2f, 0x35,0x3b, 0x3d, 0x43, 0x47,0x49, 0x4f, 0x53, 0x59, 0x61, 0x65, 0x67, 0x6b, 0x6d, 0x71]

str2 = "CreateByTenshine"

str3 = ""

for i in xrange(len(str2)):

    t= ord(str2[i])

   for j in range(1,15):

       t = str1[j] ^ t

   str3 += chr(t)

for k in xrange(len(str3)):

   if (str3[k] == '-'):

       str3[k] = ''

print str3

m = hashlib.md5()

m.update(str3)

result = m.hexdigest()

print 'flag{' + result + '}'   

flag{967DDDFBCD32C1F53527C221D9E40A0B}

题目: 密码加密

FLAG:1duGSe3JXvyMGYbpryYSeknbsWYWyu

刚拿到手没什么头绪,和队友交流了下说是拿到数据库里面加过密的密码。不知道原密码,或者不可逆。知道加密算法的情况下来生成一个密码插入数据库。然后才开始做,把jos-i-encrypt.jar 用jadx反汇编,果断踩了坑,跟着userinput跑去看aes和base64了,怎么做都不对,放下输入去看代码找到baseencrypt.class里的一个加密算法,直接copy出来跑,先把题目给的那个字符串加密,出来了这个字符串: ,把admin123456加密提交的结果不对,所以又把这个字符串后面的字符往admin123456后面试着加,最后admin12345611加密出来的就是答案了,╮(╯▽╰)╭

1.png

1.png

得到1duGSe3JXvyMGYbpryYSeknbsWYWyu。

3、Web

题目:热身题

FLAGGCTF{ae609880185f1d75}

也就是签到题了,一扫发现了robots.txt文件,里面一大堆目录、文件,在/rob0t.php下找到flag。

题目:Spring-css

FLAG:GCTF{db839442402f5874}

我能说这道题是14年的一个CVE么,当时在github上就直接搜到了这个,出题人也没做修改,所以EXP就可以直接打

1.png

构造payload:

curlhttp://218.2.197.232:18015/spring-css/resources/file:/etc/passwd-vvv

1.png

接下来构造:

curl http://218.2.197.232:18015/spring-css/resources/file:/etc/flag-vvv 就出flag了。

1.png

得到flag。

题目:注入越权

FLAG:GCTF{9CtyJLHMxkjLUs6qfUM5Cmrb}

 1.png

既然是注入,刚开始准备按套路来,结果被套路了

1.png

1.png

后来想到把role参数改成16进制 admin->0x61646d696e 结果还是出错,这个地方想了好久,突然想到既然role不能直传,那就不能用&并起来,然后试出来了=-=。

1.png

得到flag。

题目:条件竞争

FLAG:GCTF{KBnLGG6qR2ZdYe4HbUL8XpAP}

1.png

Reset之后会先删除user表和priv表中$user,再新建$user,只要我们在它新建priv表中的$user之前(即权限降低之前)登陆,即可拿到flag,那么接下来就是一直重置密码,然后一直登陆的问题了,用burp直接开两个跑

1.png

得到flag。 

题目:读文件

FLAG: GCTF{drthSDFSDGFSdsfhfg}

1.png

源码里直接给出了读取文件的payload,通过测试发现过滤了flag和etc一些敏感的词汇,发现后面是p=./1.txt 按正常来说应该是直接1.txt或者../1.txt,所以删了./试了一下,发现正常读到1.txt文件,那么久是说明./过滤了,构造payload:

http://218.2.197.232:18008/a/down.php?p=…//fl./ag.php直接读到flag

1.png

题目:WEB综合

FLAG:GCTF{981ee5269d8c3fb9}

这题首先是.svn泄漏,打包下载

1.png

里面有这些文件,果断搜索下源码,在pristime/c6文件夹里找到了admin的登入密码:dcea978f2c1

1.png

有密码那就好办多了,登入后发下只有admin才可以上传,上传点找了好一会,传马的时候发现只能传图片马,所以把一句话和图片合成了一下,就直接以.php上传进去了,本以为大功告成,这里不得不吐槽一下,在写这题的时候那上面还没有一只图片马,可我死活没连上自己的马,连到我自己怀疑人生,后来换了个图片,重新来了一遍,传.jpg.php  竟然连接上了,这个我也很无解

1.png

直接用菜刀浏览目录,找到fla9.php文件,得到flag 

题目:RCE绕过

FLAG:GCTF{ADFAFADSFASFZVASDFADV}

这题刚开始一脸懵逼,发现这题过滤了空格,后来查资料的时候看到了

所以果断用了%09来写,发现前面必须用上换行%0a,结果在我构造语句的时候就出flag了:cmd=%0acat%09 也算是出乎意料,不用去读什么文件。

1.png

得到flag 

题目:Java序列化

FLAG:GCTF{NsyTascaUR73uKd7e5YY}

这道题也就是一个java序列化,在User框内随便提交一个username,提示 ,参数是java的序列化,题目就写在那,base64解密后得到类名、变量名,那么接下来就是写构造一个id为1,name为amdin的序列化了。

脚本如下:

1.png

1.png

得到的序列化串,提交得到flag。

题目:变态验证码怎么破

FLAG:GCTF{Qb8HR4pGmScMqgxTSwP7QZmb}

1.png

源码里提示了用户发是ADMIN,然后密码是在password.txt里,里面1000条,那就是跑了,所以主要的就是验证码的问题,发现&vcode= 和PHPSESSID= 后面的数据删了就绕过了验证码

1.png

那么接下来就是跑密码的问题

1.png

得到flag。

题目:Forbidden

FLAG:GCTF{Dt24FbREwYJP8ekQHEFknK}

依次pass就好,题目考的就是http头的修改,个人感觉山路十八弯、、、

1.<!–只允许本机访问–>

User-Agent: Apache/2.4 (CentOS) DAV/2

Host: www.topsec.com:80

X-Forwarded-For:localhost

<!–只允许从百度挑战到本页面–>

Referer: http://www.baidu.com

<!–只允许使用ajax访问本页面 –>

x-requested-with: XMLHttpRequest

<!–本站只允许使用IE4访问 –>

Mozilla/4.0 (compatible; MSIE 4.0; Windows98)

<!–电脑上必须安装有.NET8–>

.NET CLR 8.0

<!–本站只允许德国用户访问。–>

Accept-Language: de-DE,de;

<!–没有登录! –>

将login进行解密:hex->base64->hex为false

1.png

用同样的加密方法加密true,密文:4e7a51334d6a63314e6a553d

 1.png

题目:php序列化

FLAG:JJj56M3e26Avvv6gnUZ3S4WZ

首先,进网页之后发现可以查看源码:

 1.png

注意这一行:ini_set('session.serialize_handler''php_serialize');

可以知道,这题的序列化是在session里反序列化。

那么只要保持session,就可以让序列被反序列化,然后,我进查询看了看,发现query.php是个空页面,然而,好奇心让我抓了个包,发现了这个:

1.png

edit by vim,这摆明了有非正常退出文件啊,然后试一下,脚本跑下文件,发现了query.php~,这个页面,是有源码的:

1.png

然后,分析代码就好了,这里的逻辑还算清楚,打印在TOBC里,flag在TOPB里,然后仔细看看TOPB的代码,发现,这个(string)是无法将对象转成字符串的,况且token和ticket这些参数只是TOPA的属性,结合这段代码,我们可以看到,代码里的login函数里是不全的,我们可以大胆推测,这个TOPA代码是程序员写到一半时退出留下的,最终代码不是这个样,再大胆推测一步,根据原本TOPA里的代码,根据对象的特点,login这个函数是无法调用的,看到TOPC的echo,我们可以推测,这里的login改为了__toString函数,根据这个推测,我们看看逻辑。

首先,反序列化会调用__wakeup函数,这里我们的参数就会被消除,所以用个cve-2016-7124,可以绕过__wakeup,然后,在最后,会触发echo,所以attr参数必然是实例化TOPB,因为,__toString只有在echo中会触发,然后所以TOPB里的attr是TOPA的序列化,这里,比较难绕过的就是TOPB里的token和ticket相等,我们可以在flag值赋给token后让tacket接下参数,这里我用脚本测试出,R在序列化中代表&,所以就好了,序列化是:

O:4:"TOPC":4:{s:3:"obj";N;s:4:"attr";O:4:"TOPB":2:{s:3:"obj";s:0:"";s:4:"attr";s:127:"O:4:"TOPA":4:{s:5:"token";N;s:6:"ticket";R:2;s:8:"username";s:17:"aaaaaaaaaaaaaaaaa";s:8:"password";s:18:"bbbbbbbbbbbbbbbbbb";}";}}

然后,就可以了:

1.png 

4、Mobile

题目:APK逆向

FLAG:bc72f242a6af3857

1.png

控件2131099678对应的“恭喜你”,主要函数在checkSN内,进入后

1.png

对Tenshine发现md5加密加密后取取0,2,4….等,与程序输入22位的进行比较。所以加密后的东西就是flag。

题目:APK逆向2

FLAG:8d6efd232c63b7d2

这个题啥也不说了,个人觉得就是脑洞,下载的包里有个mainfast.Xml,用记事本打开的

1.png

上面写着fl4g,还以为是假的,结果试了下,居然是真的。

得到8d6efd232c63b7d2。

*本文原创作者:王大白,本文属FreeBuf原创奖励计划,未经许可禁止转载

发表评论

已有 4 条评论

取消
Loading...

特别推荐

关注我们 分享每日精选文章

css.php