SECCON CTF 2019 QUALS 参加記

SECCON CTF 2019 予選に参加した。CTF のコンテストに出た経験はほとんどなく、普段なら出なかったかもしれないが、smallkirby (@python_kirby) に誘ってもらったことを機に取り組んでみることにした。なんか部の何人かは前回優勝者として作問に関わっていたらしく、だいぶ遠い世界だなあと思ってしまう。

相方は pwn とか rev とかができる人だったので、自分は web を見てみるかーと思ったが最終的には何もわからなかった。結果点数の低い問題を探して解く人になった。

コンテストは日本時間で15時~翌日15時だった。コンテストといえば競プロ、特に数時間程度のアルゴ形式ばっかりやっていた自分としてはどうスケジューリングすればいいかわからなかった。結局、15時~21時まで解き、21時~24時は AtCoder Beginners Contest に出て、24時~6時でまた解き、13時に起きてパソコンの前に座って無をした。

[misc] Welcome / [misc] Thank you for playing!

CTF にはこういう儀式的なものがあるんですね。ド初心者でも 0 より真に大きい結果を残して帰れてほっこり。

[crypto] coffee_break

crypto の中で点数がだいぶ低かったので見てみた。Python で書かれた暗号化プログラムと、フラグを暗号化した結果が与えられる。

暗号化は二重になっていて、1回目は独自の暗号、2回目は AES-ECB というアルゴリズムで暗号化されていた。後者についてググったところブロックごとに独立で暗号化されるらしく、関係あるのかと思ったが、結局計算量が多いことには変わらない。その後の調べで「復号できるんかい!」となり、2回目を外す。1回目の独自暗号はループが文字ごとに独立で回されており、1文字ずつ総当りしていけば解ける。探索が途中で止まったが、思い立って _ を探索に含めたらフラグを得られた。

[misc] Beeeeeeeeeer

難読化されたシェルスクリプトが渡される。実行すると目まぐるしく動くアスキーアートが出てくる。

シェルスクリプト${} とか $(()) とか $'' みたいな部分を展開していくと、長い Base64 データが埋め込まれていて gunzip されている箇所がある。そこを取り出して解凍してみると、また難読化シェルスクリプトが出てくる。このスクリプトに「Beeeeeeeeer」と名付けた。

それも展開していくと、「ビープ音が何回出たかのクイズに答え、それがパスワードになって openssl aes-256-cbc で復号される」という内容であることがわかる。ビープ音(\a)は出せなかったので文字に書き換えて、結果をどこかに出力するようにするとまた難読化シェルスクリプトが出てくる。このスクリプトに「Beeeeeeeer」と名付けた。

次の難読化はちょっと雰囲気が変わっていたが JavaScript 難読化で知っていたものと似た感じだった。この辺ツールか何かで復号できるんだろうか。パスワードを聞かれるプログラムだが、コメントでパスワードが「bash」であることが書かれている。次は「Beeeeeeer」で、「Beer」になるまでやるのかな…と絶望していたが、ここでフラグが出て終了らしい。

フラグは今までの難読化で使われた変数を集めたもので、3回目は bash、2回目はビープ音の最終的な回数っぽかったので 3、1回目は読むと hogefuga だったので入れたら通った。3回をバラバラに処理しているので変数を目で拾っているが、想定解はなんだったのだろうか。

[web] Option-Cmd-U

URL を入れるとそのソースコードを表示するページがある。そこ自体の PHP スクリプトを見られるので見ると、フラグは /flag.php にあるが、内部ネットワークからしか見られないらしい。

ずっと考えてわからず、終了後答えをみたら http://nginx/ が鍵らしい。URL の正規化を利用すると nginx のチェックをスルーしつつアクセスできるらしい。Nginx もよく知らなかったし、完全に知識不足だったので悲しい。

[web] web_search

SQL インジェクションで、特定の文字列は消されてしまうらしい。コメントとかタブ文字とかでやってみたが実行できる文がうまく作れなかった。

感想

ぐええ

きびしいね

でも続けていきたいね