今年1年を振り返る

今年もいよいよ終わりということで,なんとなく一年を振り返ってみようと思う.
心なしか2017年は過去と比べて特に動きが多かった一年のように感じていて,今の心境を備忘録的に残しておきたいといった,いわばポエムである.一部を除いて技術的なことはあまり書いていない.あと実際に見てもらえばわかると思うが,大半はCTFチームでの活動*1に関する話である.

1月

なんといきなりとある病院のベッドの上から僕の2017年は始まる.実をいうと2016年の12/23に自然気胸を発症し,その日のうちから入院していた. 気胸というのは肺に穴が空き,そこから空気が漏れ出して肺がしぼんでしまう状態のことをいう.僕の場合は自然気胸というもので,詳しい原因は未だに不明である.
一説によるとやせ型の人は気胸になりやすいらしいが,これはあくまでも推測である.自然気胸はやせ型で若年男性に多いことから「イケメン病」とも呼ばれるらしいが僕はイケメンではない.
気胸の治療には主にドレーンという医療器具を胸に刺して行う.このドレーンは肺に溜まった空気を体外に排出するためのものであり,胸腔内の気圧を一定に保つことで肺を膨らませ,自然治癒による穴の修復を試みる.しかしこの治療方法では治療が完全でないことが多く,再発率も高い.もっとも,僕はドレーンによる治療では治らなかったので,外科医による胸腔鏡下手術で肺の穴を塞いだ.

入院したのも手術を受けたのも人生初だし,何よりも卒論の締め切りが一ヶ月後に迫っていたため慌ただしい毎日だった.事情を説明して病院側にPCの持ち込みを許可してもらえたこともあり,無事に卒論を完成させることができた.と思う.
あと入院中にお見舞いに来てくれた人が結構いた.精神的に割と参っていたため,彼らには今でも感謝している.

2月

卒論の発表を無事に終えて,まあ卒業できるだろうということで一安心する.
しばらく離れていたCTFを再開する.Codegate 2017 prequalsは15位で本戦へ進めず,Boston Key Party CTF 2017は9位だった.そういえば一度も韓国行ったことがないので来年はなんとか予選通過したい.

CPUエミュレータUnicornを使ったWindows APIトレーサを書いた.ついでにPEのパーサも作った.

icchy.hatenablog.jp

これを公開した後にとあるセキュリティ企業の人から声をかけて頂き,一緒に食事に行くことになった.意外なところで意外な人が見ているものだなあと実感した.

3月

以前運営として関わっていたICTSCに大学のサークルからなるチームで競技者として参加,初出場チームの中で1位だったらしく新人賞をもらった.ネットワーク機器を触ったことのあるメンバーがほぼいなくてしんどかった.あとさくらインターネットのチームがありえないほど強くて,スコアボードから見えなくするChrome extensionを書いたりした.

github.com

0CTF 2017 Qualsは18位だった.去年決勝まで行ったのでまた行きたかったのだが一歩及ばず.あと少しで解けたXSS問を通せていれば予選通過だったぽくてつらい.多分この問題のおかげで<link rel=import href=>は今でも忘れていない. あと卒業式があった.ほとんどの同期は同じ院に進むから来年度以降も会うのだが,やはり大学の卒業式というのは重要な節目で,学部を卒業したんだなあという実感があった.

4月

新年度も始まり修士としての生活がスタートする.とは言うものの学部4年生の時とほとんど変わらず,研究は適当に進めてあとは適当に授業に出るだけ.

CTFの方はASIS CTF 2017 Qualsで3位,PlaidCTF 2017は20位と振るわず,DEF CON CTF Qualifier 2017は15位と予選通過は叶わなかったが,binjaに勝利し日本の中では1位だった.IDA Decompilerは偉大.
また初の試みとして,April Fools' GTF 2017を企画して開催した.その名前の通りジョークCTFであり,全てがエスパーやジョーク問などで構成されている.準備期間は多分数日くらいで,皮肉にも作問メンバーはその大半が数時間やそこらのレベルで問題を生成していた.Tokyo Westerns CTF(後述)もこうだったら良かったのに.あと思いの外参加者が多くて,海外のプレイヤーもこういうノリは好きなんだなあと思った.

5月

ICTSCの合宿で伊東に行った.前回運営に参加した時から2回も空いていたので大半の運営は初めて会う人だった.「今回は特にやることがないな〜」と思っていたらICTSC運営が開発している自作クラウドn0stackのチームにjoinすることになった. github.com

