アメリカ day 0, 1

来週の月曜日からアメリカのアリゾナ州にあるASUというところで、ShellphishのYan先生 (a.k.a zardus) の下で9月末まで研究インターンをする予定で、本日現地入りしたので備忘録程度に日記を書こうと思う。
なお日記の類は長続きした試しがないので途中でやめるかもしれない。

day0

羽田 → ロサンゼルス → フェニックス という経路で飛行機に乗った。ちょうどCODEGATE finalsに向かうTokyoWesternsのメンバーがほぼ同じくらいの便で、羽田空港で合流して適当に喋ってた。

航空券はなるべく安く済ませたくて、往復の最安値は10万くらいだったのだが中国南方航空で流石にやめた。次点が14万くらいであまり良い噂を聞かないアメリカン航空だったが、結構快適だったと思う。
SIMはあらかじめ日本で購入したKDDI mobile x H2O Wirelessを契約しておいたので、アメリカに着くとすぐに使えて便利だった。

これは余談だが、クレジットカードの枠が数千円足りなくて航空券が一度キャンセルされかけた。「24時間以内に対処しなければキャンセルされます」というメールが飛んで来て、慌てて繰り上げ返済をした後に電話するとセキュリティコードと日付を口頭で伝える羽目になってちょっとアレだった。

day1

空港からUberを使おうとしたのだけれど、現金に対応してなくてクレカの登録を隅っこでやる羽目になった。あまりこういう情報を外で入力したくない。
宿探しに難航している。最初は銀行口座もSSN (社会保障番号) もないのでcraigslistでコンタクトをとっても返信すらしてもらえず、とりあえずAirbnbで約2週間分予約した。なおチェックインする日付を1日間違えていて、初手ホームレスになりかけたけど運良く前日も空いていたので予約を変更した。急なチェックインのため18時まで待ってくれと言われたので、とりあえずzardusに連絡を取って、軽く大学を案内してもらった。とにかくスケールがデカくて、大学じゃなくて街にすら見える。
スケールがデカいのは大学だけじゃなくて、普通の車道も同様である。
とりあえず適当に食事などを済ませて、今日は早めに寝ようと思う。

今年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の略.全チームの中で一番最初にその問題を解くこと

IDA Proを使い始めた

およそ2ヶ月前くらいにIDA Proのメジャーアップデートが行われ,7.0がリリースされた.約一年ぶりのアップデートとなったが,もっとも大きな変更点はついにIDA Proそのものが64bitアプリケーションになったことである.かねてより購入機会を伺っていた僕は,これを機にMac版のNamed Licenseを購入することにした.

IDA Pro Named License購入チャレンジ

ところがquotation systemを見ればわかる通り,現在IDA Pro Named Licenseは全てのプラットフォームにおいて販売されていない.詳しいことは不明だが,知り合い曰くバージョン7.0がリリースされた直後に本体およびデコンパイラのライセンスがリークされ,それを受けての対応ではないかとのこと.
当初Google CTFのfinalsが直前に迫っており,せっかくならここに間に合わせたいということで急遽メールで交渉することにした.

欲しいライセンスは IDA Pro Named License [Mac] なんだけど,
なんか今全部のNamed Licenseが買えないみたいなんですよ.
新しくNamed License売ってくれない?w

みたいなことを書いて sales[at]hex-rays.com にメールを送った. すると半日くらいで返信が来て,

会社のメールアドレスから送ってくれや.

僕はまだ学生なわけで当然会社のメールアドレスは持っていない.とりあえず大学のメールアドレスを使って再度送信.

OKわかった.欲しいライセンスはお前に紐付く個人ライセンスでいいんだな?
quoteは用意できる.請求先住所を教えてくれ.

とまあ意外とすんなり通った.
あとはメールアドレスを変えたい旨を伝えたら最初のメールアドレスで手続きしてもらえたので,そのまま普段のメールアドレスをライセンスに紐づけることができた.

とにかくHex-Raysの人の対応が早くて,営業時間内なら1,2時間程度で返事が返ってきた.おかげで東京を出発する日にメール手続きを始めたにも関わらずフランスでのトランジット中にダウンロードリンクが降ってきて,そのまま空港の回線を使ってIDAを雑にインストールするといったことをしてた (回線を圧迫したけど深夜だったし許して) . 実はクレカの限度額が足りなくて急遽デビッドカードに切り替えたり,3Dセキュアに対応してないカードはrejectされるため羽田空港の搭乗口で3Dセキュアを有効化したりドタバタしていたんだけどそれはまた別の話.

