WCTF 2017 参加レポート

こんにちは、セキュリティ室 Application Security Team の志賀です。今回は、中国(北京)で、6月27日から3日間開催されたCTF大会「WCTF 2017」に招待されましたので、その参加レポートを書きたいと思います。


イベント用の看板にチーム名(TokyoWesterns)を書き込むことでチーム登録が完了。かっこいい…

WCTFとは

CTFとは簡単に言えばセキュリティ技術を競い合うコンテストです。近年ではプロコン(プログラミングコンテスト)を始め、ソフトウェア技術に関する様々なコンテストが開催されていますが、そのセキュリティ版がいわゆるCTF(Capture the Flag)です。今回のWCTFは、中国のSecurity企業であるQihoo 360(奇虎360)が主催しており、世界中のトップチームを運営側が旅費、交通費など全額負担で招待するという少し変わったCTFでした。

一般的なCTFでは、まずオンラインで誰もが参加できる予選を行い、その中から上位10チーム程度を決勝戦に招待し、改めてオフラインで決勝戦を行い優勝チームを決定します。しかし、WCTFではオンライン予選はなく、普段の(世界中で開催されている)いくつものCTFでの総合的な戦績を考慮して、運営側が直接上位チームを招待するという形になっています。今年のWCTFでは世界各国(台湾・ロシア・ポーランド・中国・韓国・アメリカ・イラン・ハンガリーなど)から12チームが招待され、私はTokyoWesternsというチームメンバーとして出場してきました。

大会ルール

CTFはルールも様々なのですが、一般的にオンライン予選はJeopardyスタイル、決勝戦はA&Dと呼ばれるルールで行われます。

Jeopardyはいわゆるクイズ形式というもので、あらかじめ運営が用意した複数の問題をPlayer(Team)が解くことで得点を重ねていき、最終的に高い点数を得たチームが勝者となるシンプルなルールです。出題される問題はもちろんセキュリティに関連するもので、例えば脆弱性攻撃、暗号、フォレンジックといった分野がよく扱われます。A&DはAttack & Defenseの略で、閉じたネットワーク環境内で各チームごとに脆弱なシステムが渡され、それを守りきるか、他のチームのシステムを攻撃するかして点数を得るルールです。どちらもCTFプレイヤーにとっては馴染みのあるルールなのですが、WCTFではこれらとは違う「Belluminar」という新しいルールで大会が行われました。

Belluminarは、POCという韓国のカンファレンスで最初に実施されたコンテストスタイルで、JeopardyとSeminar(セミナー)を組み合わせた新しい競技です。Jeopardyと同じく、Playerは出題された問題を解くのですが、その問題は各出場チームが(それぞれ2問ずつ)出題しており、運営側は問題を一切用意しません。各チームが他チームの問題を解き、自チームは自分たちが出題した”以外”の問題で得点することになるわけです。そしてJeopardyパートが終了すると、続いて自分たちが作った問題の解説を行うSeminarパートが始まります。作成した問題のクオリティによってもポイントが変動するので、問題を解くだけでなく、良い問題(良問)を作る能力も問われるわけです。ちなみに「Bellum」はラテン語で戦争を意味し、それに「Seminar」を組み合わせてBelluminarという言葉を作ったそうです。

競技開始

今回のルールでは事前に各チームが問題を2問ずつ準備する必要があるので、私たちのチームは「暗号系」と「脆弱性攻撃系」の問題を用意しました。ちなみに私は問題作成には関わっていませんので解説はできません(スミマセン)。

