Fork me on GitHub

CTF -- 浙江省首届网络安全大赛题解

2018年浙江首届网络安全大赛题解。我们队都是野路子小白帽,抱着玩一玩的心态参赛,运气好拿了个一等奖(第六名)。

浙江省首届网络安全大赛题解

决赛

1-1 知法懂法

  1. 在输入框提交数字,可以看到返回相应的网络法,同时URL的get请求中提交了两个字段id和submit。输入一些SQL注入语句可判断存在SQL注入点。
  2. URL丢到SQLMap跑一下,注入成功,数据库成功脱库。

    1
    sqlmap -u "http://172.21.1.102:61234/XYRM8AGv29?id=1&Submit=%E6%90%9C%E7%B4%A2" -a
  3. 脱库后可以查到8个数据表,其中1个表存着七章网络法标题,另外7个表存着相应的七章安全法内容。

  4. 写脚本提交了5位数内的数字,都没任何返回值。因此判断flag可能不存在数据库中,而是写死在PHP中。
  5. 折腾了好久未果。最后仔细读了下题目,发现题目说,找到不是网络安全法的内容,内容!然后认真阅读了一次记录中的安全法,发现有一条讲的是未成年人保护法,提交这段内容,得到flag。
    小结:用工具无脑注入即可脱库,之后的提交内容考验脑洞和细心。

1-2回味童年

  1. 不管题目,先得玩一把俄罗斯方块,不能辜负出题人写了这么多代码。就是被工作人员围观玩游戏有点小尴尬。
  2. 将jar解压之后,用idea打开,先全文搜索一下zjctf之类的标识,发现并没有直接藏在里面。
  3. 查看目录,发现有一个HttpRequest.class文件,说明需要发送请求给后台才能获得flag。
  4. 因为HttpRequest.class文件里的函数是sendGet和sendPost,所以全文检索这两个方法,发现TetrisGame$ResultPanel.class文件中有一个sendGet。其代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    String var4 = var2.getProperty("url");
    this.pointsLabel.setText(Integer.toString(this.points) + var1);
    long var5 = System.currentTimeMillis();
    String var7 = Long.toString(var5);
    Encoder var8 = Base64.getEncoder();
    byte[] var9 = var8.encode(Integer.toString(this.points).getBytes());
    String var10 = new String(var9);
    String var11 = HttpRequest.sendGet(var4, var7 + "&" + var10);
    System.out.println(var11);

发现发送的格式是url?时间戳&分数的base64编码。

  1. 根据var4一路回溯,找到url来自config.properties文件,打开一看,就是目标url了。
  2. 然后复制HttpRequrst,class中的代码,写脚本来按格式发送过去,就可以得到flag。
    代码如下:
    1
    2
    3
    4
    5
    6
    7
    8
    int points = 20180;
    Encoder var8 = Base64.getEncoder();
    byte[] var9 = var8.encode(Integer.toString(points).getBytes());
    String var10 = new String(var9);
    long var5 = System.currentTimeMillis();
    String var7 = Long.toString(var5);
    String var11 = HttpRequest.sendGet("http://172.21.1.102:61234/Gb9k0TPyqz", var5 + "&" + var10);
    System.out.println(var11);

2-1 圆圈圈圆

  1. 用binwalk对下载的1.PNG进行分析,发现其中隐藏了一些文件。

    1
    binwalk 1.png
  2. 用foremost提取到如下文件:
    zip(00002888.zip) rar(00000943.rar) png(00000000.png) ole(00001886.ole) jpg(00001899.jpg)

    1
    foremost -v -i 1.png -o /root/aa
  3. 打开rar文件,发现压缩包内包含了paper2.png图片,尝试解压,但需要密码无法解压。

  4. 用WinHex打开jpg文件,发现文件头包含”photoshop cs5”字样,尝试用photoshop打开该文件,寻找隐藏信息,未果。
  5. 用WinHex打开ole文件,发现十六进制内包含”microsoft office”等字样。同时用foremost提取到一些xml文件,初步判断是office的主题文件。
  6. 将ole文件后缀改为.doc得到word文件,发现可以打开,且存在ctf比赛介绍等内容。
  7. 用word自带的文本检查工具分析,发现存在作者信息和隐藏文字,在设置出开启隐藏文字选项。在文本末尾发现疑似flag,flag{This_i5_n0t_f1ag}。提交后发现flag不正确,从内容也可推测出不是真正的flag。
    flag
  8. 将flag{This_i5_n0t_f1ag}作为密钥用于解压之前的rar压缩包,发现可以解开,得到paper.png文件。
  9. 用NotePad打开paper.png,搜索”zj”字段,搜索得到真正的flag。
    zjflag
    小结:jpg文件的photoshop信息有误导之嫌,一直把注意力放在这儿。之后无意间发现word有隐藏文字这个功能,才得到假flag。套路有点多。

4-1 小猪佩奇

  1. 用binwalk和foremost提取file.png文件,得到png和zip文件。
  2. 解压zip文件,得到一段peppa.mp3的音频和一张新的png图片。
  3. 再次对新的png图片进行提取,得到一堆文件,包含xml等,通过分析得出可能是office文件。
  4. 在其中的media文件夹中发现一张二维码图片,燃鹅,现场莫得带手机,扫不出二维码,难受。
    qrcode-ss
  5. 最后,突然想到神器ss内有扫描二维码功能,扫描二维码得password:APIG。
    qrcode-password
  6. 用goldwave打开之前的peppa.mp3音频文件,发现音频前0.3s的左声道有一段波形,大约可以猜测音频隐写了内容。燃鹅,没有准备音频隐写工具,几乎放弃。
  7. 到了中午,现场放出了一些常用工具,其中发现了mp3-stago工具。
  8. 下载工具,参考README.md说明,用之前解开的”APIG”密钥很顺利地对音频解密,得到flag。
    小结:又是一道隐写题,难度不大。这题考的是工具,什么都没准备唉。还好现场放出了工具,顺利解开。

3-1 似曾相识(未解完)

  1. 小恐龙和预赛套路一样,post一个时间值,网页返回一张png图片。
  2. 得到png图片后,再将页面上的另外3张png下载,得到看似一样的四张png。
  3. 初步判断后发现,图片的大小有差异。用WinHex打开后,发现编码也有细微差异。
  4. 用compare比较两张图片,发现左半边有像素差异。同时发现下载的png图片文件名疑似md5加密。(红点标出部分)
    compare
  5. 由于赛场禁网无法在线查询md5密码,且为准备图片xor运算工具,所以未解出。
  6. 回来后将文件名丢到在线md5解密,得到密码为65594。
    md5
  7. 用stegsolve.jar工具对两张图片xor运算的到一张新的bmp图片。
  8. 用WinHex打开bmp图,发现大多数像素点十六进制为00(黑),有少部分为0A(灰)。将00表示为0,01表示为1,得到二进制串。
    小结:工具没准备好,知道怎么做,却做不出,唉。

总结

本来就是抱着玩玩的心态参加了决赛,做了一上午0解,排在了四十多名有点难受。想着赶快做出个一题拿个三等奖就睡觉了。然后中午吃完盒饭,官方放出了一些工具的GitLab,用着工具一口气解出三题,瞬间爬到第四名,美滋滋。对于业余人士,拿到这个成绩还是很开心了,拿了奖牌回去继续苟前端。

yo

year

zhaoo wechat
0%