ふるつき

v(*'='*)v かに

InterKosenCTFを開催した

あわせてよみたい:

furutsuki.hatenablog.com

ptr-yudai.hatenablog.com

InterKosenCTF反省会

 我々insecure(ptr-yudai, theoldmoon0602, thrust2799, yoshiking)は、2019-01-18 21:00 ~ 2019-01-20 21:00 (JST)の48時間、高専生向けと銘打ったCTF、InterKosenCTFを開催しました。出題した問題のwriteupは後日ちゃんと書くとして、この記事ではCTF全体の振り返りをやっていきます。

結果

 登録チーム数は105チーム、1点以上獲得したチームはNで、参加者は170人でした。優勝はStereo Sky Townで4050pts、単一高専高専生だけからなるチームでの1位はproelbtnが1650ptsでした。また、個人の最多得点はst98さんで、2550ptsでした。おめでとうございます。その他の参加者の皆さんも、お疲れ様でした。

f:id:Furutsuki:20190120221157p:plain

スコアサーバについて

 スコアサーバを書きました。これについては書きたかったから書いたとしか言いようがありません。競技中に一度重たくなって再起動をかけたこと以外は特に問題なく動いてくれましたが、やってみた結論としては「CTFdつかえ」になりそうです。CTFdのほうが圧倒的に完成度が高い。

 スコアサーバを書く上で一番苦心したのはデザインで、格好良いスタイルや伝わりやすいデザインというものが全くわからないので本当に大変でした。時点で時刻の扱いに困った。結局CTFの開始時にはグラフの時刻だけUTCになってしまうという問題が発生して競技中にもかからわず一瞬スコアサーバの再起動を伴う修正を入れました。

インフラについて

 AWSを使いました。t2.microをスコアサーバ用とデバッグ用に1台ずつ、それから問題サーバ用に3台で、スコアサーバはELBとWAFを噛ませてあります。kosenctf.comというドメインは探してみたらあったので思い切って買って、DNSはRoute 53で管理してました。もう使う予定ないけど。このドメイン使いたい方がいらっしゃればお譲りします。

 それでお値段なんですが、大体1ヶ月動かし続けて $58.04 です。ドメイン代$12.00も含まれています。思ったよりかかってしまった。こういう状況でお財布によくないので、スコアサーバも問題サーバもCTFが終わったら落としてると思います。

f:id:Furutsuki:20190119180554p:plain
これは今月分の料金

 これも反省点ですが、ちょっと重たいファイルを問題として提供した際、スコアサーバでキャプチャしていたパケットファイルが1秒に数百Mという単位で膨れてハードディスクの容量が足りなくなる問題に遭遇したりしました。

