見出し画像

CTF大会に初めて参加した話(KOSENセキュリティコンテスト2023)

はじめまして。へいしゅーです。
11月18日に木更津高専で開催されたKOSENセキュリティコンテスト2023にオンラインで参加しました。
今回、初参加にあたっての経緯や勉強方法、所感などをまとめておこうと思います。

自己紹介

NITS・電子制御工学科の5年生です。
情報系に関しては、専門科目の授業や基本情報技術者などで扱うような分野の基礎的な知識は有しています。
セキュリティ分野に関しては、高専で年2回開催されているサイバーセキュリティ演習に参加したことはありますが、セキュリティ大好き!という訳でもなく、自慢できる程の知識もありません。

今回、テクノロジーの盾として、友人の山羊鹿(@yagi_shika)と共に参加しました。
もちろん、2人ともCTFは完全に初心者です。

競技内容について

KOSENセキュリティコンテストは、CTF(Capture The Flag)のJeopardy形式で行われます。

ルールについて簡単に説明します。
問題を解くことで得られる文字列=フラグ(FLAG{…})を提出すると、定められた難易度に応じたポイント(100pt,200pt,300pt)を獲得できます。
制限時間内に、一番多くのポイントを集めたチームが優勝となります。

要は宝探しならぬ旗探しです。問題に対する知識はもちろん、センス、検索能力、役割分担や問題の選択といった戦略も重要であると言えるでしょう。
今回は、以下の7つの分野から32個の問題が出題されました。

  • エンコード/暗号(Cryptography)

  • フォレンジック(Forensics)

  • プログラム

  • ウェブ(Web)

  • ネットワーク

  • バイナリ(Reverse Engineering)/Pwn

  • トリビア/その他

各分野の詳細は省略しますが、暗号、フォレンジック、ウェブ、バイナリ、pwnはCTFの中では頻出だと思います。

エントリーから本番まで

どう過ごしてきたかを書きます。読み飛ばしてもらって構いません。

エントリー(本番1ヶ月前)

申し込み締切前日の夜、数日前から出場を示唆していた友人に誘われる。
なお、チームメンバーは最大4人だったが、他のクラスメイトに希望者が現れなかったため2人でエントリー。

チーム名はお互い案が出なかったため、ChatGPTに依頼し、乱数で決定。
結果、「テクノロジーの盾」の爆誕である。

ChatGPTによる提案例

エントリー後

エントリー後、担当教員から勉強用のCTFの本が貸し出されたが、分厚すぎて読む気にならなかった。図書館で別の本も借りたが、導入を読んだ後は何をすればいいか分からず、本を開くことはほとんどは無かった。

この頃は卒研の中間発表や、文化祭などの行事が詰まっており、セキュコンの事はほとんど考えずに過ごしていた。

本番1週間前

事前準備(VPNの接続テスト)があり、ようやくセキュコンの事を思い出す。

相方と話し合い、writeupを見ながらでも良いから、なるべく多くの問題を解く、ということにした。
本番までの1週間、相方と毎日Discordや対面で進捗をお互い報告し合った。相方はリバースエンジニアリングやPwnの問題を解き、自分は主にWebやフォレンジックの問題を解いた。

同時に本番で使うPCの環境構築を進めた。CTFでよく使われるLinuxや、フォレンジック、リバースエンジニアリング、ネットワークなどに用いられる各種ツールをインストールした。Linuxの扱いは、授業である程度慣れてはいるものの、コマンドでのインストールは上手く行かず苦戦することもあった。

本番

朝8時40分頃、集合場所(学校)に到着。出欠確認や接続テスト、開会式が行われている中で、自分たちはコンテストに向けて準備を整えていく。

そして9時20分、事前のアナウンス通り競技開始。どんな問題があるかな~とか思いながら問題ページを見ていると、間もなく順位が変動し始めた。つまり、既に問題を解き、FLAGを手に入れているチームがいる、ということだ。ちょっと早すぎない!?

ちなみにコンテスト中は、チームごとに正解した問題、ポイント、現在順位、この問題に正解したチーム数、といった情報は公開されており、リアルタイムで確認できる。また、どのチームも解いていない問題に初めて正解するとボーナスポイントが貰えるというシステムもある。簡単な問題に正解して確実にポイントを取りに行くか、あえて難しい問題から挑戦して、ボーナスポイントを狙いに行くか、というのもCTFの醍醐味の一つだと思う。

スコアボード

他チームの勢いに戸惑いながらも、当初の分担通り、主に相方がバイナリやプログラム、自分がネットワークやウェブ、フォレンジックについて解くことになった。
お互い情報やパソコンを共有しながら、解けそうな問題から取り組んでいった。午前中は順調にポイントを稼ぎ、700ptで順位は20位前後。

しかし午後は、完全に手詰まり状態になり、午前ほどの勢いも無くなった。一つの問題に対して様々なアプローチを試したものの、結局フラグを得ることが出来ず、「テクノロジーの盾」は1000pt/29位タイでフィニッシュ。
上記グラフからも分かる通り、1位と2位にはかなりの差があり、1300pt周辺で同率のチームが多い、という結果となった。

所感

初心者目線かつ主観だらけであることに注意してください。

