2018 年 3 月安恒杯线上月赛 write up

呃.. 很尴尬的一次比赛.. 第一次使用 VPN 参加比赛,连进内网,感觉很安全的样子。然而平台却因为被攻击(据主办方说),频频无法访问。

本来打算是当作一次练习,结果阴差阳错拿了第二。看了看前面几次的月赛的 write up,感觉自己基本都不会做。只能认为是这次比赛参赛人数较少,而且有几道题正好自己之前做过类似的,拿了很多首杀加分 = =##

WebScan

某公司的网站遭受到黑客攻击,存放在Apache配置文件中的重要信息被黑客盗取了。公司员工为了验证成因,使用明鉴Web应用弱点扫描器扫描网站并导出漏洞报告,你能通过分析漏洞报告得出黑客可能是采用哪种漏洞盗取重要信息的么?被盗取的重要信息是什么?

IP:192.168.5.25

报告选摘

网站截图

考虑到题干中有提及:存放在 Apache 配置文件中的重要信息,因此直接利用报告中的目录遍历漏洞,读取 apache 配置文件(默认在 /etc/httpd/conf/httpd.conf)。

xor

or的敌人,and 有个兄弟叫or,or有个敌人叫xor,那么你能帮助or战胜他的敌人xor吗,xor的奥秘就在附件中,开始战斗吧!

https://mega.nz/#!AohVSYrQ!2M4wDgYU5pRle5q6j0LeU71QaRcLrOVAxjY3AlA7OlI

拖进 IDA,开局一波 F5,看出来是对输入字串做了一轮简单的相邻字符异或运算。写出逆算法,解决。

function solveXor(enc) {
  let dec = ''
  dec += String.fromCodePoint(enc[0])
  for (let i = 1; i < enc.length; i++) {
    dec += String.fromCodePoint(enc[i - 1] ^ enc[i])
  }
  return dec
}

console.log(solveXor([0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, 0x4F]))
# flag{QianQiuWanDai_YiTongJiangHu}

equation

神秘的Javascript混淆法,从前有个程序员大神, 运用了javascript的语法特性创造了一个js混淆方法,这个名字在日本叫做“jjfucker”..没错,大神都不知道这个玩意儿怎么做的,很烦恼就取名了f**k。加油 ,你能解出这个题目的

https://gist.github.com/Coxxs/b77ff223e7b7ece20106460c9d6b5181

打开文件,看到一大堆 jsfuck 代码,有些晕,一开始打算去找专门的 dejsfuck 工具.. 不过仔细观察下,发现其实都是形如 l[..jsfuck..] + l[..jsfuck..] - l[..jsfuck..] == ..jsfuck.. 这样的形式。猜测 jsfuck 部分其实只是一个混淆后的整数罢了。因此利用正则和 eval 对代码进行处理。

function deEquation(str) {
  // 需执行两次以处理所有的 jsfuck 下标
  for (let i = 0; i <= 1; i++) {
    str = str.replace(/l\[(\D*?)](\+l|-l|==)/g, (m, a, b) => 'l[' + eval(a) + ']' + b)
  }

  // 处理 == 后的 jsfuck
  str = str.replace(/==(\D*?)&&/g, (m, a) => '==' + eval(a) + '&&')

  return str
}

使用上面的函数转换,并简单整理下格式后,我们获得了一组方程(equation)。

https://gist.github.com/Coxxs/ece3640a1a115e06ed307c8bac6ddb21

接着,将其整理成 matlab 的代码格式,解方程,ascii2str,获得最终结果。

flag{A_l0ng_10NG_eqU4Ti0n_1s_E4Sy_W1Th_z3}

P.S. 后来发现,使用 closure compiler 也可快速完成 jsfuck 整数的转换工作。

蜘蛛侠呀

将你获得的明显信息md5加密之后以flag{xxx}的格式提交。

https://mega.nz/#!twojkZgC!IXMRT4dpKFTtSuxA–Z06WD3robogF-5f__b-ZX8hJU

丢进 Wireshark,注意到里面有大量内容不同的 ICMP ping,似乎是一个证书的格式(用了 base64 编码)。

用文本编辑器打开,正则提取出所有的 base64 部分,并作解码,从文件头判断是压缩包格式。解压,是一只蜘蛛侠呀。

上网搜索了一些 ctf gif 隐写的资料,找到了几种隐写方法。考虑到这张 gif 播放速度有些不自然,于是尝试了时间隐写

$ identify -format "%s %T \n" flag.gif
0 20 
1 50 
2 50 
3 20 
4 50 
5 50 
6 20 
7 50 
8 20 
9 50 
10 20 
11 20 
12 20 
13 50 
14 20 
15 20 
16 20 
17 20 
18 50 
19 50 
20 20 
21 50 
22 20 
23 50 
24 20 
25 50 
26 20 
27 50 
28 50 
29 50 
30 50 
31 50 
32 20 
33 20 
34 50 
35 50 
36 20 
37 20 
38 20 
39 50 
40 20 
41 50 
42 50 
43 50 
44 20 
45 50 
46 20 
47 20 
48 66 
49 66

发现里面有许多 20 和 50 的时间,猜测其为 0 和 1。将 20 转换为 0,50 转换为 1,得到:011011010100010000110101010111110011000101110100 。

再将二进制转换为文本,得到:mD5_1t

结合题干,将这串字串 md5,加上 flag{},即为最终的 flag。


写到这里,比赛平台似乎又被打挂了 = =## 考虑剩下的做出来的几题 write up 意义不是很大,所以就到这儿吧。

以及,一如既往的,pwn 碰都没敢碰 QAQ 。但比起学 pwn 题型,总有更重要的事情。作为小透明,继续加油吧..

Coxxs

Leave a Reply