こんにちは、愛甲です。今回は、先週末に行われた PCTF 2011 も含めた、セキュリティコンテスト全般について書かせていただこうと思います。とはいっても、最近 CTF 参戦記ばかり書いている気がしますので(汗)、今回は少し違った視点でセキュリティコンテストについて考えてみたいと思います。「そもそも CTF って何?」という方は、前回の記事をご参照ください。
-----
■ PCTF 2011
PCTF とは、アメリカの PPP_CMU というチームが主催するセキュリティコンテストです。彼らは今年の CODEGATE 2011 CTF の優勝チームでもあり、この度、ロッキードマーティン社をスポンサーとして、CTF を開催することになりました。
PCTF はオンラインで、日本時間の 4月23日(土)6:30 ~ 4月25日(月)6:30 までの 48 時間で行われました。それで、いきなりなのですが、sutegoma2 は 5 位という結果に終わりました。実は競技終了の 3 時間ほど前に一時暫定 1 位となったのですが、その後は得点が伸びずに...、といった具合で、結局は 5 位で終了となりました。まぁ結果は結果で仕方がないので、より勉強していこう、頑張っていこう、という新たな決意で再スタートしたいと思います。
さて、前回の記事で問題の傾向や雰囲気について書きましたので、今回はまた別の角度から CTF について紹介したいと思います。
■競技時間
実は CTF は主催国によって若干の時間的な有利不利が存在します。例えば、前回の CODEGATE 2011 CTF は韓国のチーム主催ですので、韓国の時間で実施しやすい 48 時間が競技時間として選ばれます。韓国と日本の時差はほとんどないので、日本時間にしても 3月4日(金)21:00 ~ 3月6日(日)21:00 までの 48 時間という、日本に住んでいる人にとって(というよりも韓国に住んでいる人にとって)有利な時間となりました。
しかし、PCTF は開催国がアメリカですので、日本時間にすると 4月23日(土)6:30 ~ 4月25日(月)6:30 までの 48 時間という、月曜日の予定に大きく影響の出る時間帯となります。ほとんどの社会人は月曜日の朝から仕事がありますし、学生であっても月曜日の予定が確実に空くとは限りません。つまり、日本にとっては終盤に進むにつれて確実に不利になっていきます(逆に韓国主催の CODEGATE では、序盤がアメリカ不利となります)。
よって、CODEGATE で予選 1 位になれたのは、時間的な優位性も少なからずあったのかもしれません。また逆に、次回 6 月に行われる DEFCON CTF では、アメリカ開催であるため、時間的に不利な立場になることが予想できます。
■出題される問題
CTF にはセキュリティに関する全般的な問題が出題されます。@IT にて辻伸弘氏が「第1回 プレイ・ザ・ゲーム! CTFが問いかけるハックの意味」と題して、CTF の問題について紹介、解説をされていますので、興味がある方はぜひご参照ください。
さて、前回の記事で、CTF には主に 6 つの分野から問題が出題されると書きました。それらは「暗号」「フォレンジック」「リバースエンジニアリング」「脆弱性」「パケット解析」「トリビア」の 6 つですが、今回は、これらとは別の角度で出題される問題を分類したいと思います。
●タイプ 1 :問題ファイルを解析するタイプ
代表的なものはフォレンジックとパケット解析系の問題です。問題として与えられるファイルの中にパスワードがあるタイプで、例えば「 pkt ファイルを解析して、サーバからダウンロードされている実行ファイルの MD5 ハッシュ値を求めよ」といったものや、「 NTFS を解析して削除されたパスワードファイルを復元せよ」といった問題になります。
サイズの大きな問題ファイルに対してのアプローチ方法、いかに巨大なファイルから欲しいデータを取りだすか、といった技術力が問われます。
●タイプ 2 :問題ファイルを復号するタイプ
代表的なものは暗号問題ですが、バイナリ系の一部もこちらに属します。問題ファイルの中や問題文自体にパスワードが隠されているという点ではタイプ 1 と同じですが、こちらは探すことではなく、それらを「復号すること」がメインとなります。EXE ファイルの実行中にメモリ内を参照するとパスワードが見つかる、といったリバースエンジニアリング系の問題や、謎のデータ列が渡され、それを解読してパスワードを得る暗号系の問題をこのタイプに分類します。
今年の CODEGATE では、予選と決勝の両方で、以下のような問題が出題されました。
解読せよ:SCMPKBOUPDPHYTIAVIVRBTMVORUDNBDFNETDOIVTXRO
UNDKOBFWBPVOEQLTGKKARACYCGDNAECBXIZIKPTLEER
ZTYCYKIVXCPKPTPOVCAQRHRVKJUWMTWCMSXKADYHRVN
AHCBRVSVSSCQCZQYDJXGSNRVSWCESTTBHIFCIASXRTA
HKRRTUMVOKWITZPFZDISXZVVLGETPPLKSELDPGKELSH
CBJBWXBIFCPEZYNBWXCDYMGAOVWNDKAKKKWBBQKPTIO
DKMGGHRVVNHINFCQESDYMLACVVBWBBQROPBBDFOXOSK
DIGZWXFNTKFYIICWHRVVNHIYILTKHRVXPISB
これはコンピュータ技術に関するものではなく、純粋な暗号の問題になります。答えはヴィジュネル暗号なのですが、このような問題を解くためには実用的に使われる現代暗号のみではなく、古典暗号も含む、全般的な暗号に関する知識が必要になります。
●タイプ3 :リモート環境にあるパスワードを取得するタイプ
代表的なものは Exploit と Web 系の問題です。Exploit 系の問題は、脆弱性を探し出し、権限を奪うことで Key ファイルへのアクセス権を獲得し、その Key ファイルの中に書かれてあるパスワードを取得します。Web 系の問題もほぼ同じですが、こちらは SQL インジェクションを始めとした Web に関するテクニックを用いて、例えばデータベースの中にあるパスワード等を得るタイプです。
タイプ 1 やタイプ 2 とは明確に異なり、問題ファイルや問題文の中にはパスワードはなく、実際に外部のサーバや Web サイトを攻撃してパスワードを得る必要があります。リモート環境の権限を得る、データベースにアクセスする、といった分かりやすい目的であるため、ある意味もっともシンプルなタイプと言えます。
問題文においても、サーバのIPアドレスとポートのみが書かれてあったり、問題となる Web ページの URL のみが書かれてある、といったシンプル具合です。
●タイプ4 :パスワードを推測するタイプ
代表的なものはトリビア問題で、クイズのような問題がこのタイプに当てはまります。検索しなければ分からない問題や、業界の歴史やイベントなどを知ってないと解けないものも多いです。
今回の PCTF では、トリビアとして以下の問題が出題されました。
Figure out what the corrupted value is.
1.3337 ~= XXXXXXX/3145727
XXXXXXXに入る文字列が解答となるのですが、いかがでしょうか? ちなみにこの答えは「4195835」で、解説については Pentium FDIV bug を参照してください。個人的にはまさにトリビアらしく、かつ、なかなか興味深く、面白い問題だったと思います。
CTF の問題は以上の 4 タイプに分けられますが、逆に考えれば、上記の 4 タイプのいずれにも当てはめ難いならば、それは CTF には使われ難い問題と言えます。またタイプ 4 はほとんどトリビア問題でしか扱われないため、実質、上記の 1~3 のタイプが考察対象となります。
では、例えば、XSS を考えましょう。サーバ内にあるパスワードを XSS で取得するといった問題は作れませんので、タイプ 3 はありません。またタイプ 1 やタイプ 2 のような、htmlファイル内を探索、あるいは解読してパスワードを得るといったものも XSS の問題とは言えませんので無理でしょう。よって、XSS は CTF では扱いにくい問題と言えます。CSRF も同じ理由で難しいです。
逆に、SQLインジェクション、またセッション管理系の成りすまし(Cookie関連)などはタイプ 3 に分類できますし、JavaScript の暗号化や難読化といった分野はタイプ 2 に分けられます。あと、バッファオーバーランを利用した Exploit や Pack された実行ファイルのリバースエンジニアリングなどは、比較的出題しやすい問題だと思います。
出題し難い問題は、他に ARP スプーフィングのような TCP/IP 以下のレイヤーを扱うもの、また、ターゲットサーバのカーネルを対象とした問題なども出題が難しいです。そもそもカーネルを扱う問題自体、CTF ではほとんど出ません。
このように考えていくと、CTF がどのような技術を競うもので、どういった分野を学んでおくことが重要であるかが分かってきます。このような「傾向」を考えてみるのも面白いかと思います。
■運用システムの問題
CTF はセキュリティに関する様々な問題を扱いますが、分野は違えど、最終的に「解答となるパスワードを探す」という点においては同じです。これは極論すると、すべての問題が「与えられたファイルや情報からパスワードを探せ」というスタンスでしかなく、そのパスワードを submit したかどうかでのみ正解、不正解が決められます。
これはシステムとして運用しやすく、オンラインでの開催が容易である反面、パスワードさえ分かってしまえば問題そのものを解く必要がないとも言えます。つまり、カンニングやチーム間での教え合いが容易に可能であり、またそれを制限できません。よって、その気になれば、1 位が確定したチームは 2 位以下のチームに解答パスワードを教えることで、そのランキングを自由に操作できますし、同じ国同士のチームで解答を共有し、ランキングを占有、なんてこともやろうと思えば可能です。
そのような不正を防ぐために、CODEGATE CTF では決勝戦へ進むチームに対して、解答レポートの提出を義務付けています。これは、「どのようにして解答パスワードを得るに至ったか?」を書くレポートであり、予選終了後、3~4 日までに提出する必要があります。
このレポート提出により、極端な不正は防止できると思いますが、ランキングの上位では数百点の差に 2~3 チームがひしめき合うなんてことは普通に起こり得ます。そして、それらのチームが予選通過の条件である 8 位以内に入るために 1~2 問程度を仲の良いチームと交換する、といったことが起こらないとは限らず、またそれを防ぐことは難しいです。これは、運営や不正を行うチームが悪いと言っているわけではなく(まぁ不正は良くないですが...)、現状の CTF のシステム的な限界だと思います。それも踏まえて、決勝戦へ進むためには、予選においてある程度「余裕勝ち」しておく必要があるのかもしれません。
■その他のセキュリティコンテスト
セキュリティコンテストは CTF 以外にもたくさんあります。例えば、韓国のセキュリティカンファレンス Power of Community 2010(以下、POC)で、Hacker's Dream という CTF と同じオンライン型のセキュリティコンテストが開かれました。ただ、ルールは CTF とは大きく異なり、解答をレポートにまとめて submit するという、また少し違った形式のコンテストだったようです。ちなみに、2010 年は日本人が優勝しており、優勝者である大居氏のブログからコンテストの詳細が確認できます。
他にも、詳しくは知らないのですが、F-Secureリバースエンジニアリングチャレンジ、Panda Challengeといった、カンファレンスではなく企業が実施しているセキュリティコンテストも多くあります。
CTF もそうなのですが、ここ 2~3 年でセキュリティ系のコンテストは数多く実施されるようになりました。参加資格が国内在住者限定のものも多いですが、オンライン上で、誰でも参加できるものもあるため、力試しに参加してみても面白いかもしれません。