アオカケスの鳥かご

日々の出来事を綴っていきたい

CTFを主催した感想

9月20日(金)15:00から9月27日(金)9:00までの約1週間の期間でMaidakeCTF2019を開催しました。

大会終了後に登録していただいた方も含めると、最終的には97人という驚きの数字になってしまいました。
もともとは私が所属しているサークル内の合宿用コンテンツとして用意していたため、想定人数は20人程度としてCTF用サーバーのスペックもかなり絞っていました。

1日目のかなり初期の段階でサークル外の方が参加してくれたおかげで芋づる式に外部の方が増え、すぐにサーバーのメモリが足りなくなってしまいました。実にありがたいことです。(参加者にはご迷惑をお掛けしましたが...)


問題解放時点で問題数が55問とかなりのボリュームでしたが、CTFガチ勢の方はこれを5時間程度で解き終わっていました。


55問のうち私が作問したのは51問で、約4か月ほどかけて作りました。
各問題の配点の妥当性を会議しているときは「これ絶対誰も解けないでしょww」なんて笑っていた問題がいくつかあったので、正直全問解かれるとは思っていませんでした。

よく考えれば私の脳よりも優秀であれば解けないはずはないので、解かれるのは当然と言えば当然なのかもしれません。


9月24日(火)21:00には新たに4問追加しましたが、そのうちの3問は一瞬で解かれました。さすがとしか言えません。
いくら簡単な問題と言っても公開されてから1分もかからずに解くのは頭おかしいと思います。

最後の1問はなかなか解かれずにヒントを出したりしたのですが、アレはさすがに問題が悪かったと思います。
申し訳ありません。


さて、MaidakeCTFの最終的なランキングはこのようになっていました。
f:id:aokakes:20190930113601p:plain

1位のLaikaさんは追加問題も含めて全問制覇です。
おめでとうございます。


上位10人の中にサークルの後輩が1人だけランクインしています。まだ1年生なのに。
上位はなかなか猛者が揃っていたように思いますが、その中に潜り込んでしまうのはもうすごいとしか言えません。

本当に1年生なんですか?4年生の間違いでは?
少なくとも私の同級生の9割5分以上の人よりも知識があるのは間違いないと思います。


それではここからはCTFを主催するにあたっていろいろ苦労した点などを垂れ流していこうかと思います。

サーバー構築

MaidakeCTFではAWSでサーバーを構築し、サービスを提供していました。

最初はインスタンスをt3のmicroにしていましたが、途中からメモリ不足に陥ったため余裕をもってmediumにアップグレードしました。
メモリが4倍になって料金も4倍です。
f:id:aokakes:20190930115321p:plain

サーバー構築している間も含めて合計$20.32でした。2,193円ぐらい。
mediumにしたのが地味に効いてます。


サーバーを構築する手順はおおまかには以下の記事の通りです。
aokakes.hatenablog.com

しかし、実際にCTFが始まってから気づくこともいくつかありました。
たとえば一度に開けるファイルの上限を上げておくとか。ポートを指定して常駐させているプログラムのリソース消費具合とか。


朝起きたら何かしらのプログラムが止まっていたりして、その対応をしていたらバイトの時間が迫っていて遅刻しかけたりもしました。
今のとなれば良い思い出です。


EC2のスペックなんかは最初から余裕を持って選択するべきでした。

作問

MaidakeCTFではCTF初心者でもサクサク解けて楽しいと感じられるような問題をたくさん用意することを意識していました。

ツイッターなどを見ていると、「楽しい」「面白い」などと言った内容をちょいちょい見かけたのでそれは満たせていたのかなと思います。
とても嬉しかったです。ありがとうございました。


しかしながら、作問を進めるにつれてCTFの大事な要件とも言える「セキュリティ」を見失っていたような気がします。
Web問題なんかは大なり小なりセキュリティ要素を盛り込めていたかと思いますが、QRやMiscはあんまりセキュリティ関係ないですね。

とはいえ、私が作りたかった問題を作ることができたのでよしとします。


最近、私の中でCTFは「IT全般に関する知識を問われるもの」という風に考えています。
セキュリティ以外にも重要なことはたくさんありますからね。都合よく解釈することにします。


さて、MaidakeCTFが終わってみると参加者の方がさっそくwriteupを公開してくれていたり、ツイッターのDMで「この問題こんなやり方で解けたんだけどバグじゃね?」といった質問をいくつか頂いたりしました。

多くの問題で私が想定していなかった解法があったようです。というか私が検証をサボりすぎていたようでした。
その問題のほぼ全てがWebページにアクセスするものです。


Webページ上でFlagを表示する方法について結構考えたりしたのですが、結局いい方法が思いつかず以下のようなスクリプトを書いていました。

$.post('flag.php').done(function(data) {
	alert(data);
});

jqueryでflag.phpにpostして、その結果を表示するものです。
なお、flag.phpはFlagを出力します。


当然ソースを見てflag.phpにアクセスしてくることも想定して対策は練っていたのですが、どうやら対策の仕方が甘かったようで一部の問題ではそのままFlagが表示されてしまうことがありました。

大会中に気付きはしたのですが、すでに複数人に解かれていたため他の参加者に不公平になると考えてそのまま放置しました。
これも検証をサボったせいですね。


次があるかは分かりませんが、もしまたCTFを開催する機会があればちゃんと検証して穴を確実に塞ぐように気を付けたいと思います。

writeup

Crypto - 8問

aokakes.hatenablog.com

Reversing - 2問

aokakes.hatenablog.com

Misc - 13問

aokakes.hatenablog.com

Programming - 5問

aokakes.hatenablog.com

Forensics - 7問

aokakes.hatenablog.com

Network - 4問

aokakes.hatenablog.com

さいごに

1週間という長い期間お付き合いいただきありがとうございました。


一部の問題ではどんな解き方をしたのか分かるものがあったりするのですが、それを見て「こんな解き方もできるのか~」と大変勉強になりました。

参加者のwriteupを見ていると、自分のやり方が回りくどすぎてなんだか恥ずかしくなってきます。
もっと勉強しなければいけないと改めて思いました。


開催中にサーバーが落ちてアクセスできなかったり、そもそも問題がちゃんと動いていなかったりと色々ご迷惑をお掛けして申し訳ありませんでした。
この教訓を(あるかは分かりませんが)次回に活かしていきたいと思います。


MaidakeCTFに参加してくれた多くの方々に改めてお礼申し上げます。
本当にありがとうございました。

もしまた開催することがあればぜひ参加していただけると嬉しく思います。