ふるつき

v(*'='*)v かに

BSides Ahmedabad CTF 2021 開催記

2021年11月6日〜7日にかけて、24時間のCTF、"BSides Ahmedabad CTF 2021"をzer0ptsとして開催しましたのでその記録です。

経緯

BSides Ahmedabad CTF 2021は(多分)インドのセキュリティカンファレンスに付随するCTFで、zer0ptsのチームメンバーに幾人かインドのメンバーがいた事から話が回ってきました。当初はこれ本当にやるんですか、という雰囲気ではあったもののなし崩し的に開催に協力することになりました(やるんですか、やるならこういう構成でやるのかな、労力減らすにはどうしましょうみたいな検討をしていたのでその段階でやるつもりではあったっぽい?)。

BSidesナントカというCTFは「セキュリティカンファレンス併催の行事」くらいに思っていたのですが、思ったよりちゃんとしたコミュニティが存在しているようです*1。へー。

概要

日時:2021-11-06 12:00:00 +09:00 - 2021-11-07 12:00:00 +09:00 (24時間)
スコアボード: https://bsidesahmedabad.ctf.zer0pts.com/
登録チーム数: 731 参加チーム数(1点以上獲得チーム数):314

モチベーション

CTFプレイヤー、またCTFチームが独自のCTFを開催するのは自然な流れであるとはいえ、多くの場合それはすべてを自分たちで開催するCTFであって、イベントの主催はまた別にあってCTFだけを開催するというケースはそう多くないのではないかと思います*2。このとき意外とモチベーションをどこに置くかということは難しいように感じました。

我々はすでに過去2回のzer0pts CTFの開催経験があり、順当に行けばこのあとzer0pts CTF 2022の開催が遠くない未来に控えていますから、純粋に「CTFを開催したい」という欲はすでに満たされているし解消される予定があります。また、他にCTFを開催するモチベーションとしてはチームとしての名を売りたいという承認欲求や、面白い問題を提供したい・参加者に強くなってもらいたいなどのCTFコミュニティへの貢献の欲求があると思いますが、それならばなおのことzer0pts CTFという名前で開催したほうが名前が認知されますし、多くの参加者に問題に取り組んでもらえます。

というわけで、個人的にはこのCTFへのモチベーションはさほど高いわけではありませんでした。"- DUNGEON -"とか言う名前や、下記のような文句を勝手に決められてしまっていたことも「気に食わなさ」に一役買っていました*3

Tired of easy tasks?

We invite you to spend 24 hours in the wildness of Dungeon to battle amongst toughest skulls and emerge as the real dragon. There will be 5 categories with various difficulties: pwn, web, rev, crypto and misc.

Warning: Adrenaline rush to win this CTF may jumping off your chair multiple times, hence play safe. Make sure to stock up your supplies and be ready to Hack-Eat-Sleep-Repeat ⭐

では全くやる気がないのに嫌々やっていたかというとそうでもなくて、インドや周辺地域に住むチームメイトにとってこのCTFは例えば私がSECCONやCodeBlueの開催を任されるようなものだったでしょうから協力はしたいという気持ちはありましたし、CTFを開催する余裕があるなら経験を詰んでおくことは基本的には良いことなので次の開催へなにかつかめたら良いなと考えていました。また、個人的にあまりモチベーションがあがらないCTFだからといって適当にやるかというとそんなことはなく*4、CTFをzer0ptsの名前でやる、というか私が関わるならできるだけ「この人がいるならある程度のクオリティがあるだろう」と思われるレベルは常に保ちたいと考えているので結構頑張りました。

あ、そういえば運営頑張ったのでT-Shirtかなにかももらえるらしいです🤗

作問

ところで作問です。今回は24時間のCTFだったわけですが、2ヶ月弱の準備期間が十分かというと決してそんなことはありません。CTFの問題を作るためにはとにかく時間が必要で*5、2ヶ月の間結構厳しい思いをしていました。