中国のQihoo 360という企業から突然「あなたはWCTFの参加チームに選ばれました.6月末に北京で開催するから来てね」といった明らかにスパムじみたメールが届く.しかし色々調べているとどうやら去年も世界の強豪チームが参加していたちゃんとしたCTFであるということがわかる.普通のCTFとは異なり,各チームが問題を持ち寄ってお互いの問題を解き,最後に自分のチームが作った問題のプレゼンをしてそれらの合計点数を競い合う形式の大会*2だった.賞金の合計はなんと約1000万円.チームで問題を作ることに.うちのチームは7dcsとBackpacker's Cipher -hard mode-を作成し,僕は7dcsのバックエンドを主に実装していた.
CTFはPHDays VII CTF,FAUST CTF 2017でどちらも珍しくAttack & Defense形式のもので,参加チームもそれほど多くなかったためかそれぞれ3位,8位だった.FAUSTの方はFirst Blood*3を取れたらしく,少額だが賞金が降ってきた.

IPSJのOS研究会に参加し,沖縄で発表をしてきた.雨が降っていてプールや海で泳げなかったのが残念だった.
binjaのpotetisenseiと新しく日本のCTFを立ち上げよう,ということでCBCTFが発足する.11月に開催される日本発の情報セキュリティ国際会議CODEBLUEにて,binjaとTokyoWesternsでCTFを開催することに.

codeblue.jp

6月

Google Capture The Flag 2017 (Quals)に参加.今年はFinalsをやるらしく,8位で無事予選通過.これは終了後にわかったことだが,決勝戦の場所はこの時点では決まっておらず,参加チームにアンケートを取っていた.Googleのオフィスがある国がいくつか提示され,その中から選んだ.うちのチームはスイスを選び,アンケートの結果もスイスに決まった.
Trend Micro CTF 2017 - Raimund Genes Cup - Online Qualifier (長い) に参加.通称Trend Micro CTF.現状では唯一の日本企業が開催するCTFである.なんとか10位で予選通過.OSINTがしんどかった.

5月に招待メールがきたWCTF 2017に参加するため北京へ.幸運にも2位を取ることができ,賞金30000$ゲット.ちなみに7dcsはPPCパートすら解かれなかった.

7月

投票を経てTokyoWesternsの正式なリーダーになる.とはいえ今までまとめ役っぽいことをしていたので特に変わったことはない.
Tokyo Westerns CTF 3rd 2017 (通称TWCTF) とICTSC8に向けて忙しく動き始める.

ICTSC8では中国の金盾を模した問題を作った.初めてLinuxのLKM (Loadble Kernel Module) を書いたためデバッグが非常にしんどかった. icttoracon.net

ACM-ICPCの国内予選に参加する.かなり上手くいって,全体5位,大学別2位*4という過去最高の結果に終わる.詳しいことは以前書いた記事を参照して欲しい.

icchy.hatenablog.jp

なおこの成果により海外のアジア地区大会へ参加する際の補助金が出る.紆余曲折を経てタイのナコーンパトム大会へ参加することになった.

8月

9月初めに迫ったTWCTFの作問が燃え始める.やはりみんな忙しい中時間を割くのはなかなかに難しい. ICTSC8のホットステージが始まる.家からだとやはり六本木のCiscoは遠い.作業はまあまあ順調で,途中多少のトラブルはあったもののタスクを適当につぶしていく.本番は電通大なので家が近くて助かる.ちなみに本番は電源が足りなくてインフラが止まったりした.今となってはいい思い出である.

icttoracon.net

NRI Secureが主催するSANS Netwars Tournamentに参加する.チーム戦とは聞いていたがまさかの大学ベースでまとめられていたので結局MCCとして出場.普段CTFチームとして組んでいる電通大MMAの主戦力からなるチームに負けて2位.

9月

Tokyo Westerns 3rd 2017を開催する.全世界から901チームが参加し,CTFTimeにおける評価は80.08を獲得.

久しぶりにCTFに参加する.ASIS CTF Finals 2017は5位で残念ながら賞金獲得ならず*5,EKOPARTY CTF 2017は2位で200$獲得.

CODEBLUE CTF 2017に向けて動き始める.問題はもちろんインフラやスコアサーバーや諸々の調整などをbinjaと協力して進めていく.正式にCODEBLUE CTF 2017をアナウンスする.CODE BLUE CTF 2017

NTTセキュアプラットフォーム研究所でインターンをさせてもらう.業務として研究を行なっている企業での仕事は初めてだったが,非常に有意義な時間を過ごせた.詳しいことは書けないが,ある技術についての調査を一から行い,それが研究に応用できるかの検討などをしていた.

10月

情報科学若手の会に参加する.自分の研究やCTFの話などについて発表した. wakate.org

