雑魚が勇気を出してTDUCTF2015に参加してきた話


# はじめに
* **超長文・駄文注意**
* 私@都内で勤務するインフラエンジニアです、何でもやります、光ファイバー何kmも引っ張ったりもします
    * セキュリティ系にずっと興味があって勉強し出した
    * すごい初心者、そういった意味で今回のTDUCTFは丁度よく、意を決してCTF初参加してきた
    * 今回、Windows環境の低スペマシンを持ち込んで参戦(後に後悔することになる)
* 多分この記事見てる時点でCTFのことは知ってると思うので割愛、わからないなら申し訳ないですがググって下さい
* TDUCTFは某大学の学生が主催しているCTF、初心者向けを謳っている
* そんな初心者向けのCTFに超初心者の雑魚(わたしです)が参加してきたので、恐れ多くもWriteupを書いてみます
    - Writeup書くまでがCTFだよっ！って運営様から言われたので。あと、自分の復習なども兼ねて。
    - 帰ってきて忘れない内にと、一気に書いたので、超汚いです
    - 間違っているところ、こうやったほうがスマートだよってのがあると思うので、詳しい方々、どんどん指摘してください。喜びます。
    - 解けた問題も少ないし、多分スマートな方法じゃないから、この記事は大半の人の役になんか立たないんだろうけど、1億3000万の日本国民の中で俺と同じような勉強し始めたばかりの初心者さん誰か1人にでも役に立てれば、死ぬほど嬉しい
 