個人的にはなんとか2.5問をつくりあげたわけですが(1問はこんな感じで作れないですかね、という原案を出したらS3v3ru5がうまく解ける形に落とし込んでくれました)、実はこれはギリギリのラインです。zer0ptsは調子が良いときで10人くらいが稼働しているわけですが、24時間CTFに25問程度提供するとしてひとりあたり2.5問つくる必要があります。また、実際には10人動けていることは殆どないので 6〜8人くらいのつもりで4問くらい作れていると理想的です。実際に今回も作問者のuniqをとってみると6人でした。

それではこの不足分がどのようにして補われたかというと、ここで我らが恐怖の作問マシーンptr-yudaiが登場します。今回のCTFでは結局21問(Welcome, Survey除く)が提供されたわけですが、このうちptr-yudaiが作問または作問に携わって名前を連ねている問題は13問あります。ptr-yudaiはCake CTFやACSCの運営でも問題を人一倍提供しているのに加えてASIS CTFなどにも問題提供しているわけで異常ですね。ありがとう……。みなさんもCTFを開催するときはptr-yudaiを控えさせておくか十分な時間をかけて準備されると良いと思います。

ところで今回私が提供した問題のうち、ECC-RSA 2とThey Were Elevenはそこそこ上手く作れたかなと思っています。zer0pts CTFにまわしても良かったな……

インフラ

インフラですが、今回は面白い感じになってしまいました。はじめはDigital Oceanのクレジットをくれると言っていたのが、Google CloudのCTF Sponsorshipに申し込んだからGCPでも良いかと聞かれ、まあ良いですよと言っていたら申請が通らなかったか遅かったかでAWSになりました。

それは良いとして、今回は最近zer0ptsに加入したKahlaがFword CTFでインフラを担当していたということで色々作戦会議をしたりしたんですが、結果として船頭多くして船山に登るという感じになりました。その最たる例がこちらになります。

これはスコアサーバ用のインスタンス(t3.xlarge)のCPU使用率のグラフですが、明らかにオーバーキルであったことがわかります。Kahlaはスコアサーバが万一おちて競技中にダウンタイムが発生することをとても心配していて、これにもう一台同じインスタンスをたててALBでロードバランシングしようとしていました(結局なんかうまくいかなかったみたいです)。これは彼のFword CTF運営の経験からくる心配で、そのときはxlargeを建てていても30分のダウンタイムが発生してしまったようですが、今回に関してはまったく不要の心配でした。

しかしこういうことをやっていった結果、AWSの請求はかつてない感じになりそうです。そもそもCTF始まる一週間も前からRDS建てっぱなしとかなのでそこが一番効いている気がしますが……*6。まあそれは運営が求めていたことだし、財布も運営持ちなので良いかと思っています。しかし同時期にCTFプレイヤーのあつまるDiscordでCTF開催費用に関する議論があったのを見ていると、スポットで開催すれば$10〜$50で抑えられるところを$200とかかけているのはまったく馬鹿らしいですね。今回でまた一つ感覚を養えたと思っておさめることにします。

その他インフラに関してですが、インフラを触れる人が増えたのでワンマンで回すことが難しくなった結果、状態の把握や共有が必要だろうということでterraform + ansibleを使ってみたけど結局ワンマンで管理してるとか、スコアサーバはfargate化したいねと言ってたけど記憶を引っ張り出すのに失敗して諦めた話とかがありますがうまく話をつなげることが出来なかったので割愛です。

スコアサーバ

powered by kosenctfx です。私はrCTFとかが良いんじゃないんですかと言ったんですけどkosenctfxには根強い支持があってこれになりました。開催にあたって(また)フロントエンドを一新しています。今回のものは結構気に入っているので次からはマイナーアップデートで済むようになると良いなと思っています。今回のハイライトは前回便利に使っていたRecoilを一切使わなくなって、useSWRですべてを済ませるようになったことです。便利。

結局kosenctfxは終始安定して動いてくれてだんだん信頼値も高くなってきました。しかし一方で不便なところも毎回見つけているので改善したいですね(例えば、時刻を指定して自動で問題がオープンになってほしいと毎回思っています)。

