SECCON CTF 2014 online 予選(冬) writeup

チームで参加した。97位だった。全然解けなくてつらぽよだったし修行したい。

Get the key

httpが散見されるので、export objectでファイルを取り出して開くと以下のようなhtmlがあった。

f:id:TAKEmaru:20141209010352p:plain

これを見て、http://133.242.224.21:6809/nw100/key.htmlにアクセスしてみるとidとpasswordを求められる。

WiresharkでFollow TCP streamを見るとAuthorizationにbase64が書いてあった。
f:id:TAKEmaru:20141209010423p:plain
デコードするとseccon2014:YourBattleFieldが出てくるので、http://133.242.224.21:6809/nw100/key.htmlにアクセスしてこれを入力したらflagが見える。

今日、隣にバイナリエディタで解いてる人いてびびった。

Easy Cipher

octetになかなか気付けなくてアレだった。

#! /usr/bin/env python3.4
# coding: UTF-8

crypt = '87 101 108 1100011 0157 6d 0145 040 116 0157 100000 0164 104 1100101 32 0123 69 67 0103 1001111 1001110 040 062 060 49 064 100000 0157 110 6c 0151 1101110 101 040 0103 1010100 70 101110 0124 1101000 101 100000 1010011 1000101 67 0103 4f 4e 100000 105 1110011 040 116 1101000 0145 040 1100010 0151 103 103 0145 1110011 0164 100000 1101000 0141 99 6b 1100101 0162 32 0143 111 1101110 1110100 101 0163 0164 040 0151 0156 040 74 0141 1110000 1100001 0156 056 4f 0157 0160 115 44 040 0171 1101111 117 100000 1110111 0141 0156 1110100 32 0164 6f 32 6b 1101110 1101111 1110111 100000 0164 1101000 0145 040 0146 6c 97 1100111 2c 100000 0144 111 110 100111 116 100000 1111001 6f 117 63 0110 1100101 0162 0145 100000 1111001 111 117 100000 97 114 0145 46 1010011 0105 0103 67 79 1001110 123 87 110011 110001 67 110000 1001101 32 55 060 100000 110111 0110 110011 32 53 51 0103 0103 060 0116 040 5a 0117 73 0101 7d 1001000 0141 1110110 1100101 100000 102 0165 0156 33'

for i in crypt.split(' '):
    try:
        if i[0] == '0':
            print(chr(int(i, 8)), end='')
        elif len(i) >= 6:
            print(chr(int(i, 2)), end='')
        else:
            print(chr(int(i)), end='')
    except:
        print(chr(int(i, 16)), end='')

Choose the number

2回目のrecv忘れててアレだった。

#! /usr/bin/env python2.7
# coding: UTF-8

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('number.quals.seccon.jp', 31337))

while True:
    recv = s.recv(2048)
    print recv

    if 'minimum' in recv:
        numbers = map(int, recv[:-21].split(', '))
        print numbers

        answer = min(numbers)
        print answer

        s.send(str(answer))
    
    elif 'maximum' in recv:
        numbers = map(int, recv[:-21].split(', '))
        print numbers

        answer = max(numbers)
        print answer

        s.send(str(answer))
    
    else:
        recv = s.recv(2048)
        print recv
        break

s.close()

Shuffle

IDAで開いたらsrandの前でスタックに数値を積みまくってたのでこれかなあと思って読んだらflagだった。
f:id:TAKEmaru:20141209011836p:plain

REA-JUU WATCH

チームメイトが瞬殺していた。
点数のページでdeveloper tool開くと点を/users/chk/からとってきてるのが分かる。
1番には何が入っているのか気になるので http://reajuu.pwn.seccon.jp/users/chk/1 を見ると、
{"username":"rea-juu","password":"way_t0_f1ag","point":99999}があるので、これでログインして適当に選択していくとflagが表示される。

Get from curious "FTP" server

チームメイトが解いた。

$ ftp ftpsv.quals.seccon.jp
Connected to ftpsv.quals.seccon.jp.
220 (vsFTPd 2.3.5(SECCON Custom))
Name: anonymous
331 Please specify the password.
Password: 
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> quote stat *
213-Status follows:
drwxr-xr-x    2 0        107          4096 Nov 29 04:43 .
drwxr-xr-x    2 0        107          4096 Nov 29 04:43 ..
-rw-r--r--    1 0        0              38 Nov 29 04:43 key_is_in_this_file_afjoirefjort94dv7u.txt
213 End of status
ftp> get
(remote-file) key_is_in_this_file_afjoirefjort94dv7u.txt
(local-file) key_is_in_this_file_afjoirefjort94dv7u.txt

Read it

word perfectファイルなので拡張子wpdにしてwordで開くも読めない感じであきらめた。
write up読んだら、passwordかかってたようで、なんで開けたのか意味不明。

Confused analyte

2日目はほとんどこれだけやってたけど、解けなかった。
ftk imagerでメモリキャプチャしてstrings|find string したり、下の記事を試したりしたけど、うまく動かせなくてダメだった。"—ioc_dir” option not foundとかいわれてつらかった。
Fast Malware Triage using openioc_scan Volatility Plugin - CCI
IOCの見識を深めたい。いまのところ、writeup出てなさ気なので誰か書いてください。