初学としてのコンテストのすゝめ

こんにちは、 @chocopoie116です この記事はAdvent Calendar 2015 - VOYAGE GROUPの8日目として書かれています

先週末の12/5,6で、SECCONというセキュリティコンテストのオンライン予選に参加したので、その時の話をまとめます。

SECCONとは?

(※1)

日本全体のセキュリティ技術の底上げと人材の発掘・育成をはかる目的で、業界を先導する各有志が集まり、SECCON 実行委員会というものがあり、その委員会が定期的(過去開催のスケジュールはこちら)に開催しているセキュリティのコンテストです。

なお、コンテストで競う題材は、CTFというジャンルのようです。

CTFとは

CTFとは、世界各地で開催されている著名な旗取り合戦競技(Capture The Flag)のことで、セキュリティ技術を競うコンテストの総称です。 クイズ形式の問題の謎を解いたり、実験ネットワーク内で疑似的な攻防戦を行ったりします。 クイズ形式の場合、出題ジャンルは、暗号、バイナリ、ネットワーク、Web、プログラミングなど多岐に渡り、 セキュリティのみでなくプログラミングに関する知見も問われ、攻撃技術、防御技術、解析技術、暗号の知見、ネットワーク技術など、広範な知識と経験が必要となっています。 CTFはIT技術に関する総合的な問題解決力を磨くうえで最適な競技と言えるでしょう。

(※2)

問題形式を確認するために、いくつか問題を見たところ、題材は様々ですが出題文を解くと何らかの文字列(例: FLAG_XXXXXXXXXXX)というものが見つかるようになっており それを課題サイトのフォームにsubmitして、正解してポイントゲットするという形式のようです。

参加のきっかけ

社内の同僚エンジニアからこんなのあるから参加してみない?と言われたことがきっかけです。 CTFという形式もそのタイミングで初めて知りました。 僕自身社会人になってウェブアプリケーションのエンジニアとしてキャリアをスタートさせました。セキュリティといえば徳丸本という感じで、セキュリティといってもウェブサービスを運営する上で必要なことに偏っており、不安もありましたが、興味があったので参加してみました。

参加にあたっての準備

同僚は社内slackで更に2人興味ありそうなメンバーに声をかけ、4人チームでエントリーしました。 とりあえず予習しとこうみたいな感じで問題いくつか見てみました。(※解いたとは言っていないw)

ksnctf.sweetduet.info
ctf.katsudon.org

事前学習での絶望の様子です。

当日の様子

f:id:chocopie116:20151207230533j:plain

今回の予選はオンラインで実施されるタイプなので事前にチーム登録をしておいて、アナウンスされたIRCを見ながら開始を待っていました。 15:00になってポータルサイトに問題文が表示されました。

問題を開いた途端。あっ、これ進◯ゼミでやってないやつだー・・・という感じでした。 練習で見ていた問題より平均的に難易度高めな印象。

ひとまずチームでgoogle spread sheetで問題を管理し、担当や進捗をメモしていくようにしました。 f:id:chocopie116:20151207230339p:plain

一通り問題をみて自分ができそうなやつということで、動画の中に隠されたQRコードを復元する問題に着手することにしました。(ゴールが見えることは大事)

SECCON WARS 2015 (※3) www.youtube.com

この問題自体は、画面中央にQRコードっぽいエリアがあり、それを復元したQRコードを読み込むことでFLAGが手に入るというものでした。

一般ピープルな僕はひとまず思いついた力技で解決することにしました。

f:id:chocopie116:20151207230333j:plain

  1. 動画をffmpegコマンドを使って、画像に変換する
  2. 画像中のQRコードがあるエリアを1pixel四方のエリアにして、座標を配列で管理
  3. プログラムで各セルに黒以外の色が含まれるものを配列からフィルタリングしていく(力技)

結果現れたQRコードはこちら。

f:id:chocopie116:20151207230554p:plain

他の方の回答(※4)をみると、色んなアプローチが会って面白かったです。 コードを書かずにスマートに解決している方法などあり、なるほどーという感じでした。

また問題を解きながら、時間経過や正解を投稿したことをトリガーに、出題のポータルサイトで新しい問題が公開されていきました。

僕はこの問題(この問題はあまりセキュリティの問題ではないw)以外にもかじってみたのですが、うまく貢献できませんでした。 題材としてはWebアプリの脆弱性以外にも、バイナリ解析やAndroidなど普段さわらないことに関する知識が必要でわからないことだらけでした。

チームとしての結果は、1152チーム中129位。

32問中11問正解。スコアは1400点でした。(誘ってくれた同僚のたじーさん圧倒的さすがやで事案です
10位以内で予選突破なので、目指すべき10位のスコアが4500点なので、あと15問解かなきゃ行けない計算です。 (結構遠いなおい・・・

振り返り

個人としてはかなりわからないことだらけでありましたが、コンテストきっかけでわからない分野の存在を知る・興味を持つきっかけを持てました。

問題終了後にspread sheetを使って、チームで振り返りをしたところ以下のような意見がありました。

  • 解けたときの楽しみは脱出ゲームの喜びに似ていた
  • 後半も新しい問題が増えてくることに備えて時間配分を良い感じにしたい
  • 後半になるにつれバイナリの知識がふえてきて楽しかった.ELF可愛い.gobjdumpとかgreadelfとか使いこなしたい(来年こそバイナリ解析しっかりやりたい)
  • writeup読んでコツコツ勉強します.楽しかったので来年も出る
  • なんだかんだ24時間フル参加できる時間的余裕がないと本選いけるほどの点数はとれなそう。(実力があれば別だけど)
  • Binary, Android, ハードあたりの知識が乏しい。来年までに勉強するか詳しい人をつれて来たい。
  • 各問題に対するアプローチをみんなで見れる場所にメモしておいて、同じ問題を別の人がトライするときに同じ道を通らなくても済むようにすればよかった。 特に試してみたけどダメだった方法とか残しておくのが重要そう。

要約すると時間・知識足りない。楽しい。またやりたい。といった意見でした(雑

まとめ

限られた時間で、出題者が練った問題を解くというのはとても楽しいです。(出題者の方々ありがとうございます)
コンテスト形式だと、俺そこまで出来ないし・・・と敬遠しがちでしたが
コンテストきっかけで勉強し始めたり、普段一緒に仕事しない人とワイワイしながら課題に取り組むのはとても楽しいので
これからも積極的に未知の領域でも機会があればコンテストに参加していこうと思います。

さしあたっては、CTFtime.orgのUpcoming eventsのrssをwatchしながら 過去のCTF系の問題を練習問題に、このをリファレンスとしながら勉強してみようと思います

※1 ロゴに関しては使用許諾はとっていません、サイトも調べてみたのですがロゴ使用については見当たらず、もし不都合あればコメント欄等でご指摘ください
※2 こちらより内容抜粋
※3 権利とか大丈夫なのかな?と思いましたが、YouTube提供のフリーの楽曲を使われてるとのことでした
※4 コンテストに関する問題はポータルサイトで見るのは難しいかと思うので、 SECCON 2015 writeup などと検索すると問題と他の人の回答が見れると思います