ふるつき

v(*'='*)v かに

CakeCTF 2022 開催記

年に2度ある人生最大の娯楽ことCTF開催のうちの一回、CakeCTFの運営を今年もやりました。開催記を書こうとしていたのですが、どうにもまとまりがなくしっくり来なかったので、時系列に出来事や感情をまとめていきます。

ちなみにCakeCTFというのは去年から開催しているインディーズのCTFで、前身としてInterKosenCTFというのがあったんですが、運営が高専とはなんら関係なくなったのと名前がダサかったのとでリニューアルしてこういう名前になっています。InterKosenCTFから数えると4年目、5回目の開催ということになるようでした。最近は私と、ptr-yudaiyoshikingの3人で運営しています。

巷で開催されるガチCTFというよりは、カジュアルに問題を解く楽しさを味わってもらうワイワイCTFを標榜しています。

スコアサーバはこちら https://2022.cakectf.com

出題した問題はすでにGitHubに上がっています

github.com

時系列

2022/3/23

Discordのログによるとこの日にとりあえずやるかという話になったようでした。以前から当然のようにやるものという認識は共通してあったと思いますが、CakeCTFとは別で主催しているCTFであるzer0pts CTFの運営が一段落したことで、次なるCTFの運営に視線を定めたというところでしょうか

2022/5/20 - Cryptoの問題が出揃う

まじかっていう感じですが、4月中旬くらいからptr-yudaiがどんどん問題を作りはじめて、それに引きずられるようにしてcryptoの問題も作り始めていて、5月20日には今回のCakeCTF 2022で出題した暗号問題4問がすべて作られていたようでした。その間にptr-yudaiはもっとめちゃめちゃ問題を作っていた気がする…

2022/6/1 - ctftime.org に登録する

CTFTime というサイトがあって、世界で開催されるCTFの情報が集約されたりCTFでの成果に応じてチームにレーティングがついて順位付けされたりします*1。ほとんどのプレイヤーはCTFの開催情報を知るのにこのサイトを利用しています。これまでのCakeCTF(やInterKosenCTF)では、ある程度ローカル指向なCTFであることやCTFTimeのレーティングを気にせず問題を解く純粋な楽しみを追求してほしいことからCTFTimeへの情報の登録を行っていませんでした。

しかし去年のCTFTimeのアップデートで、CTFのレーティングウェイトを0にしてCasual CTFとして登録できる機能が実装されたため、今年はカジュアルCTFとして登録してみました*2

そのための申請をこのあたりでやったようですね。昨今は様々なCTFが開催されていて、土日の予定埋まりがちなので、先手先手をうってCTFtimeに登録しておかないとブッキングなどの危険性があると思っていた気がします。結局BalsnCTFとかぶったわけですが……。ちなみに今回はCTFtime上は初のCakeCTFだったので、CakeCTFというCTFを作る作業とCakeCTF 2022というイベントを作る作業の2段階があり、どちらもCTFtimeの管理者のapproveが必要なのですが、イベントの申請が受け付けられるのに時間がかかって、結局eventが作られたのは2022/6/15だったようです

ctftime.orgのイベント作成ページにcasual eventの選択肢がある様子

ちなみに、暗号の問題はこの時点でptr-yudaiが一通りチェックしてくれてます

2022/7/1

この頃は暗号以外の問題を作ろうとしているものの、勘が失われていてどういう問題が面白いのかわからずめちゃめちゃ困っていました。

2022/7/11

毎回CTFがあるごとに自作のCTFのスコアサーバのkosenctfxというやつを便利にする作業をやっているのですが、今年はタスクのインスタンスを立ち上げる機能をつくっていました。結局作りきれてないんですけど。素朴に競技者がリクエストしたらDockerをランダムなポートで立ち上げてそのインスタンスのIPとポートがスコアサーバに通知される、という仕組みを作っていたのですが、環境を分けたくて作っているのに、nmapとかで発見されてしまうような仕組みでは意味がないということが明らかになって没にしてます。いわゆるバーチャルホストとかで内部的にリダイレクトする仕組みとかにすると良いんですかね……