事前に必要だと感じた知識

以下は、自分がCTFの問題(主にWebやネットワーク)を解くにあたって、特に必要であると感じた予備知識の一例です。

  • Linux、特にコマンド

  • Webで使われるプログラミング言語(JavaScript、PHPなど)

  • Python

  • Dockerの使い方

  • アルゴリズム

  • 一般的に使われている文字コードや暗号

・CTFにおいてはLinux(特にKali Linux)を用いることが多く、仮想マシンなどを用いて環境構築を行っておくことが重要です。
Linuxは端末上(CUI)で様々な操作することが多いので、汎用的なコマンドは利用できるようにしておきましょう。

・CTFの問題を解くには専用のツールやソフトウェア(GhidraStirlingWiresharkなど)が必要になることがあります。今回の大会では、Web分野でDockerを用いてプログラムを動作させるような問題もありました。併せて環境構築を行なっておくと良いでしょう。

・文字コードの変換や、暗号の解読に便利なCyberChefといったツールもあるので、上手く活用しましょう。

環境構築例

・CTFの問題解決にはPythonというプログラミング言語が使われることが多いように感じました。理由の一つとしては、柔軟に記述しやすく、Webや暗号で用いるライブラリを多数取り揃えていることであると個人的に考えています。
変数や条件文、繰り返し文、関数といった基本的な構文について、ある程度理解しておくと良いでしょう。

プログラムに関連しますが、基本的なアルゴリズムについて知っておくと、CTFの問題を解く上で有利になることもあると個人的に感じました。

本番中に意識すべきこと

・適度な休憩
自分は今回の大会で、問題を解くことに夢中になりすぎて昼食を疎かにしてしまい、結果的に午後はあまり成果が出ませんでした。
一度リフレッシュすることで、視野が広がり、改善すべき点や新たなアイデアが見つかるかもしれません。

・他チームのスコアをあまり気にしすぎない
競技時間は6時間を超えるため、道中の順位を気にして焦るよりは、問題だけに集中することが大事だと思います。

・分からないことは、大人しくGoogle先生やChatGPTに頼る
問題文から得られる手掛かりを少しでも逃さないことが大事だと思います。ChatGPTは、コードを解読したり、書いたりすることも得意なので、うまく対話しながら問題を解いていくことも重要だと思います。

コンテスト全体を通しての感想

順位は43チーム中29位という結果でしたが、初参加かつ2人チームにしては善戦したと思うので、とても満足しています。ただ、注意不足や情報不足によって、惜しくも正解できなかった問題もあり、非常に悔しい思いをしました。

また、CTFはチーム戦である、ということを強く実感しました。なるべく多くの人数で出場して、一人当たりの負担を減らしたり、問題に対してアイデアを出し合うことがとても重要だと思いました。

CTFに参加するための勉強方法

CTFは、インターネット上でさまざまな問題が公開されています。まずは以下に示すようなサイトにある問題を解いてみて、CTFの雰囲気を感じてみるのが良いと思います。

ksnctf

Twitter/Xアカウントでログインすると、解いた問題が確認できたり、ランキングにも参加できます。

picoCTF(picoGym)

picoGymでは、オンラインで開催されているpicoCTFの過去問が公開されています。会員登録が必要ですが、web上でLinuxコマンドを実行できるwebshellや、ヒントも用意されており、CTF初心者にはおすすめできると思います。

問題は英語で書かれていますが、「○○(問題名) writeup (picoCTF)」と検索することで、ほとんどの問題の日本語の解法も確認することができます。

自分は本番までに、General SkillsやWeb Exploitを中心に1760pt分の問題を解きました。

AtCoder

CTFとは少し趣旨が異なりますが、プログラムを書く練習やアルゴリズムについて学ぶには競技プログラミングコンテストに参加してみることも一つの方法です。
AtCoderでは毎週コンテストが開催されているほか、C++入門のAPG4bという教材が用意されており、プログラミングが初めて、触れてみたい、という人にもおすすめです。

ちなみに、今回の大会ではプログラムという分野にAtCoder Begginer Contestで出題されそうな問題がありました。

関連書籍

これらの本では、前述したようなバイナリ、pwn、web、暗号といった分野でのCTF攻略に必要な技術について解説してあります。が、正直言って初心者向きでは無いと思います。問題を解いていく上で分からないことがあれば、インターネットやこれらの本を使って補完するのが良いでしょう。

まとめ

CTFはセキュリティの知識について問われる競技ですが、初心者である自分でも何だかんだ楽しめました。
友達に誘われる事が無ければセキュコンに参加する事もなかったし、良い機会を得たと思っています。感謝。
私は、来年以降も高専生(専攻科生)なので、一緒に出てくれる人が居たらまた参加するかもしれません。

今回、少しでもセキュコンに興味がある人に情報共有できたらと思い、参戦記という形で人生初のnoteを書きました。初心者目線ではありますが、少しでも役に立っていれば嬉しいです。
セキュコンを知らない人も、こういう大会があるんだな、という風に思ってもらえれば嬉しいです。

長文かつ拙い文章ではありますが、最後まで読んでいただきありがとうございました。

この記事が気に入ったらサポートをしてみませんか?