こんにちは。開発本部内でセキュリティ活動を行っているPSIRTです。PSIRTで初の社内CTF(Capture The Flag)を開催したので、本記事ではその開催準備の様子や開催中の様子を紹介します。
開催背景
2025年2月4日から6日にかけて、開発・運用系のメンバーが一同に集まる「開運冬まつり」が開催されました。このイベントは、部門やチーム、職能を超えて社員同士が交流し、新たな視点や刺激を得ることを目的としています。 昨年の開運冬まつりの様子は以下のブログを御覧ください。
このイベントのコンテンツとして、PSIRT有志のメンバーで初の社内CTFを開催することにしました。
CTF開催のねらいは二つありました。
- セキュリティを難しく遠い存在と感じているメンバーに、セキュリティを楽しみながら身近に感じてもらいたい
- CTFを通じて普段の開発や運用の中でもセキュリティを意識するきっかけを提供したい
これらは単にCTFに参加したメンバーのセキュリティスキルが向上するだけでなく、そのメンバーが参加しているチームにも伝播し、より安定したセキュリティ品質にもつながると考えました。
準備期間
開催の3ヶ月前から、週に1度の打ち合わせを行い、CTFのコンセプト、難易度、カテゴリ、問題数、インフラ面など、開催に必要な事項を決定していきました。
CTFのコンセプトとして、「CTFをやったことがない人に『脆弱性を身近に感じた!』と言ってもらう」を設定しました。これは、CTFをやったことがないけれど興味がある人に、CTFや脆弱性の面白さを体験してもらい、セキュリティへの興味・関心を高めてもらうことを目的としています。
問題のカテゴリは「Web」「Crypto」「Misc」の3つを用意することにしました。これらのカテゴリは、問題を解くにあたって特別なツールをあまり必要とせず、比較的日々の業務知識を活用すると取り組みやすいからです。
インフラ面については、サーバが必要な問題で使用する問題用のサーバ、問題情報や競技に参加するユーザー情報を管理するスコアサーバ用のサーバで2台をVMインスタンスとして用意しました。スコアサーバとしてはOSSであるCTFdを使用し、ctfcli を用いて問題を自動インポートできるように問題情報をYAMLで管理していました。
また、CTFをやったことがない人に向けてCTFや問題への取り組み方を説明する「チュートリアル会」を実施しました。この会では、CTFや「Web」「Crypto」といったカテゴリについての説明に加えて、実際に社内CTFで出題された「Web」「Crypto」の初心者向けの問題の解き方を解説しました。加えて、解説のドキュメントを用意することで、チュートリアル会の後もドキュメントを見ながら問題に取り組めるように工夫しました。チュートリアル会に参加したことでCTFにも熱心に取り組んでくださった方も多数いたので、そのようなCTFのハードルを下げる会を開催する効果はとてもあったように感じています。
開催中
社内CTFの開催中は、参加者の皆さんが熱心に取り組む姿が社内の至る所で見られました。今回のCTFでは、「Web」「Crypto」「Misc」とWelcome問題を合わせた全23問が出題され、合計32名の参加者が挑戦しました。