エクストリームIDA購入チャレンジめいたものに見事勝利したわけだが,結局Google CTFでは使わなかった.

macOSでIDA Pythonをいい感じに使いたい

話は変わって,現実逃避をするために最近少し余裕が出て来たのでIDA Pluginをいくつか試してみることにした. まず最初に試そうと思ったのはPonceだったがこれはまだ7.0に対応しておらず,僕自身プラグイン開発の知見も全くないので諦めた.他に何かないか探していたところ,たまたまTwitterkeypatchが流れてきたのでまずこれを導入することにした.keypatchにはkeystoneが必要なので,まずIDA Pythonでkeystoneを使えるようにする.

しかしこれがなかなかやっかいで,IDA Pythonはシステム標準のもの (/usr/bin/python) を使う.僕は普段pyenvを使っているためmacOSのpipを一切整えておらず,いざ導入してもSIP (System Integrity Protection) に阻まれて一切のパッケージをインストールできない.もちろんSIPを無効化する方法 (http://icchy.hatenablog.jp/entry/2016/05/16/121630) もあるのだが,なんだか面倒なのでpyenvをうまく使う方法を考えた.

まずIDA Pro本体のディレクトリ (macOSでは/Applications/IDA Pro 7.0/ida.app/Contents/MacOS) におけるファイル・ディレクトリは次のようになっている.

...
cfg/ # 各バイナリ用のIDA設定ファイル
dbgsrv/ # 各種アーキテクチャ用のdbgsrvバイナリ
ida # 32bitバイナリ用IDA
ida64 # 64bitバイナリ用IDA
idc/ # idcスクリプト
plugins/ # プラグイン
python/ # IDA Python用ライブラリ
sig/ # シグネチャデータ
...

プラグインにとって重要なのはpluginsおよびpythonディレクトリで,pluginsにはプラグイン本体のプログラムが,pythonにはIDA Pythonから使用するライブラリが入っている. 原理的にはpythonにimportしたいものがあれば良いので,そこに~/.pyenv/versions/2.7.14/lib/python2.7/site-packages/keystoneへのシンボリックリンクを張ればちゃんとimportできる.ただしライブラリをインストールするたびに作業が発生するので面倒だし,大量のライブラリに依存するパッケージがあったらかなり手間がかかる.

そこでpyenv-virtualenvに着目する.virtualenvは本来特定のディレクトリ以下にpythonのライブラリを閉じ込めるもので,site-packagesの位置をコントロールすることでライブラリの名前空間を切り替えている.普通はshellのsourceコマンドなどでactivateするが,もちろんpythonのプログラム中からvirtualenvをactivateする方法はあって,bin/activate_this.pyを実行すればよい. これでida用のvirtualenvを切って,そこに必要なライブラリを入れていけば普段の環境は汚さずに済むしちゃんとpipでインストールできるので解決する. あとはこれをidaの起動時に実行されているようにしなければならないが,python以下を眺めていたらinit.pyというファイルを見つけた.このファイルの最後の方に

# Load the users personal init file
userrc = os.path.join(ida_diskio.get_user_idadir(), "idapythonrc.py")
if os.path.exists(userrc):
    ida_idaapi.IDAPython_ExecScript(userrc, globals())

こんなコードがあって,いろいろ調べるとどうやら起動時に$HOME/.idapro/idapythonrc.pyを実行してくれることがわかった.あとはこのファイルの中にpyenv-virtualenvの適当な環境をactivateするコードを書けばよい.

activate_this = '/Users/icchy/.pyenv/versions/2.7.14/envs/ida/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

これでpyenvのidaという名前の環境がIDA Pythonに適用され,無事にkeypatchを導入することができた. ただし一つだけ注意しておく必要があるのはIDA Pythonの実行バイナリが変わっていないため,実行されるpythonのバージョンが必ずしもライブラリの導入環境と一致するわけではないということ.もちろんpyenv側でsystemと同じものを用意して,その下にvirtualenvを切ればよい話なんだけどまあ2.7系だし多分大丈夫でしょう.みたいな気持ち.

idasecを導入する

あとntddkのブログにidasecの7.0用パッチを書いた話をたまたま見かけて,貼られていた動画が面白そうだったので導入することにした.

これもハマりまくって結構時間を溶かしたんだけど,細かく書くのが面倒になってきたので要点だけ述べると,

  • binsecを動かすのに結構ライブラリが必要なのでntddk/binsec-vagrantを丸パクリしてbinsec-dockerを書いた
  • PyQt5の導入をするときにbrewでやるとpython3用が入ってIDAから使えなくなるのでbrew install pyqt5 --without-python3でやるとうまくいく
  • idasecのディレクトリでmakeを叩くのを忘れない (UIが生成されない)
  • pip install protobuf pyzmq capstone graphviz pyparsing enum path.py plotly
  • idasecはライブラリになっていないのでIDAのpython以下にidasecを配置しておく

ちなみに適当なバイナリでidasec試したんだけど,pythonが途中でUnicodeEncodeError吐いてIDAがハングアップした.pythonはカス

ICPC 国内予選 2017

今年もICPC国内予選に参加していました.
ブログには2014年の以外一切書いてませんでしたが一応ずっとnocowで出ていて,2013と合わせるとnocowのメンバーは全員5回目ということで最後の参加になります.

詳しいことはosrehunが書いてくれたのですが, osrehun.hatenadiary.jp 一応最後なので参加記を残しておきます.

メンバーは3年前から同じ

  • hec (@osrehun)
  • nokoTaro (@xthexworldx)
  • icchy (@icchyr)

で,上2人がコーダー,僕は環境構築担当です.

~15:00

練習セッションの存在を完全に忘れていて,僕だけリモート参加

f:id:icchyr:20170715094635p:plain

L問題が残っていたので先にそっちだけやった

M問題は例年通りだと,1回目は何回か試せば通って2回目でほぼ確実に落ちるようになっていたと記憶しているが,今年は1回目が100ケースくらいあって,そもそも手動だとキツイみたいな感じだった.
あと順位表をみると数十回WAしてACしたチームとかがちらほらいたので,Data1が通せればそのままData2も通せるんじゃないかと思った.適当に100通り全探索するスクリプトを書こうと思ったけど,これはCTFではないしサーバーに負荷をかけるのが躊躇われたのでやめた.

15:00~16:00

会場入りして,諸々の準備をした.
チームで使う環境を一新したのでプリンタの設定に手こずった.プリンタの型番と同じドライバが存在しなかったが,適当に似た番号にしたら行けるということをhecが覚えていたのでプリンタ設定AC.

16:00~16:30

僕が急に「やっぱり印刷投げるのいい感じに自動化したい」と言い出す(は?)

  • lprコマンドでhtmlを印刷 → キレイなhtmlソースが出てくる(それはそう)
  • Javascriptwindow.printで印刷ダイアログを自動で出していく(別チームのメンバーが考案) → クリックが面倒なのでダメ

結局htmlを印刷するにはWebブラウザによるレンダリングが必要なので,ブラウザ無しではできない
→ Headless Chrome使えばいいんじゃね?

Chromeにはバージョン59からヘッドレスモードというのが加わって,これがPhatomJSにトドメを刺した.
ざっくり言うとGUIのウィンドウを作らずにブラウザを立ち上げる機能で,パフォーマンス良くブラウジングを自動化できる.最近ではGoogle CTFのXSS問題とかで使われたりした.

コマンドで書くと

~$ google-chrome --headless --disable-gpu [OPTIONS] [URL]

が基本で,簡単な操作についてはそもそもオプションで使えたりする.

developers.google.com

今回は--print-to-pdfを使ってPDFを生成し,それを印刷する感じにした.

ちなみにICPCの国内予選は提出したり順位表を見るのにはログインが必要だが,問題を見ること自体は認証無しで可能(これは練習セッションで確認済み)だった. このおかげでログイン処理を書く必要が無く,URLをそのまま直に叩けば問題ページが降ってきた.

~$ for d in {A..H}
> do
> google-chrome --headless --disable-gpu --print-to-pdf http://********/${d}_ja.html
> lpr output.pdf
> done

という感じにするとA~H問題までの問題が印刷される.今回はうちの大学から3チーム出ていたので,lpr output.pdfだけfor文で回した.

↑のコマンドを書いてメモったのが開始5分前で,提案しつつ「事故っても責任は持てないよ」と逃げ道を作っておく.🚩

16:30~17:00

競技開始.
まず問題文を印刷するコマンドを打つ.

プリンタの側で待機している問題文配布担当から出されるNG🙅.

Not Found

The requested URL /********/_ja.html was not found on this server.


Apache/2.4.7 (Ubuntu) Server at icpc.yamagula.ic.i.u-tokyo.ac.jp Port 80

こうして僕たちの最後のICPCは幕を閉じた.
(完)






















フラグ🚩回収に成功したとこで気を取り直して再度コマンドを打つ.今度は大丈夫そう.

僕がやらかしてる間にhecがターミナルの後ろにあるブラウザの画面からA問題を読み取っていて,とりあえずテンプレート等を打ってすぐ交代する.

ちょっとデバッグに手こずって開始10分後くらいでAC.大学内で一番遅かったらしい.
nokoTaroがBを詰め終わっていたのでコーディング交代.hecがCを読み終わって解法を詰めているところなので僕はDを読む.
一瞬で読み終わったのでEをちら見する.これも一瞬で読み終わる.
hecにDの概要を伝えたらO(1)で解法が降ってきた.Bのサンプルが合わなくて紙デバッグに移る.同時にhecがCの実装を開始.

Bのデバッグがすぐ終わったのでCをコーディングしてる途中で交代して修正してAC.
そのあとhecがCを通してそのままDの実装に移る.この時点で30分くらいだったと思う.

17:00~17:30

Eが読み終わってるので僕はFを読む.これも一瞬で読み終わるが,頭が弱いので折りたたみの様子を完全にイメージできず,メモ用の紙を使って小道具を作った.

これが後に大きく活躍したらしい.

nokoTaroがGの方針が思い浮かばないとのことなので,一旦Fを一緒に考えてもらう.
途中でDのデバッグ作業に呼ばれてsegvの箇所を特定するなどした.間もなくしてDが通る.

17:30~18:00

Eの概要をhecに伝えたがちょっと方針に確信が持てないのでFを手伝ってもらう.
3人でウンウン唸った後hecがよくわからない方法で通してた.

18:00~19:00

hecと適当に相談して,制約を見るとどうやらevaluatorを作ってぶん回せば行けそう(雑)ということがわかったのでそのままコーディングしてもらう.
nokoTaroがやはりGの方針が浮かばないとのことなので問題を見る.探索する近傍に優先順位をつけて反時計周りに辿れば良さそうということに気づくが,G問題ということもあり流石にそれはないでしょwみたいなやり取りを数回繰り返す.
途中でHを見て,幾何だけどなんとなく行けそうな匂いがしてしまう.しかし過去の経験上,幾何に手を付けて時間を溶かしてオワリみたいな展開が幾度となくあったのでGに戻る.
やはり先ほどの解法で反例が見つからないので強く主張する.悩んだ結果とりあえずコーディングだけしてみよう,ということに.
Eのバグ取りに手こずっていたようなので,一旦交代してnokoTaroにコーディングしてもらう.適当にバグを取ってサンプルも通ったのでsubmitする.WA.
Eの実装に戻ってもらいつつ,Gのテストケースを軽く印刷してもらう.18:30くらいに反例が見つかった.ここで右手法を使えば良いということに気づいて,nokoTaroに解法を伝える.

Eのバグが取れてサンプルも通ったとのことなので,Data1を処理している間にGのコーディングをしてもらう.いくつかバグを踏みつつ,EのData1の処理が終わったので提出.Correctで盛り上がる.
そのままGのコーディングを続けてもらい,バグが取れたところでEのData2の処理が終わる.提出してAC.6完で勝ちを確信する.

19:00~19:30

まあ解法雑だし最悪通らなくてもいいや…という気持ちでGを投げてもらう.AC.7完でかなり盛り上がる.

順位表を確認すると東大に挟まれていて笑う.その時点では4位だったのでshuriken通してくれ〜みたいな謎の祈りをしながら一応Hを見る.
完全に解法は詰めきれていなかったが,とりあえず幾何ライブラリを写経していた.
Hを考える気力が残っていなかったのであとは適当に順位表を眺めていたら,shurikenがGを通して4位になったので√29を確信する.

競技終了.7完5位という過去最高の結果だった.hecは神.僕はカス.

その後は会場の撤収作業を済ませ,適当に酒を飲むなどした.

おわりに

今回はそこそこ役に立てたので良かった.

Headless Chromeを使うと問題文印刷がかなり楽になるので来年度以降是非活用して下さい.typoをすると404 Not Foundなページが30枚近く出てくることになるので気をつけましょう.

UnicornでWindowsAPIトレーサーみたいなものを作った

とは言っても技術的に何か特殊なことをしているとかいうわけではなくて,単純にPEローダーを頑張って実装したみたいな話.

作ったもの github.com

Unicorn

QEMUのラッパみたいなもので,CPUエミュレータフレームワークとして手軽に扱えるUnicornというライブラリがある.
つい先月v1.0がリリースされて,Go, Python, .NET, Javaの他にMSVC, VB6, Ruby, Haskellバインディングが追加された.

www.unicorn-engine.org

他に特筆すべき点としては,GDTR, IDTR, LDTRあたりのサポートが追加されて適切にセグメントレジスタを設定できるようになった(!)ことや,コンテキスト周りのサポートが入ったことが挙げられる.前者の方が結構重要で,WindowsではFSレジスタがTIBのアドレスを指しているのでマルウェアだとよく使われたりする.

PyAnaとDutas

UnicornでPEエミュレータってあるんじゃね?と思って探したら,案の定あった.

github.com

github.com

どちらもメインの機能としてWindowsAPIのトレーサーがついていて,サンプルコードを実行すると胡散臭い命令がジャンジャン呼ばれている様子を観測できる.

しかしこれらはUnicorn v0.9での動作を前提に作られていて,セグメント周りのサポートが入っていなかったためFSレジスタにメモリのアドレスを直接書き込むという荒業を使っている.

        mu.reg_write(UC_X86_REG_FS, TIB)

これをv1.0で動かすと当然クラッシュする.

また,どちらもLDR周りの整備を無理矢理やっていて,例えば別のdllを追加するのに結構労力を割かれたりする.解析する検体側でLoadLibraryが呼ばれてたりするとメモリにマッピングしてくれるのだけれど,PEが事前に別のdllを必要としていると全く動かない.

WindowsAPIフック

このように制約条件はありながらも,WindowsAPIフック機能はかなり良い感じに動作する.どうやってAPIフックを実現しているかというと,

  1. DLLに含まれる関数の先頭を\xc3 (ret) に書き換える
  2. 当該関数の先頭アドレスをフック対象に追加
  3. 関数が呼ばれるとUnicorn上で代わりにその処理を行い,スタックや戻り値などの辻褄を合わせる

という非常にシンプルなものである.
フック対象を管理しているリスト (実際はdict) では関数の先頭アドレスとWindowsAPIの名前をペアとして持っておく.代理で呼ぶ関数には予めhook_というprefixをつけておき,globals()から取得してeip, esp, uc (Unicornインスタンス)を渡して呼び出す.例えばエミュレータ上でGetProcAddressが呼ばれるとhook_GetProcAddress(eip, esp, uc)が実行される,という具合.
hook_*という関数が大量に実装されているが,もちろんされてないもののほうが多い.最初はPyAnaないしDutasにちまちまとフック関数を実装して頑張っていたのだが,結構な数になってくると見通しが悪い.あとlstrcatみたいな絶対に動作が変わらないものの処理が検体毎に複製されていくのがなんだか気持ち悪いので,ライブラリ化しておきたいという気持ちになった.

pefile

PyAnaもDutasもDLLがエクスポートした関数を列挙するのにpefileというライブラリを使っている.

github.com

これはPythonでPEを扱うなら鉄板ライブラリといえるほど動作が安定していて,実績も多い.例えばangrはPEを解析するときに内部でpefileを使っている.

しかしこのライブラリ,非常に遅い.kernel32.dll (約1.1MB) を読み込むのに6秒くらいかかる.DLL一つだけならまだ良いが,3個以上のDLLを予め読み込んだり,LoadLibraryが途中で呼ばれて追加のDLLが読み込まれたりすると,正直待ってられない.DLLが足りなくて途中で落ちたらまた20秒くらい待たされることになる. と思っていたのだが,単純にpipで入るバージョンがクソ古いだけだった.githubから最新版を落としてくるともうちょっと早く動く.それでも2秒くらいはかかる.

PythonでPEパーサーといえばもう一つ,pype32というライブラリがある.readpe.pyが有名.前は普通にサクサク使えてた印象があったのだけど,いつの間にか遅くなっていた.というかパースが終わらない.バグか?これも勘違い.正しくは exeのパースは早いがdllはクソ遅い だった.kernel32.dllで試したのだけれど,2分48秒かかった. 測り直したら1分5秒でした.論外.

PEパーサー

pefileもpype32もまともに使えない(pefileはまあ使える)ことがわかったので,自分で実装することにした.参考にしたサイトを貼っておく.

PE(Portable Executable)ファイルフォーマットの概要

Portable Executable カテゴリーの記事一覧 - 鷲ノ巣

DOSヘッダからセクションヘッダまでなら前者,IMAGE_DATA_DIRECTORY以降の話なら後者がわかりやすい.
これらを参考にしつつ,MSDNのサイトPeering Inside the PE: A Tour of the Win32 Portable Executable File Formatを見ながらctypesでごりごりとパーサーを書いた.

今回必要な機能は

  • EXEがインポートしているDLL, 関数名/RVA列挙
  • DLLがエクスポートしている関数名/RVA列挙
  • PEがメモリ上へ展開された後のイメージ
  • PEの各種情報 (ImageBase, EntryPointなど)

で,IMAGE_DIRECTORYのうちサポートするインポートはIMAGE_DIRECTORY_ENTRY_IMPORTのみ.
この位まで機能を絞ると案外実装しやすくて,速度も出た.

github.com

A Tour of the Win32 Portable Executable File Formatとあるように,32bitまでしか対応してないので現状64bitは未対応.気が向いたらやる.

TIB周り

WindowsのプロセスにはTIB (Thread Information Block) というのがあって,プロセス・スレッド自身の情報を保持している.プロセス起動時にFSレジスタがこの構造体の先頭アドレスを指すようになっており,これを辿ることで各情報にアクセスできる.
特に対解析機能として難読化をかけてるコードやパッキングしているようなコードは,元のバイナリが使用しているWindowsAPIのアドレスを動的に解決する必要があるため,PEBのLDRからモジュールのリストを辿ってLoadLibrary,GetProcAddress (kernel32.dll) のアドレスを取得し,そこから必要な関数をもってくる,といったことをよくする.

そのためTIB周りをちゃんとセットアップしてやらないと動かない検体が結構あって,実装することにした.PyAnaもDutasも見かけ上はLDRまでやってるけど,オフセットも決め打ちで,用意するLDRのリンクも真面目に繋いでないので,ちょっと別経路を辿ると動かなかったりする.具体的に言うと,ロードされたモジュールはLoadOrder, MemOrder, InitOrderの3種類の順番で辿ることができるが,LoadOrderの部分しか繋いでないとMemOrderを辿る検体が動かない,という具合.LDR_MODULEについては Understanding the PEB_LDR_DATA Structure がわかりやすい.
ちなみにTIB周りの構造体は Welcome to WinAppDbg 1.5! — WinAppDbg 1.5 documentation を拝借して流用している.素のままだとUnix環境で動かないので適当に手を加えた.

セグメントレジスタ周り

UnicornはあくまでもCPUエミュレータなので,アーキテクチャの設計に対して忠実に処理を書かなければならない.最初ここを理解してなくて,FSレジスタを設定するだけでsegv起こしたり,mapしたはずのスタック領域がunmapped扱いになったりした.
ざっくり説明すると,セグメントレジスタを設定するときはGDT (Global Discriptor Table) をあらかじめ設定しておく必要があって,その中のインデックス番号,メモリ上の範囲,各種フラグを含んだ値 (selectorという) をセグメントレジスタに書き込む.selectorを書き込む段階でGDTのセットアップが終わってないとsegvする.
GDTについては Global Descriptor Table - OSDev Wikiプロテクトモードのセグメント機構 を参照した.

他にハマりどころとして,Windows (x86環境) ではGS, ES, DS, SSが全て同じ値 0x002B (index:5, range:0x00000000-0xffffffff, flags: gr=1, sz=1, pr=1, privl=3, ex=0, dc=0, rw=1, ac=1, rpl=3) に設定されているのだけれど,Unicornではこの値だとスタックがうまく扱えなくて,正しくはSSに設定するフラグを gr=1, sz=1, pr=1, privl=0, ex=0, dc=1, rw=1, ac=1, rpl=0 にしてあげる必要がある.違いはgdt entryの特権レベルとselectorの要求特権レベルが0 (kernel) になっているのと,dc (Direction bit/Conforming bit) が1 (segment grows down) になっている点.dc bitは全然気づかなかった.
セグメント周りの設定はこのへんでやってる.indexが露骨に調整してあるのはWindowsをマネしたため.

フック

フックの仕組みはPyAnaやDutasと同じく,関数の先頭をretに書き換えてUnicorn側で代わりの処理を呼ぶ.トレーサーとフック処理の接点をUnitracerインスタンスだけに抑えるため,hookを呼ぶ時にselfを渡すというちょっと変なことをやっている.WindowsAPIが行う処理はアーキテクチャに依らず同じ結果を返してほしいので,フック処理ではなるべくUnicornの都合を意識しなくて済むような設計にしたかったのだが,現状はできてない.多分呼び出し規約をWindowsクラス側で一意に扱えるようにしないと実現できない気がする.
実際にUnitracerを使うときは絶対に挙動が変わらない処理はlib/windows/hooks以下に書いておいて,挙動を変えたい時に[Unitracerインスタンス].hooksに直接関数を追加して動かすみたいな使い方を想定している.これでとりあえず当初の目的であったフック処理のライブラリ化に関しては達成できたとは思う.

現状

ここまで長々と書いてしまったけど,とりあえずAPIトレーサとしては十分動くと思う.
まだTIB周りが弱くて,サンプル (samples/Wincalc.sc) が動かない!w [17/03/11]PEパーサーのバグだった.現在は修正済み. あとフックを全然実装してないのでちょくちょく追加していく予定.

Advent Calendarに遅刻しないために

この記事はMMA Advent Calendar 2016の18日目の記事です.(遅刻回避)

僕はMMAでは無いのですが,

というわけで書きます.

皆さん,Advent Calendarって登録してても忘れますよね?

忘れない方法として,通知を行うというソリューションがありますが,どのようにしたら良いでしょうか.

結論

iCal形式でダウンロードできるので,カレンダーにインポートしましょう

これで忘れていてもカレンダーから通知が飛んできますね

今後活用していきたいと思います

f:id:icchyr:20161218235156p:plain

僕からは以上です

HITCON CTF 2016 Finals参加記

この記事はCTF Advent Calendarの4日目です.

まだ欠けているところがあるのでとりあえず速報版ということで…
12/07: 残りの写真などを貼りました.

12/2-12/3の2日間,台湾にてHITCON CTF 2016の決勝戦が開催され,TokyoWesternsとして参加してきました.
今回の遠征において起こったことを時系列順に書いていきます.

飛行機の遅延

我々は当初11:45に成田を出る飛行機に乗る予定だったのですが,前日の夜22時頃に突然メールが来て,

Flight Delay Notification

11:45発予定が19:00に変更?????
このままだと台湾につくのは22時過ぎ(現地時刻)になり,移動が極めて面倒なことになりそう,という結論に.
とりあえず問い合わせて,払い戻しが可能かどうかを聞くことにしました.(時間帯的に窓口が英語しか対応してなくて,非常にしんどかった)

どうやら払い戻しは可能っぽいので,実際に手続きをするのは翌朝に日本語の窓口が対応しているときにしよう,ということで急遽別の飛行機を予約するという話になりました (この時点で夜中の1時を過ぎており,寝落ちした→他の人より航空券が少し高くついた).

まあなんやかんやで無事に飛行機に乗れたので良しということで.

台湾着

台湾に着いて適当にSIMカードを購入したりして,ホテルまでのルートを調べました.
今回運営が用意してくれたホテルは結構良い所らしく,なんと空港からバス一本でたどり着くことができて感動しました.
ちなみにバスの券を販売しているところのPCにXPが写っていたり,発券された乗車券の時刻がクソ適当だったりといろいろ怪しい点は多かったものの,特にトラブルもなくホテルまで着き,先に来ていたhhc0nullと合流してすき家で食事を取りました.

f:id:icchyr:20161207230733j:plain:w200 f:id:icchyr:20161207230634j:plain:w300

あとLTEがクソ早くて感動した

f:id:icchyr:20161207230510p:plain

会場

今年のFinalsはHITCON Pacificと同時開催らしくて,Taipei New Horizonという所の最上階でした. f:id:icchyr:20161207230916j:plain

f:id:icchyr:20161207231020j:plain

f:id:icchyr:20161207231047j:plain

設営もめちゃくちゃ手が込んでいて,各チームのテーブルには看板が設置してありました.

f:id:icchyr:20161207231235j:plain:w300

…? 何か足りないですね…

ところでこれは某CTFの名札です

f:id:icchyr:20161207231815j:plain:w300

今年はチーム名を間違えられる呪いにでもかけられたんでしょうか.

Finals

去年に続き素晴らしい大会で,今年のA&DはPwnable3問,Web3問でした. 競技はday1 10:00 ~ 18:00, day2 8:30 ~ 15:30で,day2の12:30までは1ラウンド5min, それ以降は1ラウンド2minという設定でした. Pwnable問題は公開されてからは最後まで動いていて,Web問題は各問題が別々の時間に公開されて2つ以上の問題が同時に動くことはありませんでした.そのかわりWeb問題にはfirst bloodがあり,1500, 1000, 500, 300, 100という具合に解いた順にボーナスポイントが与えられました.

問題 時間 ジャンル 概要
digimon day1 10:00 ~ pwnable デジモンをモチーフにしたゲーム.ショップの番号に制限が無くて任意メモリの書き換えが可能(らしい)
rabbit day1 10:00 ~ 14:00 web zabbixが動いている./jsrpc.phpSQL injectionの脆弱性があり,Adminのセッションを奪うことができる.Adminはzabbixの機能でスクリプト実行が可能なのでflagを読む.
criticalheap_revenge day1 14:00(?) ~ pwnable よく読んでないけどFSBがあったらしい
webrop day1 14:00 ~ day2 12:30 web SugarCRMとphpMyAdminが置いてあるだけ.詳しくは後述します.
fx-1337 day2 9:30 ~ pwnable 電卓を模したアプリケーション.BackSpaceの回数に制限が無くて任意のアドレスにジャンプすることのできる脆弱性があった(らしい)
myide day2 12:30 ~ web flask製のテキスト共有システム.詳しくは後述.

僕がメインで取り組んでいたのはWebの3問で,前半2問(rabbit, webrop)はいずれも実際に使われているソフトウェアを用いており,オイオイ0dayゲーか〜???と思いましたが,3問目はお手製のflaskアプリでした. 実際にはrabbit, webropはCVEの付いている脆弱性を抱えており,それを用いて攻撃が可能,というものでした.

webrop

phpMyAdminとSugarCRMが置かれているが,phpMyAdminの指しているホストが126.0.0.1と128.0.0.1のみ選べるため,全く意味ない.ように見える.SugarCRMは普通の設定で,適当なユーザーでのログインはできる状態. この問題は1日目は全く動きが見られず,2日目に持ち越されたため結局first bloodは無効になりました. 我々のチームではytokuさんが一日目の夜に0dayの脆弱性を発見し,それを用いてexploitを作成していったところうまく刺さりました(もちろん数チームには途中から対策されました). 他にも0dayを見つけたチームがいて,CTFerの恐ろしさを見せつけられました. ちなみに競技終了後に運営に想定解を聞いたのですが,phpMyAdmin脆弱性によってセッションの上書きが可能であり,それを用いてSugarCRMで権限昇格を行う,というものだったそうです.PPPはこの方法で攻撃したそうです. 途中までは全部のチームからflagを取れていたのですが,PPPはログインをできなくしたせいで攻撃が刺さらなくなったにも関わらずSLAはALIVEになっていて,なるほど. 去年はSLAがクソ厳しかった上に,事前のルール説明に「脆弱性部分以外のパッチで防ぐのはやめろ」みたいなことが書いてあったため,どのチームも割とパッチに苦労してたと思うのですが… 結果的には結構な点を取れたと思います.

myide

flask製のアプリケーションで,一番最初に用いられた脆弱性はpath traversalでした.普通に任意ファイルを読むことができる感じ. テンプレートエンジンにjinja2を使っていたので案の定template injectionがあり,任意コードの実行が可能でした.ただしこの問題のみ,ソースコードに対するパッチが当てられなかった(当てても再起動する手段が無かった)ため,終わりの方はDOSの打ち合いという地獄絵図が広がっていました.

結果

最終結果はCykor, LC/BC, PPP, Shellphishに続いて5位でした!!!

決勝のA&Dでは今までの中で一番良い結果を残せたと思います.

余談

終了後の会場に良い話が転がっていました.

f:id:icchyr:20161207232458j:plain

終わりに

クソ適当な記事ですみませんでした.CTF Advent Calendarにはまだまだ空きがあるので是非書きましょう.
明日はyamaguchiさんのTSGCTFwriteupです.