0CTF 2017 Quals Writeup

この大会は2017/3/18 9:00(JST)~2017/3/20 9:00(JST)に開催されました。
今回もチームで参戦。結果は120点で908チーム中179位でした。
自分で解けた問題をWriteupとして書いておきます。

Welcome (Misc)

IRCでfrreenodeの#0ctf2017に入ると、フラグを見ることができる。

09:02 *topic : Welcome to 0ctf 2017! https://ctf.0ops.net  (flag{Welcome_to_0CTF_2017})
flag{Welcome_to_0CTF_2017}

integrity (Crypto)

AES暗号の問題で、ncで接続した際に"r"で指定した文字を暗号化、"l"で復号する。
その際、暗号化する文字列は32バイト以下で、"admin"を暗号化することはできない。
その状況で、復号して"admin"になる暗号文を指定することができれば、フラグが得られる。

暗号化の概要は以下の通り。
1) 指定した文字を16の倍数の文字長になるようパディング
2) 1)の文字列のMD5ダイジェストを1)の文字列の前につける。
3) 2)の文字列をランダムなIVでAES暗号化する。
4) 「IV + 3)の暗号化文字列」を16進数表記で返す。

このことから1ブロックずらして考え、目的の暗号データを取得できないか考える。
CBCモードなので、以下のようになる。
[平文1ブロック目] ^ IV --(暗号化)--> [暗号文1ブロック目]
[平文2ブロック目] ^ [暗号文1ブロック目] --(暗号化)--> [暗号文2ブロック目]
[平文3ブロック目] ^ [暗号文2ブロック目] --(暗号化)--> [暗号文3ブロック目]

平文のブロックを以下のようにする。
1ブロック目:2ブロック目+3ブロック目の文字列のMD5
2ブロック目:"admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"のMD5
3ブロック目:"admin\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b\x0b"

これで暗号化した結果から、復号する際に以下のように指定すれば、復号して"admin"になる。
IV = [暗号結果1ブロック目]
1ブロック目:[暗号結果2ブロック目]
2ブロック目:[暗号結果3ブロック目]

これをプログラムにする。

import socket
from hashlib import md5

BS = 16
pad = lambda s: s + (BS - len(s) % BS) * chr(BS - len(s) % BS)
uname = pad('admin')
h_uname = md5(uname).digest()

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('202.120.7.217', 8221))

data = s.recv(1024).strip('\n')
print data
data = s.recv(1024).strip('\n')
print data
s.sendall('r\n')
print 'r'
name = h_uname + uname
s.sendall(name + '\n')
print h_uname + uname
data = s.recv(1024).strip('\n')
print data
data = s.recv(1024).strip('\n')
print data

enc = data.split('\n')[0]
enc = enc[BS * 2:]

s.sendall('l\n')
print 'l'
s.sendall(enc + '\n')
print enc
data = s.recv(1024).strip('\n')
print data
data = s.recv(1024).strip('\n')
print data

実行結果は以下の通り。

Welcome to 0CTF encryption service!
Please [r]egister or [l]ogin
r
!・キ・・フ└rEィ渋dmin
Here is your secret:
06f03d4dbaf5e6e99a049ce5c213fa6b1f82eaf57d71bfb74195417e9cf4c0a91389f95efc7f82af6f7c1b2decdaf2bfae0118b0d03887586632ebc95fcb2194
Please [r]egister or [l]ogin
l
1f82eaf57d71bfb74195417e9cf4c0a91389f95efc7f82af6f7c1b2decdaf2bfae0118b0d03887586632ebc95fcb2194
Welcome admin!
flag{Easy_br0ken_scheme_cann0t_keep_y0ur_integrity}
flag{Easy_br0ken_scheme_cann0t_keep_y0ur_integrity}