「Web」ジャンルではSQLインジェクション、XSS、パストラバーサルといったWebアプリで生じる一般的な脆弱性を取り扱う問題に加えて、プロトタイプ汚染など比較的ニッチな脆弱性を扱う問題も出題しました。また、「Misc」ジャンルではGeoGuesserのように写真から場所を特定するOSINT問題や、制限されたサンドボックス環境下でPythonコードを実行してフラグを取得するPyjail問題、乱数を予測する問題などを出題しました。そして、「Crypto」ジャンルではRSAやAESなど公開鍵暗号、共通鍵暗号に関する問題、ハッシュ関数に関する問題を出題しました。
競技期間中、社内システムには参加者の皆さんの熱意が伝わるコメントが多数寄せられました。
- CTFが楽しすぎる!ウオオ
- 今日も今日とて昼休みCTF
- 仕事サボって CTF やりたい衝動を必死に抑えてる
- 昨日の夜はCTFやってみて、webとmiscはほぼ終わった。今日の夜はcryptoやってみる。
- 昨日夜無事に社内CTF全完しました!!!多分2位!!!!!
また、上記のチュートリアル会をきっかけに、開発・運用系以外の部署からも参加してくださる方もいました。これにより、社内のさまざまな役割の方々がセキュリティに触れるきっかけが生まれました。特にCTFに初めて取り組んだ方からは「セキュアコーディングで学んだ知識で1問自力で解けて、嬉しすぎて感動しました…!楽しい…!」といった声があり、業務などを通じて得られた知識で問題が解けた喜びが感じられました。
競技期間を通して、ジャンルとしては業務との距離感が近い「Web」やOSINTなどの比較的取り組みやすい問題が含まれていた「Misc」が多くの参加者に取り組まれていました。一方で、数学の要素が強く難解なイメージのある「Crypto」は上位の成績を収めた参加者を除いてあまり取り組まれていない印象がありました。
最終的には、競技期間を通じて全ての問題を解いた参加者が2名、Web、Miscの問題を全て解いた参加者が7名という結果でした。社内にはCTFの強者がゴロゴロいることが分かる良い機会になりました。また、チュートリアル会で扱ったWeb問題については8割以上の方が解いてくださっていたため、設定していたコンセプトである「CTFをやったことがない人に『脆弱性を身近に感じた!』と言ってもらう」は達成できたのではないかと思います。

開運冬まつり当日に開いた解説会について
1週間のCTFオープン期間の後、開運冬まつりのコンテンツの一部としていただいていた時間で解説会を開きました。主にこれまで話したどういったコンセプトでCTFを開催したか?などを話しつつ、ほとんどの時間は出題した問題の解説に時間を当てました。いただいた時間は1時間だったので、全ての問題を詳細に説明することはできませんでしたが、オフラインでもオンラインでもチャットで盛り上がっていました。無事に大きな事故※もなく終えられてよかったです。
※問題管理リポジトリが社内から確認できるようになっていることに競技中発覚し、バタバタするといったことが実はありましたが…!!

初社内CTF開催を終えて
時間もあまりない中ゼロからのスタートだったものの、途中で頓挫せず無事終えられたことが一番です。運営の3人以外にも背中を押してくださったPSIRTの皆さんや新しい試みにも関わらず了承してくださった開運冬まつり運営の皆さんには感謝しきれないです。
次回開催も見据えていくつかよかった点や反省点もあるので、一部ご紹介したいと思います。
コンセプトに対して
今回はCTFをしたことがない初心者に向けてセキュリティを身近に感じていただくことを目標に開催しました。開催中の部分でも触れてますが、社内開催であることを活かして、チュートリアル会の開催などをしてCTFをやったことない人に対しても一定のフォローができたのかと思います。また、弊社では情報がオープンかつ皆さん自分の分報で呟いてくださるので、口コミでさまざまな部署の方に参加していただけて非常によかったです。
作問について
3人でゼロからスタートした都合上、通常の業務に加え作問を行う必要があり、CTFの作問経験はあるものの、時間に追われる部分もありました。ここのリソース的な問題は初期段階から想定できていたので、運営陣の認識として過去の問題で流用できるものは流用しようと認識を合わせていました。しかし、結果的にあまり過去の問題の流用はせず新たに出題しました。次の項目でも触れていますが、1週間CTFをオープンするとなるとそれなりの量を作問しなければならないので、この辺りのコストは削減できると良さそうです。
開催形式について
今回は1週間+解説会という形を取りましたが、作問コストの問題もあり、次回はまた違った開催形式をとっても良いかもという話が上がりました(定期的に実施するのが一番だと思うので…!!)。開運まつりは弊社でも多くのエンジニアが集まる大規模なイベントなので、もっとライブ感の強いイベントにもできそうです。ただ、やはり作問できる人がそもそも少ないこともあり、いろいろ課題はありますが、第2回開催を目指して作戦を練っていきたいです。
採用情報
PSIRTではサイボウズのプロダクトを支えるたくさんの活動をしています。是非、エントリーをお待ちしております!