ふるつき

v(*'='*)v かに

CakeCTF 2023 開催記

今年も初心者〜中級者向けのカジュアルCTF、 CakeCTF 2023を開催しました。運営メンツは変わらず、私、ptr-yudai、yoshikingの3人です。

今年は2023/9/2 - の予定でしたが、他の(出たい)CTFと時期がかぶっていたので(あと問題全然準備できてなかったので)延期して11/11 - 11/12になりました。しかしAVTOKYOと被ってしまったらしく、客を取り合う状態になってしまいました(実際にはAVTOKYOよりCakeCTFを優先するということはないと思うので奪われていただけだと思う)

毎年開催記に何を書くかについては悩んでいるのですが、今年も悩みつつやったことや思ったことを書いていきます。作った問題については参加者のwriteupがある程度出揃ってから書こうと思います。

CakeCTF 2023
1点以上獲得したチーム数 729
Welcome / Survey以外の問題も通したチーム数 357

問題の準備

CTFの開催で本当に一番クリティカルなのが問題セットの準備だと思います。他のCTFでも大変だという様子が開催記やtwitterでの様子から漏れ聞こえてくることがありますが*1、我々も例に漏れず大変な思いをしていました。

というのも、特に私がWebやReversingといった非専門ジャンルの難易度のインフレについていけず、これらのジャンルの問題の作問を担当できなくなってしまっているので、全てをptr-yudaiに任せてしまっています。したがって、ptr-yudaiが忙しくなると問題セットが完成しないということになってしまいます。

そして今年はタイミング悪くCakeCTF前後のptr-yudaiが忙しくなってしまい、webやreversingの問題は開催前日にぎりぎり完成する OR 当日も特に間に合っていないので理想の状態よりはちょっと問題が少なくなってしまうという状態になってしまいました。

これについては3人で運営を回している(そのうち2人はほとんどcrypto専門)という現状に無理があると思っています。来年以降もptr-yudaiに負担をかけ続けるのは本意ではないので、来年以降はwebやreversingの作問をしてくれる運営メンバーを増やせないかな〜と思っています*2。しかしこれで思い当たるようなメンバーにはCakeCTFを楽しんでもらいたいという思いもあり複雑……。

賞品の準備

CakeCTFでは上位の日本チームや良いwriteup*3に対して賞品を贈呈しています。これはもらったら嬉しいので上位陣のモチベーションになるということや、来年の開催もまた楽しみにしてもらいたいという思いがあってやっていることです*4

これの準備もptr-yudaiにやってもらっているのですが、先述の通り今年は忙しくしていて賞品についてはまだ準備ができていません。お待ちください!! 私も手伝えればよいのですが、このあたりのセンスが壊滅しておりまして……

スポンサー募集

CakeCTFではインフラ費用や賞品の作成・発送などの費用を賄うためにCTFの開催を支援してくれる個人スポンサーの方を募集しているのですが*5、今年も多くの方にご支援いただくことができました。

今年はTwitterの投稿にGoogle FormのURLを貼るという形式にしていて、昨年までの私のTwitterアカウントにDMを送ってスポンサーになるよりは楽に支援いただけるようになったんじゃないかなと思います。私としてもやりとりがちょっと減って楽になりました。

スポンサーしていただいた方には今後お礼の品などを送らせていただく予定ですが、このあたりの準備もptr-yudaiパワーを使うのでしばらくお待ちください。

インフラの準備

ここは毎年私が担当しているのですが、慣れが出てきたのか開催を経るごとにどんどん雑になったり準備が遅くなったりしていて大変です。

だいたいterraformを使ってGCP上にVMインスタンスを立てて、

  • スコアサーバにはsshログインしてkosenctfxという自作のスコアサーバをdocker compose up -d で立ち上げる
  • 問題サーバはansibleでパケットキャプチャとかを設定しつつ問題のファイルを転送してdocker compose up -dで問題を立ち上げる

ということをしているだけです。そして毎回GCPのquota制限のことを忘れていて緩和の申請をすることになる。ギリギリでサーバを立ち上げるとこの緩和申請がCTF開催に間に合わないのではないかとひやひやすることになります。素早く対応してもらえて助かりました

kosenctfxの更新

普通CTFを開くときはCTFdかrCTFというアプリケーションを使うことが多いと思いますが、CakeCTFでは私の自作のスコアサーバのkosenctfxというやつを使っています。

今年はzer0pts CTF 2023のときにNext.js 13に上げたのを忘れていてCakeCTF用のテーマのLink要素とかを直さないといけないのが大変でした。機能追加とかは特にしてないです

Google CTF Sponsorship