タスク管理について

 作問の管理はgitリポジトリのREADMEで行いました。問題のリポジトリ(https://bitbucket.org/kosenctf/challenges/)もそのうち公開する予定でいます。だいたい1ジャンル3問で、100、200、300くらいの配点になるように問題を作りました。これは決めていたというわけではないですが、なんとなくptr-yudaiとの共通認識としてこうなりました。各問題は一応作問者意外の誰かしらが解けることを確認していて、余裕があるとwriteupも書いています(これは勉強用)。

 問題そのものの反省はwriteupでやるとして、作問の反省点といえば仕事量ですね。結局21問出題しましたが私が作ったのが8問で、残りの13問は全てptr-yudaiが作問しました。ちょっとバランスが悪くて、質問に対応するコストなんかもあるのでもうちょっと負荷分散したいなあというところです。

 作問以外のタスクはhackmdにチェックリストを作って管理していました。これはそれなりにうまく行った気がします。結局やらなくてチェックのついてないタスクもありますが……。

運営

 楽しいですね。フラグのSubmitを見ているだけで楽しい。誰かが自分の作った問題に取り組んでいるのを見るとすごくハイになります。

 運営の反省は「なぜ自動化しなかったのか」で、まあできなかったんですけど、問題の公開とポート開放を自動化、公開された問題の配布ファイルが正しいかチェック、問題のヘルスチェックを自動化などするべきでした。手作業でAWSのSecurity GroupのInbound Rulesを追加したり、オープンする問題を指定して毎回コマンドを打ったりしていて愚かしい。

 それから「突貫の問題を出すときはしつこくチェック」ですかね。2問ほど突貫の問題を出したんですが、Login Reloadedではスコアサーバに登録した正答のフラグが間違っていて、Image Uploaderでは作問者が寝ている間に問題が落ちたときの対処がわからず困り果てました。これらのミスはまあ仕方がないといえばそうなんですが本当に精神と参加者に悪いので病む……。

 「競技者に助言しすぎない」、というのもあります。送られてきたフラグに0とOの間違いがあって、その提出を行った人がtwitterで「わからん」と言っていたので「解けてるよ」と言ったんですがこれはやりすぎでした。せいぜい、「わからないところがあったら質問してね」くらいに留めるべきですね。でもそれだとちょっと冷たすぎる気もしているんですよね。あんまり質問とかせずにTwitterに「わからん」って書いて済ましちゃうので、そういう部分のフォローも入れるべきかなと思ったりもしていました。

問題について

 これは深く反省しないといけないやつなので、こちらにもかきます。flag generator という問題と、Login / Login Reloaded という2つの問題についてです。

 flag generatorはReversing 100ptsで、まあそんなに難しくないやつなんですが、flagをgenerateしている途中のゴミ出力に '\b'が入ってしまい、フラグ末尾の'?'が削られてしまうという問題がありました。'?'なんて微々たる差というかフラグには入ってないことも多いので、'?'のない形式で何度も提出してみるもののwrongと言われ、諦めてしまうチームが多数見られました。これはテスト時にptr-yudaiに言われてわかっていたことなんですが、その場では「straceやxxdで容易に対応できるしそれもreversingの能力の一つ」ということでそのままにしていました。だけどこれ実際に参加者がこんなクソみたいなところで躓いているのを見ると本当に辛いですね。作問者が悪いです。「ごみを出さない」「ややこしいフラグにしない」「テスト時に気がついているんだからちゃんと対処する」をしていくべきでした。

 Login / Login Reloaded はそれぞれ250点、50点のWeb問題なのですが、Loginでだけ通用する解法とLogin/Login Reloadedの両方で通用する解法があり、部分点と満点で合わせて300点という認識で出題しました。しかしLoginでだけ通用する解法と、Login Reloadedにも通用する解法はあるで別物であり、部分点と満点という対応付けが正しかったのかと言われると自信をもってそうだとは言えません。本当は Login Reloaded単体を300点で出すのが良かったんでしょうか。これはどうしたら良いのかわからなくて困っています。

その他

 企画も作問も運営もほとんど僕とptr-yudaiの二人でやってしまいました。thrust2799とyoshikingも運営のメンバーではあるんですが、何を任せればよいのかわからず……。これも反省点の一つですね。

 難易度がちょっと非高専生向けになってしまったのは悪いなと思ってます。気がついたらこうなっていた。大体ptr-yudaiが見積もりに失敗して僕もそっちの難易度に引きずられた、という感じはありますが。

 あと構想段階では「スポンサーつけたら賞品とかインフラとかのお金お小遣いから出さんでええやん!」とか思ってたのをすごい恥じてる。途中で冷静になってよかったですね。  

どうでもよいこと

 もっと高専生はCTFをやっていいと思います。参加するのも開くのも。時間と環境と熱意があるのですぐ強くなるし楽しいだろうし。少し前のDensanCTFもそうですが、このInterKosenCTFもなにかのきっかけになってくれればと思っています。

謝辞

 InterKosenCTFはinsecureのチームメイト、CTF運営という奇行に理解を示してくれた私の家族、それから参加者の皆様なくしては成り立ちませんでした。ご協力ありがとうございました。