CTFの問題の作り方

この記事はSLP KBIT Advent Calendar 2015の25日目です。
昨日はなおすけくんが書きました


本当はFluxのアーキテクチャと実装について書こうと思ったんですが、
さんっざん分かりやすい資料も出まくってて、今更話すこともないかなと思ったので、
CTFの問題の作り方を紹介することにしました。
あまり難しい問題の作成には当てはまらないかも。


問題の作り手が全員同じように作っているとは限らないですが、
極端なエスパー問題を防いだり、参加する側にとっては、
よりストーリーや背景を楽しめるようになれば幸いです。

CTFとは

kikuchanさんのスライドが非常に分かりやすいと思うので、
そのスライドの紹介をもって詳しい説明は割愛します。

問題作成ことはじめ

テーマを決める

最初にテーマを考えます。
後で少し触れますが、あまり突飛なテーマを考えず、
自分が得意としている技術に関連するテーマを考えるとよいです。

  • ファイルからなにか探す問題にしようかな
  • 実行ファイルを分析してもらおうかな
  • Steganoにしようかな
  • この前事件になってた脆弱性を利用しようかな
  • キーボードの配列を利用しようかな
  • あんまり知名度がないスクリプト言語にしようかな
  • QRの問題を考えるか
  • ブルートフォースでパスワードを解くような問題を考えようかな
  • 記号プログラミングしてもらうか
  • XSS頑張ってほしいな〜〜
  • 暗号系を出そうかな

テーマがない問題は、基本的にCTFには存在しないはずです。
テーマがないということは、参加者に何を求めているのか不明瞭なので、
参加者がもし解けても解けなくても、終わった後に解説を聞いても、
あんまりよい経験になったなって感じづらいかも。


テーマに関連する技術を考える

最初のテーマ決めの段階で既に関連する技術を考えてるかもですが、
「この技術を使って解く」みたいなのを具体的に決めます。


関連する技術を複数組合せると、難易度がかなり上がります。
例えば、ZIPを既知平文攻撃で解凍して、
出てきたファイルに書かれた記号プログラミングの解読問題を解いて、
その結果出てきたURLにアクセスすると表示されるWebサイトでSQLインジェクション脆弱性を使ってDB上にあるパスワードを取って、ハッシュ攻撃してフラッグを得る、とか。
この場合、全ての技術解決点をクリアしないと解けないので、どれか1つとか2つの技術を持ってても、
例えばSQLインジェクションだけ分からない!という人は解けなくなっちゃうんですね。厳しい。


初心者向けの技術にするなら、「QRコードを読取る」、「かな打ちで入力する」、など。
上級者向けなら、アセンブラを読む技術を求めてみるとか。
そして、これはつまり、出題者がもっていない技術は、出題できないんですね!!
ECC(楕円曲線暗号)を理解していないと、ECCの問題は出せないんですね!!!(血涙)
なので、自分の得意ジャンルから出題を考えるとよいでしょう。

問題に必要なシステムやファイルやデータを作る

さて、ここからは問題で扱うシステムやファイルやデータを作っていきます。
このステップで、問題の背景的なストーリーが浮かび上がってきます。
背景ができたら、それに沿った問題文を用意していきます。
(上級者向けのCTFでは、背景全くナシで「ほらよ!このファイルからフラッグ見つけてみな!」みたいな感じになることも多い。)

  • Webサイトの脆弱性を利用した問題にしよう → 「友人がWebサイトを公開したけど脆弱性があって危ないから指摘したい」 → 「友人のBobがWebサイトを作ったらしいが、最近は物騒なインターネットなのでセキュリティチェックをしてくれないかと依頼された。」
  • 暗号化ファイルを復号化する問題にしよう → 「大事なファイルを暗号化したけど本当に安全なのかしら」 → 「クリスマスに、Aliceから彼氏のBobに向けて、暗号化されたクリスマスプレゼントが送られた。Aliceに片思いのMalloryは、クリスマスプレゼントをこっそり入手した。クリスマスプレゼントの中身は、何だろうか?」
  • こんな記号プログラミングがあるんだよってみんなに知らせたい → 「Rubyで記号プログラミングしてみたので、解読してみてほしいな」 → 「この謎の文字列はRubyのコードらしい!君に読めるか?!」
  • 壊れたハードディスクからデータを取り出したい → 「LVMでフォーマットしてあるHDDにデータ異常が生じたが、特定のデータを取り出したい」 → 「クリスマスの夜に友人のNaoが、ハードディスクが読み込めなくなったと泣きついてきた。大事なデータが入っているらしい。なくなくハードディスクを受け取ったPepperは、ひとまず電源を繋いで、モーターが回る音を聞いて安心した。続いて、ダンプを取ったが、この後デートがあるので、ダンプからデータを取り出しておいてくれと、あなたに頼んで出て行ってしまった。しょうがないのでデータを取り出してあげよう。」

そして、フラッグも用意します。
フラッグの用意の仕方によっては、クソみたいなエスパー問題になります。

  • 例: この画像に写っているお店の電話番号をフラッグにしよう(問題文には電話番号に関することは未記載)
解けるか検証

ちゃんと解けるか検証します。「解けるはずだ」で出しちゃうと、
実はミスがあって解けない問題だった!ということもありうるので。
初心者向けのCTFでは、有料ソフトや有料サービスを使わなくても解けるかどうかを検証したりもしてます。


これで終わり!!

問題を解く側として

いろいろな問題を解いてきましたが、何を求めているのか分かりやすい問題は、すぐに目星を付けて取り組んでいきます。
何をしたらいいのか分かりにくい問題は、いろいろ試行錯誤しないといけないので大変ですね。・゚・(ノ∀`)・゚・。