# 注意点
* あまりにも問題解くのに必死で、ほとんどメモとか取ってないので、問題名や詳細については間違ってるところあると思います(あしからず
* 過去開催のWriteupとか読んでると、内容やアプローチとかは書いてるけど、具体的な方法(どんなツールをどう使って)ってのが、個人的にはいまいちわからないことが多かったので(アプローチはわかるのに具体的な方法がわからないってことは、まぁ俺が低スキルである確固たる証拠)、出来るだけ具体的な方法を書いていこうと思う
* 解けた問題と挑戦したけど解けなかった問題を書いた
    * 見出しが問題名、下にその問題の内容(大雑把にね)と俺の解き方を書く
    * 練習問題については割愛
    * ほぼ全ての問題に目を通し、軽く触ってみて、解けそうな問題のみ挑戦した
        * 「挑戦した問題」自体は下に書いた問題以外にもたくさんあるけど、Writeupとして価値のないぐらいにしか出来てなかったので割愛、ある程度成果の出た問題のみ書いた


# クロック (英字だったかも)
**内容 :** 大きな時計が写った画像が渡される。この写真が撮影された時間は何時？って問題、時間からフラグへの変換ルールがあるので、それに則る(2015.08.29 12:00 JSTに撮影されたなら、2015_08_29_12_00っていうふうに変換する)

**解き方 :**「撮影された時間は何時？」なので、真っ先に思いつくのはExifを見ること。画像を右クリックし「詳細」タブを覗いてみたところ、やはり時間が書いている。フラグに変換し、submitしてみると、間違ってるとのこと。

んー？なんでー？これしかなくね？とか思ってたら、Exifには、GPSの情報が書いていた(緯度経度)。
この緯度経度をGoogleMapにぶち込むと、位置が表示され、そこはグリニッジ天文台だった。

つまり、この写真の撮影時間はグリニッジ天文台が存在する場所においての時間ってこと。
ここで変換ルールを思い出す。変換はあくまでJST、日本時間でないといけない。
というわけでExifに書いている撮影時間をJSTに変換する。常識だけど、グリニッジ天文台は要はグリニッジ標準時間なので、日本時間はその時間の+9時間となる。
なので、Exifの撮影時間+9時間をフラグに変換しsubmit -> 正解

# Lie(嘘)
**内容 :** Webサイトを案内される。そこからフラグを見つけろって感じ。

**解き方 :**そのWebサイトには、「Are you Pro?」って書いてた(英文違ったかも。こんな感じ)。要はあなたはプロですか？と。
いいえ。Zakoです。

とりあえず、こういう問題はソースとかヘッダーとかCookie見るべきよねってことで、順番に見ていく。ソースもヘッダーも特に何もなかったんだけど、Cookieに、isPro=Falseってのがあった。(違うかもｗｗｗとにかくこんな感じだったんだ！)

恐らくこれをTrueに変えればいいんだろなって思って、FireFoxにCookieイジるアドオンをインストールし、Cookieを編集、Webサイトをリロードしたら、無事にフラグが表示された。

そのWebサイトには、画像も貼ってあって、俺は何のことかよくわからなかったんだけど、あとからスタッフさんから話を聞くにクッキーだったみたい(お菓子のクッキーね)、わからない俺は常識すらないバカものだったらしい。

# おわり
**内容 :** 画像が1枚わたされる。思いっきりフラグが書いてある画像なんだけど、一部分が暗号化されていてわからない。

**解き方 :** 見た瞬間わかった。
少し前にアーティストのセカイノオワリの深瀬さんときゃりーぱみゅぱみゅさんが破局したという報道があって、そのとき深瀬さんがTwitterに画像を投稿している。
その画像は一見意味不明な画像なんだけど、暗号化されていて、解くと破局した旨が書かれていた(詳細はググって下さい)

この報道をたまたまワイドショーで見ていたので、画像を見た瞬間すぐにわかった。(暗号についてもググればすぐにわかるので詳細は割愛します)

# プリンタを探せ(こんな感じの問題名)
**内容 :** 本CTF環境のどこかにプリンタがあって、どうもそいつにフラグが隠されているとのこと

**解き方 :** 多分、俺の解き方は正攻法ではないと思う。
別のNW問題を解いていたら、その問題で渡されたpcapファイルにippでポート631にアクセスしているトラフィックがあった。
ippでポート631?そんなんプリンタしかないやんけーって思い、そのアクセス先のIPアドレスにping打ってみたら、確かに実在していた。

んーでもプリンタっしょ？あんな受動的な機械のどこにフラグあんの？って思った。とりあえず、telnetでつなげてみたけど、何の反応もなし。ipp調べて、コマンドとか調べないとダメかな、なんかバナーとか表示させるようなもんあんのかなって思ってた。

ふと、以前読んだWriteupでdigでホスト名追いかけると、フラグが表示されるっていう問題があったことを思い出して、nslookupで逆引きしてみたら、プリンタのホスト名にフラグが書いてあった。

最初に書いた通り、俺の方法、つまり最初にプリンタのIPアドレスを知った方法は正攻法ではないんじゃないかと思う。(スタッフさんが喋ってたヒントを聞く限り)
なので、本当に運がよかった。奇跡。そして自分の職業がインフラエンジニアで良かったと心から思った問題だったｗ

# 問題名失念 「pngpong」って書いてる画像渡されるやつ
**内容 :** 画像わたされるだけ

**解き方 :** 画像だけ渡される時点で、画像解析するしかないんだろうなと思った。
とりあえずバイナリエディタに突っ込んでみる。
んーなんともないように思える。
でも何にもないわけないよなって思い、strings [画像パス]ってやってみると、flag.txtっていう文字列が表示された(stringsコマンドは対象のファイルから文字列のみを抽出してくれる便利コマンド)

おお？って思い、flag.txtっていう文字列が存在していたアドレス付近をよくよく見てみると、0x50 0x4b...っていうのを見つけた。お？これ見たことあるぞ？zipだっけ？って思いつつ、「ヘッダ 50 4b」ってググってみたら、確かにzipファイルのヘッダとのこと。
バイナリエディタで0x50 0x4bから始まる部分から、その画像ファイルのお尻までコピー -> ファイルとして抽出(使っていたのはStirling、そういった機能があるのです。右クリックですぐ使えます)
解凍したら、確かに正常なzipファイルだった。ただパスワードを求められた。
はぁ？パス？まさかそれも画像の中に書いてるのか！？って思い、またバイナリエディタを眺めだす・・・んー何もそれっぽいのがない。

画像のダウンロード元URLにブラウザから行ってみて、HTTPヘッダやソース、Cookieを眺める。
パスワードだけこっち側に書いてるんじゃね？って思ってね。
でも何もない。くっそー多分あと少しなのに！！

ん？は！まさか！はい。画像を普通に見てみると(普通ね。バイナリエディタじゃないよ。フォトビューワーね)、「pngpong」って書いてるけど、まさかこれか！？
はい、そうでした。
えぇそうです。私がバカです。
zipを解凍し、中のflag.txtを見ると、フラグが書いてた

　



***
以下、挑戦したけど解けなかった問題
***
# XSS Me
**内容 :** 「alert me」とただそれだけしか書いていない、それだけ。マジで。

**解き方 :** 最初、はぁ？って思って、Fiddlerかましたり、Wiresharkでパケット見てみたりしてたんだけど、どうにもわからん。XSSも何もインジェクションできるような場所なくね？と。

んーって思ってたら、問題が表示されているアプリケーションのメニューの中に、「developer tool」ってのを発見。
あー以前、ちょっとした興味からnode.jsをネイティブアプリっぽく見せるnode-webkit使って遊んでたとき、似たようなの使ったなーと思って、developer toolを起動。

FirefoxやChromeの開発者ツールに良く似ているので、まぁまぁわかりやすい。
でもってこのツール使って問題文のhtmlソースコードまで見えた。
ただこの時点でCTF終了目前だった。
惜しくも時間切れ。あと10分ぐらいあったら正解できたような気がする。
まぁアプローチが当たっているのかどうかもわからんのだけど・・・

あとで皆様方のWriteup読んで勉強せねば。


# 運営からフラグを盗み出せ(こんな感じの問題名)
**内容 :** pcapファイルを渡される。スタッフさん同士でのメールのやりとりをキャプチャしたファイルとのこと。

**解き方 :** とりあえずpcapファイルを眺める。
当たり前だが、smtpでメールのやりとりをしている。
恐らく、メールの本文か添付ファイルにでもフラグあるんじゃね？と思い、WireSharkのFollow TCP Stream機能を使い、そのメールのやりとりのセッションのみを抽出してよく見てみると、途中で大きな添付ファイル付きメールを送っていたので、添付ファイルと思われる部分のみ文字列コピー

その添付ファイルのメールに「content-transfer-encoding base64」が付いてたので、要はこの文字列はbase64なんだろうと思い、base64デコーダをググって探す。
見事、デコードした上にファイルとしてダウンロードできる素晴らしいWebサイト様を見つけ、そこでデコードして落としてきた。
多分zipファイルよねって思い、リネームして解凍しようとしたころ、やはり正常なzipファイルだった。(まぁファイルがわからんのだったらバイナリエディタでヘッダ調べるか、fileコマンドで調べようと思ってた)
ただし、パスワードを聞かれるorz

つっても、どうせメール本文とかに書いてるんだろ？と思い、さっきと同じようにFollow TCP Stream機能でメール本文を見てみるが・・・エンコードされてる。
何これ？メールのエンコードってiso-2022-jpだっけ？ググって調べると、確かにそう。そして見た感じ、文字コードはJISじゃね？と判断した。

でもって、さっきのbase64と同じようにデコーダを探し、デコードしてみるが・・・んーうまくいかない。
JISじゃないのかも？と、いろんな文字コードパターンやいろんなでWebサイト様のデコーダを試してみるが、やっぱりうまくいかない。

急遽、WindowsLiveMailを落としインストール、というのも、メール本文だけでなく、メール丸ごとコピペ -> .emlとして保存(中身はただのテキスト)、こいつをメーラで見てみたらいいじゃん！と思いやってみるが、これもダメ(ただ他にもエンコードされてたメールの題名などはきちんとデコードされてた)

わからん・・・なぜだ・・・恐らくここにパスワードが書いてるだろうに・・・と1時間以上この問題に費やした挙句、ダメだった。
結局解けなかった。どうやってデコードすりゃよいのかわからんかった。
あとで、詳しい方々のWriteup読んで勉強します！！

# SecureUploader
**内容 :** Webサイトを案内される。問題名の通り、jpg画像専門のアップローダらしい、XSSやディレクトリトラバーサルはないセキュアなアップローダだよ！とのこと。どこかにフラグが隠されているみたい。

**解き方 :** とりあえず、jpg画像専門のアップローダってのにすごく違和感を感じた。

試しに別問題でダウンロードしていた.exeを.jpgにリネームし、アップロードしてみたら、普通にアップロードできた。
ふむ。ファイル名でしか判断していないのかな？

アップロード後には、アップロードしたファイルをダウンロードできるURLが案内される。その機能はdownload.phpって形で提供されていた。
つまり、バックエンドはPHPで動いていると。んでもって、jpg以外もアップロードできると。

とりあえず、jpgに偽装したPHPのファイルをアップロードして、そのファイルにアクセスしてphpを実行させれば何かわかるんじゃね？っと考えた。
でもってPHPならOSコマンド(lsとかcatとか)実行できるんだし、それでサーバ内を調べあげればフラグあるんじゃね？と思った。
ここまで、CTFが開始して30分ぐらい。(割と早い段階でこの問題に取り組んでた)

ここで大問題
俺PHPわかんねぇ！！！！正確に言うと、大学時代ちょっと触ったことあるから、全く何も知らんってわけじゃないど、全然わからん。
とりあえずPHP実行できるか、OSコマンド実行できるかどうかの最小コード書いて、アップしようと思ったが、まぁまだ時間たくさんあるし、とりあえず後まわしにすっか。時間出来たときにPHPの書き方ググろう。と。
そしたら、すっかり忘れてタイムアップorz

CTF終了後に解答者さんとスタッフさんから聞くところによれば、俺のアプローチは正解だったみたい。
くっそー悔しい。30分使ってでも、あのときPHPの最小コード調べて試してみりゃよかった・・・


# 全体を通してみて
* CTF初挑戦だったけど、**超楽しかった！！！**
* 正直行って、当日になるまで「やっぱ行くのやめよっかな・・・恥かきそう・・・」って思ってた
    * でも勇気出して参加してみてよかった、本当によかった
* 自分が如何に低スキルか思い知れた
    * 自分に何が足りないのか、何の部分を勉強しなくちゃいけないのか、よくわかった
        * 今回はバイナリ系や暗号系はほぼ手つけなかった。お？いけるかも？って思ったのは何問かあったんだけど、とりあえずわかるところからやっていこう、っていうスタンスだったので、後まわしにした(もちろん時間なんて余ってないからそのまま挑戦せず終了)

# あとがき
* 超絶駄文でごめんなさい。時間ができ次第、綺麗にします。とにかくはやくWriteup書いちゃおうと思ったんです。ごめんなさい。
* 動画の問題は・・・見逃した・・・本当にアホ、マジで俺のバカ・・・
* 事前の連絡でWindows環境を想定って聞いてたので、Linux系のバイナリ問題とかは出ないのかなって思ってた、うん俺がバカ
    * Linux/Unix系のほうが便利コマンド多いし、あったほうが明らかによかった、次回は用意していく、つーかそもそもLinuxのほうが得意だし
* 次回も絶対参加します、いや参加させて下さい
    * もっともっと勉強するぞ！！！