突然アナウンスされたKaspersky Industrial CTF Quals 2017に参加.なんと3位で予選を通過してしまい,また北京にいくことに.なんと日程が急で,予選からわずか2週間程度で決勝を迎える.毎年行われているGeekPwnというイベントの中で決勝戦を行い,産業系システムを模した装置に対して侵入できたら勝ちというタイプの問題だった.気づいたら2位になっており,副賞としてDJI製のドローンをもらった.ちなみにこのイベントで韓国のCykorの人と初めて話した.
北京から戻って来たら次はGoogle Capture The Flag 2017 (Finals)に参加するためスイスへ.帰りにフランスを観光するためパリを経由地にして乗り継いだ.問題は結構面白いものが多く,南京錠をピッキングツールで開けるものもあった.結果は5位で入賞はならなかったが,Googleのオフィスツアーなどが企画されており,イベントとしてもかなり楽しめた.

11月

月初めにHITCON CTF 2017 Qualsに参加し,3位で無事予選通過.
6月に参加したTrend Micro CTFの決勝戦に参加.僕からのコメントは特にないが,参考情報としてチームメンバーが書いた記事を貼っておく. hama.hatenadiary.jp

Trend Micro CTFの決勝は新宿で行われていたが,それが終わるとそのまま西新宿のCODEBLUE CTFの運営会場に移動.CODEBLUE CTFの準備が大詰めを迎える.オンサイトで参加するチームを事前に募集したのだが,いざ蓋を開けてみるとドタキャンするチームが大量に発生した.仕方ないので余った席を飛び入り枠として解放することにしたら,たまたまCODEBLUEに参加していた台湾の217のメンバーが数人いたため飛び入り参加することに.事前募集の段階で確定していたチームのうち普段からCTFに参加しているチームはCykorのみだったので,これはオンサイト優勝チームは確定かな…と思っていたのだが217の参加によってなかなか盛り上がった.

12月

TwitterSh1n0g1さんにお声がけ頂き,濱せっくで登壇することに. hamasec.connpass.com

少し話題になっているXXE攻撃の少し発展的な攻撃方法について発表した. docs.google.com これは以前参加したASIS CTF 2017 QualsのInternal attackという問題をベースにしているが,実際に使われた攻撃でもあるらしい.

IPSJのOS研究会ComSys2017で発表し,併設イベントであるBitVisor Summit 2017でも発表してきた.自分が取り組んでいる研究においてBitVisorを使っており,その過程で得られた知見などをまとめた.

www.slideshare.net

ComSysの3日目はあのBash on Ubuntu on macOSの凱旋発表があったのだが,残念ながら参加できず.HITCON CTF 2017 Finalに参加するため台湾へ.

HITCON CTF 2017 Final参加記

この記事はCTF Advent Calendar 201711日目の記事です.3週間の遅刻になります.

今年のHITCONはCapture the Foodという面白いテーマがあって,なんと問題を解くとフラグと同時に食事が得られる.裏を返せばフラグを取らないと食事が得られないということである.   もちろん菓子類や飲み物は既に提供されているため,人間的な食事を望まなければ空腹を満たすことはできる.ちなみに問題を解くことで得られる食事は全て台湾名物である.以下に軽く紹介する.

  • 珍珠奶茶 (タピオカミルクティー)

    • タピオカが入ったミルクティー.タピオカのサイズがとても大きく歯ごたえがあった. f:id:icchyr:20171211234255j:plain
  • 魯肉飯 (そぼろご飯)

    • ご飯の上に味付けしたそぼろが乗ったもの. f:id:icchyr:20171211233958j:plain
  • 牛肉麺 (牛肉麺)

今回はAttack & Defense形式であることには変わりないが,パッチをバイナリ形式で適用し,他のチームがあてたパッチをダウンロードすることができるようになっていた.おそらくDEFCONと同じ形式だと思う. この形式だと今回はWeb問題は無いのかな…?と思っていたが,実際にはopenresty+lua+nsjailでC言語製の標準入力を受け取るパッチを書き,それをパッチサービス側でコンパイルしてもらって適用するという形式だった.そのため自前でHTTPのリクエストパーサを書く必要があり,かなり苦労した.

問題の構成はWeb1問 (2種類のアプリケーションを含む), Pwnable4問の計5問.今回は去年と異なり,それぞれの問題はリリース後は最後まで動き続けていた.

問題 ジャンル 概要
mimiku (warmup) web pingをコマンドから打つことができるだけのサービス
mimiku (messup) web ファイルをアップロードしたり上書きしたりすることのできるサービス
rcgi pwnable Rust製のHTTPサーバ
seccomp-tools pwnable seccomp filter
food_store pwnable heap問
alchemy pwnable