出題したのは以下の2問です。

  1. Backpacker’s cipher – hard mode – : Knapsack暗号の問題
  2. 7dcs (7 days C#) : 競技プログラミングのジャッジシステムを模した問題

私たちは、競技の1日前に中国(北京)に入国し、コンテストの登録などの手続きを行いました。北京には5日間滞在しましたが、コンテストは前後の移動日を除いて3日間です。1日目と2日目が通常のCTFと同じで問題を解く時間、最終日となる3日目がセミナーと結果発表になり、その後に懇親会が開かれました。


チームの競技エリア。TokyoWesternsのチームロゴが貼ってある

入国した次の日の朝からさっそく競技開始です。とはいっても、競技中はどのチームも黙々とPCに向かっているだけなので、特別書くことがありません(CTFあるあるです)。その日は夜までどのチームも淡々と問題を解いていました。ただ、幸運にも私たちのチームはFirst Bloodをいくつも獲得でき、1日目終了時点でTokyoWesternsはまさかの1位(暫定)。
編集部注:First Bloodとは、まだどのチームも解いてない問題を最初に解くこと。大会によっては通常より高い点数が設定されることもあり、それによって戦略を変えたりすることもある。WCTFではFirst Bloodにわりと高い点数が設定されていた。

2日目も朝から競技が開始します。1日目夜から2日目朝までの時間は競技のNetworkに繋ぐ事は出来ませんが、問題ファイルの解析などは夜中にも可能なため、夜通しで各チームが解析をしており、その成果は2日目開始時にsubmitされます。よって、これもわりとCTFあるあるなのですが、2日目朝はランキング変動が起こりやすく、順位が維持できているか少し心配でしたが、2日目スタート時点でもトップを維持できており、ちょっと期待感が出てきた感じです。と思っていたら、2日目の途中でHITCON 217という台湾のチームに抜かれ、2位に転落。そんなに甘くなかった。

問題の紹介

ここで実際に出題された問題の簡単な紹介をしたいと思います。私はpwnという(脆弱性攻撃系の)ジャンルの問題を主として解いており、今回はsrvmという問題とDr. drevilという問題の2問を解きました。簡単に紹介しましょう。

srvmという問題は、16bit RISCの独自アーキテクチャの仮想マシン本体と、その独自アーキテクチャ上で実行できるバイナリファイル2つによって構成されていました。Linux上で仮想マシンが動き、仮想マシン上で独自アーキテクチャのバイナリが動いているという環境で、最終的にはLinux上のshellを奪取する(任意コードの実行を実現させる)ことが目標です。この問題では、まず仮想マシンを解析して独自アーキテクチャのdisassemblerを書きました。そこから仮想マシン上での任意コード実行へ持って行き、さらに仮想マシンの脆弱性を突いてLinux上での任意コード実行を目指します。


問題ファイル解析中のキャプチャ画面。overflow!!

脆弱性について少し詳しく書きます。実際には独自アーキテクチャのバイナリにはBackdoorがあり、解析すると任意コードが容易に実行可能なようになっていました。いわゆる解析するだけ問題というやつですね。次に仮想マシンの脆弱性ですが、これは実装されているシステムコールにありました。read/write システムコールのようなものが用意されていて、16bitでbufferのアドレスとサイズを指定できたのですが、仮想マシン上で用意されていたメモリのサイズは16bitだったので、bufferのアドレスを0xffff、サイズを2以上に指定した上でreadシステムコールを呼ぶと仮想マシン自体のメモリを破壊できたという脆弱性です。

Dr. drevilという問題では、ServerとしてWindowsが動作しており、Windows上でHeapを用いた簡単な実行ファイルが動いているという問題でした。この問題もWindows上でのshellを取得するのが目標となります。この問題では2つの種類の構造体が使用されているのですが、実行ファイル上では実際に作った構造体がどちらの種類なのか判定するコードが入っておらず、型はユーザーが指定するというものでした。つまり型Aとして作成したものを型Bとして扱う事が出来たというわけです(俗にType Confusionと呼ばれます)。これを利用して任意の関数を呼び出せるようにしてshellを奪取するという問題でした。

結果

2日目は終了の30分前くらいに、このWindowsのpwn問題(Dr. drevil)を解いて一時的に1位になったのですが、HITCON 217に再び抜かれて2位となり、結局スコア2位で3日目に進むことになりました。

3日目のSeminarパートでは、それぞれのチームが作成した問題の解説が行われます。Seminarパートでの得点は半分が運営側、もう半分がPlayer側という形式になっており、Player自身の手で他のチームの得点を決めるという形になっていました。そして3日目のセミナーも終わり、最終的な順位は2日目終了時と同様の2位という結果でWCTFは終わりました。


最終結果 2位。

最後に

私は休日などによく趣味でこういったCTFに参加しているのですが、面白いですし、勉強にもなります。最近では全く新しいテクニックや、論文などで提案されたような手法の実装が問題に出てきたりして非常に興味深いです。昨今は常にオンラインで開催されているCTFもありますし、大会の数もかなり増えてきています。機会はたくさんあるので、興味のある方は是非CTFをやってみてはいかがでしょうか。順位がつくのももちろん面白いのですが、それ以上に新しい(最先端の)技術を学べる場、競技としてCTFに挑戦してみても良いと思います。

おまけ

チームロゴ入りのシーリングスタンプをいただきました。かっこいい…(でも使うのかと言われると…)

全チームに配られたチームロゴ入りのシーリングスタンプ。