その他kosenctfx自体のアップデートとして、prometheus exporterを搭載しました。CTFに関連する統計値をprometheusやgrafanaで見ることができるようになって便利……ですが、だいたいのデータは欲しくなったらDBから集計し直せば良いのでうまい活用法は見つけていません。こういう値がとれたら便利そう、というアイデアがあればぜひ教えてください(全チームのスコアの遷移……と思ったけどちょっと重いかもと思ってやめました)。今回はとりあえずとおもってフラグの提出数や問題の解かれ方の傾向などを出してみて、今回から導入しているMackerelに k1LoW/mackerel-plugin-prometheus-exporter を使って投げてみています*7。ただの値でもグラフにしてみると楽しいですね。

たとえばこれは登録チーム数の遷移ですが、CTF開催後に伸びがよくなっている他、CTF開催中も結構登録しようという人がいることがわかります。急に思い立って吶喊で作ったので最初の方の伸びは取れていないのが惜しまれます。

こちらは問題ごとのsolve数の遷移です。傾きが緩やかになったあたりでみんな疲れてきたり、解ける問題はとき尽くしたということになるでしょうから、ここから開催時間と問題数、難易度の目安がとれそうですね。

ところで急に話は変わるんですが、スコアサーバのフロントエンドはNextJSで書いているんですが、このせいでnode用のDockerコンテナーを一台建てないといけないのはどうにかならないですかね

運営

とりたてて大きな問題もなく、ptr-yudaiやyoshikingやkeymoon先生とhaxballやボードゲームアリーナやピクトセンスで遊びました。何か面白いゲームがあればおすすめお待ちしています

思い出したけど、最序盤にスコアボードの問題一覧とフラグを建てる問題の対応を間違えていて開始直後にホットフィックスを入れたりはしましたが、まあそのくらいで開催に大きな影響が出るスコアサーバの不具合も、問題の不具合もなく……不気味で恐ろしいですね。

その他反省点など

途中でも書いたけど、クライアントとの意思疎通が難しいですね。すべてを任せてくれているかと思えば、スポンサーロゴを入れる場所を指示されたり("我々"のスポンサーではないがな……と思いながら入れたりしました)、参加登録は一週間前から開けておいてほしいと言われて慌てて準備したり……。競技中にはオリジナルのfirst bloodツイートをしてくれていたりしましたが、やるならやると言ってくれればfirst bloodが出たときに通知をおくったりできたと思いました。

うまくやりたければもっと序盤から積極的にコミュニケーションするべきでしたね。そんなモチベーションはなかったわけですが……

ちゃんと問題の準備に時間をかけられるようにスケジュールを組めれば、言うことなしと思いました。問題の準備が素早くできれば、問題の監視とかも遂に手を出したかった……

Surveyを受けて

Surveyの回答件数は閲覧時点で141件でした。141チームもまともにプレイしてくれたかと思うと涙が止まりません。全体的な値とかはptr-yudaiがまとめてくれそうなので*8、気になったメッセージだけピックアップします。

……とおもったけどあんまりピックアップするようなやつがないですね。日本のチームはたくさんコメント書いてくれていて助かるけど、そうでないチームは基本的にコメント空欄というかんじで、時々褒めてくれる回答もあります。一件、「良いCTFでした。我々が来年やるCTFにも遊びに来てね」というやつ(意訳)があって遊びに行こうという気持ちになりました。CTFはお祭り

*1:http://www.securitybsides.com

*2:実はそうでもなくてSECCONやSECCON Beginnersってこのケースだったりしますか

*3:これはかなり根に持っています。CTFにもブランディングというか、そのCTFの傾向、テーマのようなものがあると思うわけですが、このフレーバーが我々の開催するCTFにマッチしているとは言い難いし、私はこういう謎テーマCTFに参加して良い体験をしたことはほぼないので

*4:多少はあって、めちゃくちゃいい問題はzer0pts CTFに回すとか、多少の粗は見なかったことにするとかした

*5:大量のインプットと咀嚼が必要になるので

*6:RDSとかElastiCacheとかめちゃくちゃ高くないですか? DBはクリティカルな部分なのでできるだけマネージドなやつを使うようにしていますが、適当に建ててもなんとでもなるのではと思い始めています

*7:本当はサービスメトリックに投げるべきという気がします

*8:which tasks do you hate?でcryptoカテゴリの山が他より高かったの笑った