KDL BLOG

「DEF CON CTF 2018」に参加しました!(前編)

どうも、まだまだ新人気分なセキュリティ事業部の馬場です。
先日、世界中のハッカーが集まるイベント「DEF CON(デフコン)」内で開催されたハッキングコンテスト「DEF CON CTF 2018」の決勝戦に、チーム「binja(ビンジャ)」の一員として参加しました。


dc2018_01.png
CTF とはどのような競技かについては、こちらをご覧ください。
SECCON 2017国際決勝大会 参加レポート

DEF CON CTFについて

DEF CON は毎年ラスベガスで開催されている世界最大のハッキングイベントで、その中のコンテンツの1つとして DEF CON CTF が催されています。昔から CTF を開催しているだけあり、今ではもっとも権威がある世界大会といわれ、世界中から情報セキュリティ界の猛者が集まりハッキング技術を競います。ハッカーの頂上決戦ともいえる闘いなのです。

決勝戦の出場権はオンライン予選を突破するか、DEF CON CTF 運営が指定する CTF 大会で優勝することが必須となります。binja はオンライン予選を勝ち抜くことで出場権を得ました。ちなみに過去を振り返ると、2014年・2016年の決勝戦にも出場しており、今年で3回目の決勝戦出場。私は1回目の決勝戦出場時にはまだ binja に加入していなかったので2回目の経験となりました。

DEF CON CTF の運営は定期的に変わり、今年からはアメリカにある大学のセキュリティ研究室にあるCTFチーム「Shellphish」の主要メンバーが中心となった新たな団体「Order of the Overflow」に変わりました。

運営団体は変わっても、オンライン予選で出題される問題はリバースエンジニアリング(rev)やエクスプロイト(pwn)などのバイナリ系に偏っており、長らく日本チームからの決勝戦出場は sutegoma2 と binja のみでしたが、今年は西東京の学生主体で結成されたチーム「TokyoWesterns」も出場を決めました。すごいですね。

競技内容

DEF CON CTFの決勝戦は基本的に「Attack & Defense」という形式で行われます。この形式はチーム毎に脆弱性が存在するサーバを与えられ、相手チームに割り当てられたサーバの脆弱性をついて攻撃(Flagを奪取)しつつ、自チームに割り当てられたサーバの脆弱性への攻撃をいかに防ぐかという競技です。

この形式をベースにしつつ毎年変わった趣向が凝らされており、前回私が出場した時は「人間 VS 機械(AI)」というテーマでした。
「CGC(Cyber Grand Challenge)」という防御から攻撃まで全て自動化されたプログラムで競技を行う大会が別にあるのですが、その大会で優勝したプログラムも大会当時の環境でDEF CON CTFに参加してくるというものでした。

今年は、少し風変わりな Attack & Defense に加え、あの SECCON でお馴染みの「King of the Hill」形式の問題が出題されました。King of the Hill がどのようなものかについては、例によってこちらをご覧ください。
SECCON 2017国際決勝大会 参加レポート

今年の Attack & Defense がどのように風変わりかと言うと、まずチーム毎に問題サービスが稼働しているサーバの情報と問題の実行ファイルが与えられるのですが、サーバは自チームのものであっても SSH などで接続することができず、直接管理できないようになっている点です。
つまり、私の今までの経験では自チームのサーバは、ログイン手段やある程度の操作権限も与えられることが多いので、直接的な防御策を講じることが可能でしたが、今回はそれができないルールになっていたのです。

攻撃については、問題サービスの脆弱性を利用し相手チームのサーバ上に存在する Flag ファイルを奪取し、そこに記載されている Flag 文字列を所定のスコアサーバにサブミットすることで点を得られます。Flag 文字列は5分毎に更新されるようになっており、継続的にFlagの奪取とサブミットを繰り返す必要があります。

防御については、自チームのサーバが直接管理できない状態でどのように行うかと言うと、与えられた問題の実行ファイル中のバイナリを直接修正(バイナリパッチ)して脆弱性を防ぎ、それを所定の場所にアップロードするというものでした。
当然ながら修正後のサービスが正しく稼働するかチェックされ、規定通りの動作をしない場合は強制的に修正前の状態に差し戻されます。
また、問題毎に実行ファイルを修正できるサイズが定められており、工夫し無駄無く脆弱性を防ぐ必要があります。
5分間どこのチームからも自チームのサーバ上の Flag ファイルを奪取されず、Flag 文字列をサブミットされなければ継続的に点を得られます。

また、運営側から任意のタイミングで、相手チームから自チームに対する問題サービスへの通信トラフィックが pcap ファイルで公開されるようになっていました。これにより、単純に Flag 文字列を奪取する攻撃コードを送信してしまうと相手チームに攻撃手法がバレてしまうので、いかに攻撃コードを解析されづらくし、なおかつ Flag 文字列を暗号化してから奪うなどの工夫が必要になっています。逆に相手チームの攻撃コードを特定し解析することで、問題サービスの脆弱性を突き止めることや、手に入れた攻撃コードを使い回して他のチームに攻撃するといった戦術をとることもできます。個人的には pcap ファイルの公開は面白い試みだと思います。

今年度の決勝戦のルールは運営のWebサイトでも公開されているので、よかったらそちらもご覧ください。
https://www.oooverflow.io/obey/

次回のブログ(後編)では、実際に出題された問題とその解説、結果について言及しますので、そちらもぜひご覧ください。