僕がメインで取り組んでいたのはmimikuの攻撃部分.2日目は防御部分のパッチを書いていた.上にも書いたが,パッチに渡ってくる入力はHTTP header+bodyである.これに加えてWebアプリケーション側はGET, POST両方の形式でリクエストを受け付けたりするのでリクエスト先のURIまでしっかり見る必要がある.
実際に書いたことがある人ならわかると思うが,C言語でHTTP Requestのパーサを書くのはそれほど難しくない.しかしヘッダの内容によってBody部分の処理を変えるとなると話は別である.なぜかというとそれはHTTPの範囲を超えて対応する必要があり,例えばContent-Typeでapplication/jsonが指定されていたらBody部分のデータをJSONとして解析しなければならない.今回の問題ではPHPのSlimを使っていたので当然APIJSONを受け付ける.これに加えてWAFのソースコードには8KBというサイズ制限があり,とてもではないがまともに解析するパッチを書くことはできない.というわけで正確なvalidationは諦めて,攻撃が刺さりそうなリクエストのみをブロックできそうなWAFを書こうとした.もちろん最後まで攻撃は防げなかった.

最初のwarmupはpingを打つことができるだけのサービスで,OSコマンドインジェクションの脆弱性があった.これを防ぐのはそこまで難しくなくて,単純に入力に含まれている文字を検証すれば良いだけである.最終的にはblacklist形式のvalidationに落ち着いた.ちなみにTokyoWesternsはnomeaningさんがいち早く自動化するスクリプトを書いたため,mimikuでなんとFirst Bloodを取ることができた. しばらくするとESPRがリクエストを分割してWAFを回避する攻撃を完成させ,多くのチームが一斉にフラグを取られた.これを防ぐのもそこまで難しくなくて,リクエストサイズをきちんと検証すれば良い.   ところがmessupが公開されると上述した問題に直面し,どのチームも完全にパッチを当てることができずに最後まで攻撃の打ち合いになった.

バイナリパッチ形式のWAFなので他のチームのバイナリをコピーする機能が与えられており,例えばバックドアをこっそり忍ばせておくこともできる.これはおそらくDEFCONの形式と同じだと思うが,Web問に適用できるよううまく構成されており,Orangeはとても良い問題を作ったなあと思った.

結果は6位とそこそこなものになってしまったが,個人的にはかなり面白い競技形式だった.WebのA&Dにおける一つのデファクトスタンダードに成りうると思う.

ちなみに帰りに空港で中学高校時代の部活の先輩と久しぶりに再会して,雑に忘年会やるぞという話をした.

話は戻って12月の振り返りへ.

ACM-ICPCのアジア地区予選つくば大会へ参加するも,34位と振るわず.不安の中アジア地区ナコーンパトム大会へ参加するためタイへ向かう.
なんと結果は8位.World Finalsに進めない順位ではあるものの,入賞して3000baht獲得した.ちなみにこの大会で僕はかなり良いパフォーマンスが出せていて,実装はしていないがI問題のFA*6を取ることができた.あとはH問題の方針を考え直してACした.
大会後は以前うちの大学にきていた留学生と再会することができて,バンコクを案内してもらったりした.タイは物価が安くて良いなあと思った.

タイから戻ると高校時代の部活の先輩達と忘年会をやって,久しぶりに同級生にも会った.やたら「背が大きくなった」だの「声が低くなった」だの言われて,自分の成長の遅さを実感した.

最後の締めくくりには34C3 CTFに参加した.なんかめちゃくちゃ難しい問題セットで,Web問に置いては全ての問題の解答チーム数が10チームを超えなかった.なお結果は7位とまあまあ良い成績だったが,特に決勝があるわけではない.

まとめ

今年はとにかく色々なことがあった.入院から始まりCTFで賞金を取ったり,初めてヨーロッパ圏に行ったり,最後のICPCで海外遠征して入賞できたり,いきなり高校時代の人たちと再会したり.
特にTokyoWesternsとしてはWCTFでの成果をはじめとした大躍進の年だった.来年こそはDEFCON行きたい.

最後までお読み頂きありがとうございました.それではみなさん良い年の瀬をお迎えください.

*1:僕はTokyoWesternsというチームに所属している.

*2:Belluminarという.

*3:全チームの中である問題を一番最初に解くこと

*4:一位はもちろん東大である.

*5:TokyoWesternsは過去2年間にASIS CTFで賞金を獲得している.

*6:First Acceptedの略.全チームの中で一番最初にその問題を解くこと