その他にもちょこちょこkosenctfxにてをいれていまいした。今年は元気がなかったので上記以外はあんまり大きい変更はしようとしてないですが、zer0pts CTFとCakeCTFで毎回少しずつサーバの様子に合わせてフロントエンドを書き直していたのが大変だったので、フロントエンドのロジック部分を切り出して、zer0pts CTFのテーマとCakeCTFのテーマを切り替えやすくしたりしていました。なんかあとから考えるとこういうのContext Providerでやれば良い気がするけど、思いついたのがimport先のパスをtsconfig.jsonで切り替える方法だったのでそういう感じになってます。

2022/7/30

あまりに私とyoshikingが作問チェックをやらないので、土曜日に作問チェックの会をやりました。yoshikingはなぜか来なかったので結局ひとりでptr-yudaiの作った問題を解いていましたが、全部で3問かそこらくらいまで解いて力尽きていました。それを考えるとCakeCTF 2022の問題セットで10問とか解いてる人はすごいですね……

2022/8/3 - Google CTF Sponsorship

なんか去年はフォームが閉じていたような気がするのですが、申請するとCTF Eventように$500のGCPのクーポンを発行してくれるGoogle CTF Sponsorshipという制度があったので応募してみました。なんか公式に紹介されているページとかを見たことがなくて、口伝みたいな感じになっていますが、応募は https://goo.gle/ctfsponsorship からできます。

応募フォームをみると、どのくらいCTFに参加していますか、とか去年の問題を公開していますか? という設問があり、CTFコミュニティに貢献するようなCTFかどうかが問われているような感じがして非常に好感の持てるフォームでした。

我々はそういった活動の推進に一役買っているくらいの自負があったので心配していなかったのですが後日無事審査に通ったという連絡があり、GCPのクーポンコードとCTFのインフラを構築するときの心得や、「なんか大量のアクセスが想定されてもっとクーポンいるようなら言ってください」とか「サポートに連絡するときは〜ということを伝えるとこちらにエスカレーションされます」といったTipsがとても丁寧に書かれていて好感度MAXでした。ありがとう

Google CTF Sponsorshipに通ったからにはGCPを使ってインフラを構築していたのですが、なれないプラットフォームだからかめちゃめちゃ苦戦しました……。理想を言えばスコアサーバはCloud Runに置いて前段にロードバランサを置く……とかだと思うんですが、証明書の発行がよくわからなくて諦めました。

あと配布ファイルとかを置くためにCloud Storageを使おうとしたけどスコアサーバにはS3用の実装しかなくて、互換性あるだろうからいけるやろと思って突貫したら、なんかPresigned URLの扱いがうまくイカなかったのでここだけ諦めてDigitalOcean Spaceを使ったりしました。なんなのか……

ということで基本的に全部Compute Engineの上に置いてdocker-composeで起動する素朴な感じになりました。無念……

2022/8/27

このあたりではptr-yudaiがすでにWeb問題を4つ揃えていて、その作問チェックをしていたようですが、Image Surfingに挑んで撃沈していました。

2022/8/28

焼肉に行った。帰ったあと、スコアサーバをpublishしました

スコアサーバのpublish後の面白い、というかどうすべきか困る話がひとつあったので書いておくと、「ウチが普段使っているチーム名がすでにとられていて困っているので、そのチームを削除してくれないか」という依頼が来ました。基本的にCTFのチーム名というのは登録の早いものがちなので、殆どないとはいえ自分の使いたかったチーム名がすでに使われている、ということはありえることです。今回のケースはすでに取られていると思ったものの、それはそのチームの別の人が先んじて登録していただけだったので特に問題にはなりませんでしたが、本当に全く関係ない人が偶然に、あるいは故意に既存の(ある程度の活動実績のある)チーム名でチームを作っていた場合はどうするのが良いのでしょうか*3

2022/9/1

問題をホストするためのサーバを立てたりしていました

2022/9/3 - CTF開始

朝はデータベースを1分ごとにダンプするcronとかをかいてました。実験で1分にしていて、あとで5分とかにしようとしていたのをわすれていた。でも大したサイズのないDBなので毎分ダンプしても全然ディスク的には余裕です。

そして14時になってCTFが始まりました。なんかfrozen cakeという問題のフラグを提出しようとすると502応答が返される、という不具合報告が複数来てこまりました。実際には特定の問題のフラグを提出しようとしたときではなくて、間違ったフラグを提出しようとしたときのエラー処理をミスって起こる502で、偶然frozen cakeの答えの設定が間違っていて最序盤にはそういうふうに見えたということのようでした。リファクタリングのときにミスっていたことがわかったのでhotfixしました。

