2017年湖湘杯网络安全技能大赛Writeup
2017年 “湖湘杯”网络安全技能大赛Writeup
Misc ak,web差web400,pwn一分没有,re 两道,反正尽力了
MISC
流量分析
wireshar导出http文件发现flag.zip

打开为rgb

使用脚本把rgb转换成图片
1 | from PIL import Image |
打开图片得到flag

热身运动
一张gif,一个粉红色的老虎在一个国际象棋的棋盘上瞎j8动
使用Stegoslove查看每一帧记录下老虎移动的坐标

1 | 5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e |
百度64进制编码得到一张表,对应坐标记录数字

1 | 5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e |
再用数字对应base64码表

1 | 25 38 49 33 25 55 44 49 29 5 60 49 13 21 61 38 29 22 57 46 30 23 52 |
解最后的base64得到flagflag{1t_15_funny}
题目Encryptor.apk
逆向apk

得到关键代码

加密过程为:
j是md5以后的字符串换成字节了以后的长度
paramArrayOfByte1[i]是图片的每一个字节
用图片的每一个字节和md5字符串的第[i%j]号字节异或
因为是异或加密,解密只需要再加密一次即可得到flag
限制了加密文件必须为图片,把加密后的文件重命名为jpg放进加密机加密,得到flag图片
这是题目修改前的flag图片
这他妈的字写的什么j8玩意?
题目修改后的图片

misc300
题目为pkl后缀名
pkl是python的序列化文件
使用脚本读取之后是一行英文
S'The black pixels of a b/w image are at
剩下的是很多坐标,使用画图模块绘制散点图
1 | import pickle |

把脑袋倒过来看,对
是个漫画人物
漫画名为凯文的幻虎世界,作者Bill Watterson
flag 就是作者的名字billwatterson
嗯,cnm啊这尼玛谁想得到?出题人脑子可能有坑
人家原题叫who made me ,这tm 叫misc300。。醉了
WEB
web200:
题目提示:只是一个普通的上传。
打开页面以后得到亮点提示:
a.只能上传png b.htmlentities(ucfirst($op)); op变量做过简单的处理。
打开upload页面发现http://118.190.87.135:10080/?op=upload ==> op=upload应该是文件包含。
扫描一下目录:upload.php、home.php、flag.php、show.php加上两个目录image和uploads
上传一个png
![{0Z)8U}WOM{[T(ORU6K])9G.png](/images/2017%E5%B9%B4%E6%B9%96%E6%B9%98%E6%9D%AF%E7%BD%91%E7%BB%9C%E5%AE%89%E5%85%A8%E6%8A%80%E8%83%BD%E5%A4%A7%E8%B5%9BWriteup/2cf6b43eb2135dbd21beb4f74042ca0c.png)
页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1
到这里就更加印证了是一个文件包含漏洞了
这个imagekey应该就是上传后的文件名,上传的文件应该是在uploads文件下:

果然,然后包含它

重新思考了一下,包含upload.php的时候,是op=upload 那么其代码应该是op=$_GET[op].’.php’;在文件中加上php的,这时候我想到phar://协议。
将x.php(一句话shell)压缩成zip格式,然后再改成png格式上传到服务器,用包含结合phar协议来执行php文件:
Payload:op=phar://./uploads/e3b413b087bd7f56d3a67d3f970a88c489b60e66.png/x
可以执行,然后读取flag.php中的内容
Payload:x=highlight_file('././flag.php');

web150 random
这道题是相当的坑,11点出了以后到4点左右才正常。
像这样的题,进去没什么提示,首先想到的源代码泄露,然后审计代码绕过一些的。访问.index.php.swp存在,这个是vi编辑器留下的,但是在11点-4点之间这段时间,这个里面根本没有源码,和index一样是乱码。

源码看到以后,就发现是mt_rand()伪加密,mt_srand()以time()为种子进行播种,mt_rand()生成的内容是依赖于time()的。
思路:用python直接访问页面拿到pwd的值,在time()生成的时间戳变化之前提交上去,就可以绕过第一层if($pwd == $_GET[pwd]),但是这乱码是什么东东?
把源码放在本地,然后去生成、输出pwd 和 session。

发现还是乱码,那可能pwd就是乱码,ok。写个脚本,让脚本先访问题目地址,处理题目地址返回页面,取出pwd的值,再访问本地页面对比pwd的值,如果相同,则把本地页面生成的pwd、session的值分别作为pwd参数和action参数的值提交上去。
Flag为:you get the flag it is hxb2017{6583be26c1403c25677c03ac7b3d1f22}

脚本:
1 | import requests,re |
本地页面源码
1 | <?php |
web300
访问看到源码,过滤了很多字符,但是()[]=’+.;这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。
1 | <?php |
但是提交被拦截
因为+在url中表示空格,而题目拦截空格。所以要把+ 进行一次URL编码,传入后会自动进行解码:
将符号一句话中的+全部用%2b替换

getflag

RE
简单的Android
apk文件
解压后用dex2jar把classes.dex转换成jar包
用jd-gui打开,发现代码中直接就包含了flag明文。没安装测试,直接交就过了

RE100
发现是win,还有upx壳,用3.91版的upx -d解压成功

解压后直接运行会挂掉,ida打开,main函数就在启动函数上面几个(通过字符串提示发现main函数)

按f5可以得到如下c代码

虽然很多函数没有识别,但是不影响这些分析
发现一堆没用的代码,其实关键的就是圈中的代码而已。这里的输入才会影响后面的结果。至于判断条件,if嵌套if,似乎不可能达成这些条件,应该是程序挂掉的原因。所以,直接进入关键函数sub_401080

明显是按位异或,供44个字符,每个和x22或后等于相应的值就可以,反向计算拿到flag。但是要注意顺序,读取的行数是换了的,而且注意低存低高存高

本来想用idc脚本把数据抠出来,然后异或就好了。但是出了点问题,会读取出特别大的数字,只能一个一个手动弄出来。按照行的顺序,每一行从右边到左边。然后写python脚本如下:

执行得到结果

ps:
web400差点做出来,比赛结束前7分钟改题也是牛逼,misc100直接换题,misc300偷来原题还不给题目名,misc200用一堆写的屎一样的英文来强行加难度,这出题人真的是服气
送出题人串字母啊 mmmmmmmmp!