毎年ありがとうございます。https://goo.gle/ctfsponsorship のフォームにちょっとCTF情報を入力するだけでGCPで使える$500のクーポンが降ってくるので、サーバ代をケチらずに済んで助かっています。

開催中

今年の運営のミスを列挙。ミスしてない間は大体スプラトゥーン3をやっていました。以前はptr-yudaiやyoshikingとボイスチャットをつないでBoard Game Arenaで遊んだりしていたけどそういうのもなくなってしまった……。

  • CTF開催後1分くらいTasksが表示されない
    • これはNextJSのISRのrevalidateのインターバルのせいだと思っていて、今回は5secにしたので最悪でも5secで表示される……と思ったのですがなんか1分くらい表示されませんでしたね。なぜなのか……
  • Welcome問題がオープンになってない
    • ミスりました。すみません
  • unicompのポートが空いてない
    • すみません。オペミスです。ポートの設定もなんかスポナーとかで自動でいい感じになるようにしたい(夢)
  • vtable4bのフラグの設定が間違っている
    • すみません。こういうのチェックするのもちゃんとやっていきたい。一時期GitHub Actionsでやったりしていたけど、「問題を解いたときに出てくるフラグが設定と一致していることを確認する」ようにするとGitHubActions上で問題を解くスクリプトを回す必要が出てきて大変なんですよね……
  • Memorial Cabbageの問題設定が間違っている
    • すみません。同上です
  • SurveyのGoogle Formで回答後に表示されるフラグが去年のもののままだった
    • すみません

ケアレスミスが多くて、ちゃんとしてないということがわかりますね。舐めた態度をやめていきたい

開催後

みなさまのwriteupを読んだり、Survey結果を眺めたりしています*6。CTF開催は結構重たい作業で年に1回とか2回とかしかできないので、ここでのフィードバックがめちゃめちゃ重要になってきます。気になったことや良かった(継続してほしい)ことはどんどんSurveyに書いてください。あとモチベーションの維持のために感想も書いてほしいです。色々要求してすみません

ちなみにSurveyはたくさん書いてあったり、記名で回答してあると真面目に検討する率が上がります。ことしは昨年のフィードバックを参考に問題を開いたときのダイアログの位置を修正したりしました。

今年のSurveyへのお返事

Surveyが増えたら増えるかも。Surveyで頂いたご意見は適宜意訳してます

  • A team account system like what rCTF does might be better than having to share a password maybe
    • これは確かにと思ったので検討します
  • 去年は1問も解けず、今年は1問だけ解けた。もう少し簡単にしてもよいのでは?
    • これ以上簡単にすると、経験者にとっては退屈なだけな問題になってしまいそうなので難しいなと思っています。簡単ではあるんだけど、経験者でも一瞬頭をひねらないと解けないような問題を作りたいので(=ひと目で解ける、典型をやるだけみたいな問題にはできるだけしたくないので)。一年の期間があるので他のCTFやBeginnersに参加して腕を磨かれると良いと思います
  • AVTokyoと被ってあまり参加できず残念でした
    • すみません。AVTOKYOも一言言ってくれたらいいのにと思っています。次回以降はCTFだけじゃなくて他のイベントとの衝突も気にしていこうと思います
  • Perhaps CakeCTF could have some weight on CTFtime!
    • レーティングをつけるには簡単すぎるCTFだと思っています。casualくらいが運営の気持ちとしてもちょうどよいです

その他クオリティが高い・問題が一見非自明なのに解けて気持ちよかったなども書いていただいてありがとうございます。はげみになります

ケーキの画像 from Timeline

ありがたいことです。私はケーキ食べてません(ケーキ屋に行くのが面倒だったので……)

おわりに

ではまた、zer0pts CTF 2024……はないような気がするので、あればCakeCTF 2024でお会いしましょう

*1:このあたりの話もっといろいろな人が書いてくれると嬉しいと思っている

*2:という話は特に誰とも合意をとったりはしていませんが、もし興味がある方がいらっしゃいましたらご連絡ください

*3:解いた問題やCTF自体の解説・感想などのこと

*4:私はそう思っている。他の運営メンバーがどう思っているかは知りません

*5:そしてここでめちゃめちゃ社会パワーを使うので私はやりたくなくなってきているのですが

*6:こう書くと暇そうに見えるけど、上位チームへの賞品の連絡やスポンサーへのお礼の連絡、スコアサーバの静的化などがこのあと発生します。CTFtimeへの結果の提出はもうやった

TSGCTF 2023参加記

TSGCTF 2023にzer0ptsとして参加していました。これという問題を解けなかったのでwriteupを書くつもりはなかったのですが、運営になんのお礼もしてないなということを(自分でCTFを開催して)思い出したので、こういう感じで取り組んでいましたという参加記を書きます。運営がこれを見て楽しんでくれたり、開催して良かったと思える度が少しでも上がれば嬉しい