その後は落ち着いてきたのでptr-yudaiと将棋をやったりしました。ぼこぼこにされた。 ずっと座っていると疲れたので横になると、ptr-yudaiが気を利かせてくれてそこで通話を終了して私は一旦昼寝しました。 その後10時くらいに復帰してあとは夜通し起きていた。

2022/9/4 - CTF終了

9時位に寝て12時位に起きました。そのまま14時になり、夜ふかしで口内炎ができた以外は特に何もなくCTFが終了しました。良かったです。

終わったあとはCTFtimeにスコアボードを提出して、人々のwriteupを眺めたり、kurenaif先生のwriteup streamを見たりしていたら時間が急速に過ぎていって終わりました。終わりです。

最終的にこんな感じになりました。去年に比べて参加チーム数が倍以上ですが、CTFtimeに登録したのが大きいんだと思います

CakeCTF 2022
開催期間 2022-09-03 14:00:00 +09:00 – 2022-09-04 14:00:00 +09:00 (24h)
登録チーム数 1103
1点以上獲得したチーム数 713
Welcome / Survey 以外の問題も通したチーム数 327

問題について

時系列のところで明らかですが、今年はCryptoの問題を私が全部作って、それ以外は全部ptr-yudaiが作りました。結果として競技中のptr-yudaiはヒントを求めるDMの嵐に呑まれて大変だったようです。負担を分散したい。

それは置いておいて、作った問題に限ると次のような分布になっていて割と悪くない難易度分布になったかなと思います。hi yoshikingはこの2, 3倍は解かれる想定でした。そうなっていたら完璧でしたね

問題名 Solve数
frozen cake 132
brand new crypto 46
hi yoshiking 10
Rock Door 9

以下簡単な問題の説明と簡易writeupとか感想とかです

frozen cake

warmup問題ですが、ptr-yudai曰く「brand new cryptoのほうが簡単」とのことでした。RSAなのですが m^p \mod n, m^q \mod n, m^n \mod n, nだけが渡されているという一風変わった感じの問題です。意外と見たことないけど解けないのかなと思ってやってみたらすんなり解けたので出題しました。

しかし今思い返すと、warmupでRSAの乗法準同型性に関する知識とフェルマーの小定理を要求していてなかなかハードですね。とはいえCTFの暗号分野では基礎となるような数学の知識ですので、CTFの問題としてはこのくらいは出題したいところです。これが解けたらある程度のCryptoに関する実力がありますと言って良いんじゃないかと思います。

ちなみに問題名のfrozen cakeは適当でなんの由来もないです。warmupで温まってほしいからとりあえず冷えたケーキを出しておきました。

brand new crypto

RSA2問目です。 as + bt \equiv 0 \mod \phi(n), a + b \equiv 1 \mod phi(n)となるような a, b, s, tがあって暗号化は (mr^s, mr^t) \mod n、復号は (mr^s)^a * (mr^t)^b \equiv m^{a+b}r^{as + bt} \equiv m \mod nとなるようなプロトコルで平文が暗号化されていますが、暗号化が1バイトごとなので平文を総当りすれば良いです

なんか雑な暗号方式を自作したら大体脆弱だろうと思ってガチャガチャやっていたら暗号方式っぽいものはできたけど、意外とそのままでは解けなかったのでbyte by byteで暗号化するといういつものやつをやりました。いかにも何かありそうな方式なのでもうちょっとうまく料理したかったですね

そして今配布ファイルを見返すとassertが入ってるけど、これは実験の名残で本番では消すつもりだったのを忘れていた…まあいいか

hi yoshiking

rubyのAES-GCMです。問題がrubyで書いてあるとき、理由があってそうしている場合とそうでもない場合があって、今回は理由があります。AES GCMとかで検索するだけでいくらでも出てきますが、rubyを含むいくらかの言語ではGCMのタグが16バイトじゃないときも受け入れてしまうんですよね。これを利用してtagを1バイトずつ全探索するだけの問題です。有名事実だが問題になってないやつだと思っていたのでこの機会に消費してしまおうと思って問題にしました

予想より全然解かれてなくてびっくりしてる。これはなんかsolve数があったらもっとみんな取り組んですぐ解いたろうなと思います

Rock Door

今回のボス問題です。DSAですが k r,  xの導出にsha256を使っていて、この剰余の法に比べて小さいことを利用してLLLすると解けます。Coppersmith's methodでは解けないと思いますがなんでそうなのかはちゃんと追ってません。なんかBoundが違うのかな……

