見出し画像

CTF(セキュリティ競技コンテスト)のチームを作って、SECCON CTF 13予選に参加しました

こんにちは、ALGO ARTIS ソフトウェアエンジニアの舟久保です。 タイトルの通りですが、最近は社内と社外の方でCTFのチームを作りコンテストに出場しています。先日はSECCON CTF 13予選にも参加したので、CTFのチームを作るまでの経緯とSECCON CTF 13予選に参加した感想を書こうと思います。

そもそもCTFとは?SECCON CTFとは?

CTFとはセキュリティ競技のコンテストのことです。Capture The Flagの頭文字をとってCTFと呼ばれています。土日の24時間~48時間で行われることが多く、チーム戦または個人戦でセキュリティ全般に対しての知識を競い合います。CTFにも形式はいろいろありますが、自分は主にJeopardy形式と呼ばれるものをやっています。この形式では問題毎にFlagと呼ばれる文字列が隠されているので、それを見つけ出して提出すると点数がもらえるというルールです。
CTFの中でも国内最大級の一つとして挙げられるものがSECCON CTFで、今回はこのCTFの予選に参加しました。

自分がCTFを始めたきっかけ

自分がCTFに興味を持ったきっかけは知人からの誘いでした。正直自分はセキュリティに対してそこまで興味はなかったのですが、CTFのFlagの取得方法を考えて、色々試すというプロセスが一種の謎解きっぽくて面白いと感じました。
また、セキュリティの本に書いてあるような内容を実践的に試せる場でもあり、実際に手を動かすことで大きく理解が深まりました。問題自体も遊び心があるため、暇つぶしにちょいちょいやるようになりました。

CTFチームを作るまでの経緯

もともと自分は少人数でCTFをやっていましたが、もっと大人数でワイワイやりたい!という気持ちがありました。ALGO ARTISのメンバーは技術コンテスト的なものが好きな人が多いので、誘えば誰かチームになってくれるだろうと思い、メンバを集めました。
そんなこんなで弊社ソフトウェアエンジニアの河田さん、澤浦さんをチームに引き入れました。またメンバの知り合いの社外の方も合わせた数人でチームを組み、「なかよしCTF部」というチームを立ち上げました。チーム名は仮決めなのでいまだに表記揺れがあります。(チーム名にASCII文字しか使えない時はNakayoshi CTF Clubになったりします)
チームを立ち上げてから出場した主なコンテストと順位は次の通りです。

  • 2024/06/07 AKASEC CTF 2024 (46位)

  • 2024/06/15 SECCON Beginners CTF 2024 (29位)

  • 2024/06/22 WaniCTF 2024 (4位)

  • 2024/08/25 Automotive CTF Japan 2024 (23位)

  • 2024/09/21 IERAE CTF 2024 (16位)

  • 2024/11/23 SECCON CTF 13予選 (98位)

チーム結成時はほとんどがCTF未経験者のチームでしたが、コンテストによっては1桁台を取ることもできました。チームメンバのやる気と成長が凄くて、自分も頑張るぞ〜という気持ちにさせられます。

SECCON CTF 13予選

SECCON CTF 13 予選ですが、結果は653チーム中98位でした。解いた問題はReversingから「packed」「jump」、Cryptoから「reiwa_rot13」の3問でした。
上級者向けで難しいとは聞いていましたが、かなり苦しい戦いでした。国内の上位8チームに本戦への出場権が与えられますが、国内順位は303チーム中38位だったので本戦の出場権へは遠く及ばずでした。
とはいえ一問も解けないんじゃないかと思っていたので、個人的には三問も解けてすごい!という感想です。
せっかくなので自分が解いた「reiwa_rot13」の解説を簡単に書こうと思います。

reiwa_rot13は暗号に関する問題で、暗号化を実行するPythonのコードと、暗号化されたFlagと暗号化に使われたパラメータが一部与えられるので復号するといった内容でした。
解くべき部分を簡略化してまとめると次の通りでした

  • m1をランダムな小文字alphabet10文字とする

  • m1をROT13した結果をm2とする

  • m1とm2を同一のeとnを用いたRSAで暗号化した結果をc1,c2とする

  • c1, c2, e, nが与えられるのでm1を復号してください

まず、RSAで暗号化した結果が2つ与えられているので、Franklin-Reiter Related Message Attack(以下Franklin-Reiter)が使えそうだと思いました。これは2つの平文がm, Am+Bで表される時に、AとBの値がわかればこれらのRSAの暗号化結果からmを復元できるという手法です。
ということで今回はm1とm2をm, Am+Bの関係性で表せることができればm1が求まります。ROT13の操作を考えてみると、各alphabetに対して文字コード上で+13するか-13するかなので平文が10桁の時にBの取りうる値は2^10=1,024通りしかありません(Aは1で固定されます)。あとは1,024通り全探索してm1が取得できました。
単純にFranklin-Reiterをするだけで解けるわけではなく、ROT13の操作をFranklin-Reiterが適用できる形に持っていく部分で一捻りあって面白い問題でした。

自分は他の問題は解けませんでしたが、チームメイトが不貞寝を挟みつつもReversingジャンルを2問解いてくれました!「packed」「jump」のWriteupを書いていただいたので興味がある方はこちらもご覧ください。
SECCON13 Qual

最後に

以上、CTFのチームを作ってSECCON CTF 13予選に出場した話でした。
来年はもっと順位を上げられるように精進します!


良かったら、SNSやHPをチェックしてみてください。最新情報をご覧いただけます。また、フォローやスキ♡もお待ちしています!(スキはNoteのアカウントがなくても可能です!)

ALGO ARTIS について:https://www.algo-artis.com/
最適化ソリューション『Optium』:https://www.algo-artis.com/service
化学業界DXソリューション『Planium』:https://planium.jp/
X : https://x.com/algo_artis
Linkedin : https://www.linkedin.com/company/algo-artis/