Eyes, JAPAN Blog > SECCON 2018 Online CTF 参加レポート

SECCON 2018 Online CTF 参加レポート

Yuya Kanesawa

はじめに

先日10月27日(土)から10月28日(日)にかけて開催されたSECCON 2018 Online CTFに、私が普段リーダーとして活動している「wabisabi」という学生チームで参加しました。今回はその参加レポートをお届けしたいと思います。

SECCONとは?

公式サイト( https://2018.seccon.jp/seccon/about.html )には「情報セキュリティをテーマに多様な競技を開催する情報セキュリティコンテストイベント」と書かれています。その一環として開催されているのがSECCON CTFです。

CTFとはフラグと呼ばれる形式の文字列を獲得することで得られる得点を競い合うハッキングコンテストですが、SECCON CTFは日本最大規模で行われているCTFでもあり、予選であるオンラインCTFは海外からの参加も多く、毎年世界中から多くのチームが参加しています。

今年は1300チーム以上が登録していて、大会の規模の大きさを実感しました。毎週開催されている海外のCTFよりも日本では一般的な知名度が高いのでしょうか。

セキュリティに興味がある学生や、普段あまり時間が取れない社会人の方なども参加していると思われます。

出題された問題について

今回は低レイヤーの問題の出題が多かったと感じました。また、フラグの得点は解かれた人数によって減っていく形式でした。

Pwn

Pwnは脆弱性を突いてシェルを奪取するジャンルです。

脆弱性のある実行ファイルが配布されるのでそれをローカルで解析し、脆弱性の発見やシェルを起動するためのエクスプロイトを作成し、配布されたファイルが問題サーバで動いているのでリモートからシェルの奪取を試みます。

苦手な人が多く、初心者には何をしたらよいのか分からないと感じる人が多いジャンルです。

今回は9問の出題がありました。

Crypto

Cryptoは名前の通り暗号に関する知識が問われるジャンルです。

問題の一例としては、暗号化に使用したスクリプトと暗号文が渡されるのでそれを解読したりするものがあります。古典暗号や現代暗号に関する知識が問われます。

今回は5問の出題があり、中でもEthereumに関する問題が出ていて話題になっていました。

Reversing

Reversingも名前の通りリバースエンジニアリングに関する知識が問われるジャンルです。

バイナリの解析がメインなのでPwnと違って脆弱性を突く必要はありません。比較されているパスワードを求めたりすることが多いと思います。時にはSATソルバなどを使って解を求めたり、最近では数学力と暗号力も必要なのではないかと感じるジャンルです。

今回は6問の出題がありました。

Media

普通のCTFにはないジャンルだと思います。

今回出題された問題は1問で、YouTubeの動画へのリンクがあり開いてみると約9時間の動画で、大阪のビル群をお天気カメラのような位置から映し出したものでした。”Needle in a haystack”という名前の問題で、これはイディオムであり直訳では「干し草の中の一本の針」なのですが、膨大な量から1つを探し出すのは困難であることを表現するときに使うようです。9時間という膨大な動画の中からフラグを見つけ出さないといけないのでまさにNeedle in a haystackであり、参加者の中で話題になっていました。

Web

WebはWebセキュリティに関する知識が問われるジャンルです。

SQLインジェクションやXSSやOSコマンドインジェクションやCSRFなど、他にも様々な攻撃手法を用いて与えられたWebサイトの脆弱性を突いてフラグを読み出します。

今回は珍しく1問の出題しかありませんでした。

QR

QRコードの問題が1問だけ出題されていました。

QRコードはもはやSECCONではお馴染みの問題で、毎年何かしらのQRコード要素が入ってきます。単純に右側のデータコード語部分だけ残っているQRコードの画像だったり、パンケーキversionだったり、今度は左側のエラー訂正コード語の部分だけが残っていたり、次は動画からQRコードが出てきたり、次の年はSECCON TOWERという問題にQRコード要素が含まれていたり、また次の年はQubic Rubeというルービックキューブの6面全てがQRコードになっていたり…と、実に様々な問題が出題されてきました。

今年はQR CheckerというQRコードをチェックするWebサイトのURLが与えられ、ソースコードを見ながらフラグが出そうなQRコードを与えるという問題でした。

Forensics

Forensicsは”証拠保全”という意味があり、犯罪捜査などに使われている技術です。HDDやメモリダンプ、パケットキャプチャファイルから証拠を見つけ出したりします。

最近ではDFIR(Digital Forensics and Incident Response)忍者チャレンジというフォレンジックコンテストが大和セキュリティさんから開催されていたり、個人的に熱いジャンルです。

今回は2問の出題しかありませんでした。

以上のジャンルが出題されていましたが、普通のCTFではMediaやQRなどのジャンルは無く、やはりQRコード問が出題されるのがSECCON CTFの特徴でもあると思います。

解いた問題について

私が解いた問題は「Reversing」を3問と「Pwn」が1問、あとは「QR問題」でした。

私はチーム内では普段ReversingとPwnを担当しており、最初はCryptが2問、Forensicsが1問、Reversingが1問だけ出ていたのでReversingから取り組んでいました。

Reversingは逆アセンブルした結果、各関数に1文字だけ怪しい文字があったのでそれらを抽出したらフラグがでたり、aarch64のバイナリが与えられるのでそれを動かしてフラグを出す問題、moxieというアーキテクチャのバイナリが与えられるのでそれを動かしてフラグを出す問題を解きました。

特にaarch64とmoxieの問題については普段読むことのないアセンブリを読みながらフラグへ辿り着いたので、個人的にとても面白い問題でした。aarch64は、フラグを復号する処理に使う乱数を間違っていることに気づかず、かなりの時間を費やしてしまいました。moxieは環境さえ作ってしまえばaarch64と同じ方法だったので、割とすぐ解けました。

Pwnは基本的なバッファオーバーフローからROPに繋げて解きました。割と解かれている問題が他に2問あったのですが、どちらもヒープ問題っぽいなと予想して、まだヒープ問を勉強していない私はすぐ諦めてしまいました…。

QRコード問題は終了30分前ぐらいに解きました。1枚のQRコードから確率で読み込まれるものが違うという、最近話題になったQRコードの脆弱性を使って解きました。QRコード自体は話題になったものに少し修正を加えたもの(確率を上げたもの)をポストしたらフラグが出てきました。

解けなかった問題について

Reversingのblockという問題とForensicsのHistoryという問題についてお話します。

blockで配布されたファイルはAndroidで使われているファイル形式apkであり、回転するフラグのオブジェクトの前面にブロックのオブジェクトがあって見えない状態なので、どうにかしてフラグを読み出してくださいという問題でした。

apkの解析に関しては以前、SECCON 2018 x CEDEC CHALLENGEという競技に参加した時の知見があったので解ける自信はあったのですが、なかなかうまくいかず解けませんでした。

Unityで書かれたアプリだったのですが、IL2CPPという手法を使っていなかったのでデコンパイルは簡単に可能で、フラグが回転する処理が書かれているメソッドを見つけることはできました。そこをNOP(何もしない命令)にしてフラグの回転を止めることはできたので、フラグを横にずらしたり、位置をブロックより前にすることで解けないかと考えました。しかし、デコンパイルと書き換えに使用していたdnspyというツールでコードを書き換えてコンパイルしようとしてもエラーを吐かれてしまい、他の問題に取り組んだほうが良さそうだなと諦めてしまいました…。

競技終了後、解いた人のWriteupを拝見するとアプローチは間違っていなかったらしく、コンパイルできなかったのは私のやり方や環境に問題があったようで悔しいです…。

Historyでは謎のファイルが渡されました。

形式がわからない謎のバイナリデータであり、Windowsのログのようなものが多数表示されていました。ですが結局最後まで形式を特定することはできませんでした。

Writeupを見てみるとUSN Journalというものであり、つい最近参加したDFIR忍者チャレンジというイベントにて目にしたはずのものでした…。なので、適切なビューアで読んでフラグを探すと見つかります。stringsというバイナリファイルから文字列を抽出するコマンドがあるのですが、それのみを使って怪しい文字列にあたりを付けてビューア無しで解いている人もいました。

ちなみにこの問題は全ての問題の中でも3,4番目に解いている人が多い問題で、こういう他の人が解いている問題を落としてしまったのでまだまだ基礎力が足らないなと感じました。

最終的な結果と所感

最終的に1201ポイントを獲得し、順位は80位でした。

SECCON CTFの決勝は去年から国際大会と国内大会に分かれていて、国際大会はOnline CTFのトップ12チームと、別のコンテストで用意してある枠が3つあり、合計15チームがオンサイトにて熱い戦いを繰り広げます。国内大会は日本在住の人しか参加できない大会であり、Online CTFから国際大会に出るチームを除いた日本チーム12チームが選ばれ、連携大会の枠がプラス3つあるので、こちらも合計15チームがオンサイトで熱い戦いを繰り広げます。

よって国内大会への出場であれば、海外のチームを除いた日本チームの中で12位以内に入ればよいので、私達のチームより上の順位である日本チームを調べてみたのですが、12チームには入れていないようでしたので、夢の決勝大会はまたの機会になってしまいました…。もう3年ぐらいは出ていると思いますが、272位→170位→80位 と着実に順位は上がってきているものの、決勝の壁は本当に厚くてなかなか突破することができません。去年と1ポイントしか変わっていないのに順位は90位も上がっていて、全体的な問題の感想としても難化しているように思えます。

決勝大会に行けるチームとの差はなんでしょうか?当たり前のことですが、確実に取れる問題を落とさないことと、得意ジャンルの問題はできるだけ多く得点を取ることでしょう。

例えばPwnは9問も出題がありましたが、1問も解けていないチームでもCryptoやWeb、他の問題で着実に点を重ねれば、決勝大会(国内大会)圏内に入れるということです。あとは今回のようにsolve数によって得点が減っていく形式では、これも当たり前ですが他のチームが解いていない問題を解くことで多くの点数を得ることができます。

また、さらに上位を目指すのであればそれぞれのジャンルをある程度解けるメンバーが揃っている必要もあります。チーム内のメンバーそれぞれが自分の担当ジャンルの勉強に専念し、着実に知識を積み重ねていくことが、チームとして強くなるためには不可欠なんだと思います。

私は今大学院1年生で、再来年卒業する(予定)ので来年が学生最後の大会になりそうです。チーム内の何人かはもう社会人になってしまうので、時の流れの速さを実感します。来年こそは決勝大会へ行けるように精進していこうと思います。

以上、SECCON 2018 Online CTFの参加レポートでした。

  • このエントリーをはてなブックマークに追加

コメントは受け付けていません。