Thue's Lemmaが割と好きなんですけど問題にしにくくて、それベースでなにかないかと思って作ったのがこれです。 rを渡さないとかこすっからいことをやっているのが不満ですが、式変形してLLLする問題としてはなかなかおもしろく作れたんじゃないかと思ってます

Surveyについて

全部読んでいます。特に記名で書いてもらっているものは顔(アイコン)を想像しながら一語一語噛み締めています。丁寧に書いてもらってありがとうございます。さっと目についたものにお返事します

  • 問題のダイアログの表示位置がよくない
    • すみません。ちゃんとドッグフーディングしてないのがバレる。私も不便だと思ったので改善します。
  • 簡単な問題であっても、やるだけになっておらず、何かしらのひらめきを要するようになっているのが良い
    • ありがとうございます。まさにそのような問題を目指しています
  • 3ヶ月ごとに開いてほしい
    • ptr-yudaiがどれだけ作問できるかによりそうです。私は無理なので。あと運営は準備の時間と体力を激使うのでそのあたりもなんとかしたいですね
  • スマホからだとちゃんと表示されない
    • すみません。全然需要を把握してなくて一切対応しようとしてませんでした。需要があることがわかったのでなんとかするかもしれませんし、余力がなければ後回しにします
  • また開催してください
    • ありがとうございます。がんばります

Surveyはいつでも募集してるのでなにか思いつき次第また書いてくださると嬉しいです。次にCTFを開催する前とかに見直しているので大体1年くらいは書き込むチャンスがあります

その他

どこかには書きたかったけどやっぱりどこにも入れられなかった話を書きます

みんなつよい

これはスコアボードの上位20チームのスクリーンショットです。日本のCTFだとか、カジュアルでレーティングがついてないとか、裏でBalsnCTFがあってデカいチームはみんなそっちをやってるとかはありそうですが、それでも上位にこれだけ日本のCTFチームやCTFプレイヤーがいると嬉しくなりますね。私もこのなかでワイワイ鎬を削りたい

そしてスコアボード全体で見ると日本の国旗がおもったよりたくさんあって、私が把握しているよりも遥かに色んな人がCTFをやっているということもわかり、嬉しいですね。

スコアサーバの更新

ところで、スコアサーバのフロントエンドはNextjsってやつで書いていて、基本的にSSRを使うようにしています。CTF開催後にはこれをSSGにすると静的サイトができて便利なんですよね。それで困っているのがフロントエンドの更新時のダウンタイムです。基本的にフロントエンドの更新はgit pull && docker-compose -f docker-compose.prod.yml up --build -d みたいな原始的な感じでやっているんですが、nextjsのビルドはコンテナの立ち上げ後にやっているので、next buildが走っている間はリクエストを捌けなくてダウンタイムが発生しちゃうんですよね。どうするのがよいのか…

図です。スコアサーバ公開からCTF開始までの一週間はなだらかに登録チーム数が増え、CTFの開始と同時に傾向が変化して面白いですね

Welcome, Survey以外の問題の解かれ方のグラフです。あんまり言えることはない気がしますが、難易度の逆転みたいな現象はあまり起きていなさそうです

ケーキ

CakeCTFという名前、かなり良いと思っていて、参加者の方やタイムラインで顔見知りの方がCakeCTFにちなんでケーキの写真を上げてくれたりしています。勝手にそういうツイートを集めて盛り上がっている感じを出しておきます

おわりに

やっぱCTFの運営は楽しいけど……ptr-yudaiが大体全部やってる気もするし元気を取り戻してもっと作問と作問チェックをやるのが今後の目標です

それでは、(あれば)CakeCTF 2023で、そして(運営の元気があれば)zer0pts CTF 2023でもお会いしましょう。バイバイ

*1:私はこのレーティングあんまりうまいこと動いてないと思っていて嫌いですが……

*2:去年のCakeCTFの直後くらいで、某所でなぜCTFTimeに登録しないのですか? といわれてレーティングを気にせず楽しんでほしいから、と返した直後に実行されたのでCakeCTFのために実装された機能だと密かに思っています。ちなみに他のCTFで使われているところを見たことがない

*3:zer0ptsは故意の被害にあったことがあって、そのときは運営に言ったらなんの確認もなくチーム名を融通してもらえたのでびっくりしました