[crypto] Complicated Function

素数pに対してqが次のような関数fを用いて q = f(p)と計算されるRSAです。

def f(p):
    return isqrt(p**2 + p * (2**512-6) + ceil(isqrt(p)*sin(p))) + 2**1023

warmup問題にもかかわらずかなり悩んでいたのですが、途中で急にfの単調増加性が気になる天啓を受けて解けました

[crypto] Streamer

onetime padで鍵を使いまわしシリーズです。こういう系統の問題に辟易して、solverを書いたことがあったので使ってみたけどうまく行かず、気合で解きました。 c(になってたりN|\| になってたりp|*になってたりして解くの大変だった〜

賢い人は後ろのhexからkeyを探索していい感じにするんだろうなぁ

[crypto] Unique Flag

yoshikingが気合で解いた。DP〜とか言ってるけど普通にDFS + 目grepで良さそうでした

[web] dance

webと書いてあったけどcryptoだったので解きました。CakeCTF 2022に出したhi yoshiking!と同じだね。これがcryptoではなくwebで出されているのmisleadingっぽくてあまり好きではないです……。というのはSurveyに書いた

[crypto] Delta Force

ずっとこれに時間を溶かしてしまった。解けませんでした……。

Nが与えられているからには何らか素因数分解するんだろう。ぱっと思いつくのはECMかgcdだな〜と思って、gcdがちゃがちゃやったら素因数分解できてしまったのが良くなくて、解けそう〜と思って粘着してしまった……

片方の素数ではcusp, もう片方の素数ではnodeになるようなsingular curveに分解できるということまでは気がついて*1、cuspでは解けたけど、nodeでは y^2 \equiv x^3 + Ax^2 y^2 \equiv x^2(x + w^2)にうまく落とし込めなくて(=Aがquadratic residueじゃなくて)一生困り続けていた。

ここで12時間溶かしたけど、のこり40分くらいでptr-yudaiに相談したら拡大体とかって言われて「!!!!」になってやってみたら変形できた。でも \mathbb{F_p^2*}上でのDLPが解けずに敗北。ここは正確には \mathbb{F_p*}とisomorphicな \mathbb{F_p^2*}の部分群らしいし、位数は p+1でこれがsmoothだったらしい。

楕円曲線の局所的なテクは知ってても、基礎的な代数の知識がなくてそういうことがわからないにゃんです……


面白かったです。手を出せてない問題も面白いと思うのでこれからやっていきたい。Delta Forceに時間奪われた〜。解けない問題に取り組むの楽しすぎる

*1:強い人は問題設定を見たときからこう分けられるんだろうな〜と思って素因数分解し始めていたみたいなのをTLで見てすげーってなった

UbuntuのEOLに気がつく

Ubuntu 22.10を使っていたが、2023-07-20でサポートが切れていた。apt updateのエラーを久々にちゃんと読んでEOLっぽいじゃんということに気がついてアップグレードするのに時間を取られたので、次からは先んじて気がつけるようにしたい。

というわけでシェルを立ち上げたときにEOLが近づいていたら教えてくれるようにしたい。

freedesktop.orgのos-releaseのページによると使っているOSのEOLは/etc/os-releaseSUPPORT_ENDとして書いてある……こともあるらしい。手元ではそういうのはなかった。この質問によると、distro-info-dataというパッケージがインストールされていれば/usr/share/distro-info/ubuntu.csvというファイルが配置されているはずで、ここに歴々のディストリビューションの情報が書いてあり、EOLの情報も含まれているらしい。このファイルはあったのでこれを使うことにする。

CSVなので適当にパースしたら良いだろうと思ったが、ヘッダには8カラムありそうに書いておきながら実際には6カラムしかない行などが存在していて、お行儀の良い入力を期待するCLIツールでは太刀打ちできなさそうだったので、雑なことをすることにした(=eolのデータは6列目にあるということにしてcutで取り出すことにした)。以下のようなスクリプト.zshrcに追加する。

function get_eol() {
  if [[ "$OSTYPE" != "linux-gnu" ]]; then
    return
  fi
  source /etc/os-release
  eol=$(grep -F "$VERSION_ID" /usr/share/distro-info/ubuntu.csv | cut -d, -f 6)
  d=$(( ($(date +%s -d "$eol") - $(date +%s)) / 86400 ))
  if [[ "$d" -lt 30 ]]; then
    echo -e "\e[41m EOL of ${VERSION} is coming (${eol})"
  fi
}
get_eol

OSのEOLが近づいているときにシェルを立ち上げたら、↓のように教えてくれる想定