#同時進行で【準備編】と【反省編】も書いてるんだけど、時間がかかりそうなので先に公開。
僕が作った問題は4つ。
- Web HTML Basic [10pt]
- だ~れだ?[20pt]
- Web HTML Advanced [50pt]
- The 404 error [75pt]
Web HTML Basic [10pt]
一番簡単に見える問題で、一番多く解かれていました。
基礎中の基礎、かつありがちな問題をミックスして出題しました。
HTML宝探し系の問題です。
Stage0。これは、確認問題です。答えは書いてありますね。答え:Password
Stage1。今回は書いてありませんね。でも、Stage0でPasswordと書いてあった位置が空いているのが気になりますね。ということでクリックしたままカーソルでその辺りを擦ってみます。
浮かび上がってきましたね。
ソースからも文字を背景と同じ色するよう指定されている事がわかりますね。
答え:adminadmin
Stage2。先ほどのようにドラッグしても浮かび上がりません。
仕方がないのでソースを覗いてみます。
コメントアウトで表示されないようになってますね。
「パスワードは”XXSer”です。」答え:XXSer
どうしてこんなTypoしたんでしょうかね。
さて、これを送信するとflagが出てきます。
The flag is “sonodam” 答え:sonodam
この問題は気が向いたら公開します。
だ~れだ?[20pt]
この問題を作るにあたって、ZIPファイルをCGIで動的に生成しようと思って色々勉強しました。ZIPファイルって意外と簡単な構造らしく、コードをガリガリを書けば中のファイルを動的に生成しZIPとしてまとめることも難しくないようなのですが、Perlのコードのほうが複雑になってしまい、サーバーへの負荷が高まったり、同時にアクセスがあった場合の対処など、余計に考えることが多くなってしまったので動的生成は断念して作りおきのファイルをダウンロードさせることにしました。
問題ページにはZIPファイルへのリンクが貼ってあり、problem.zipがダウンロードできます。
自分が想定した解答のプロセスは3つ有ります。
1.Linuxでコマンドを使いながら解く
とりあえずfileコマンドを使ってファイルの中身を調べてみます。
拡張子通り、中身がzipファイルであることがわかりましたので、解凍してみます。
沢山のzipファイルが出てきました。それぞれに対してfileコマンドをかけてみます。
ほとんどのファイルはzipではなく、022.zipがzip、036.zipがpngファイルとわかりました。036.zipの拡張子をpngに変え開いてみます。
「Flagは022.zipにあるよ」ですって。親切な問題ですね。022.zipを展開してみます。同様にfileコマンドで
沢山のjpgファイルが出てきましたが、flag (25).jpgだけテキストファイルのようなので、stringsコマンドで文字を抜き出してみます。
「VGhlIEZMQUcgaXMgWklQTUFOTk5OTk4=」
最後に=(イコール)が付いているのでBase64でしょうか?デコードしてみます。
「The FLAG is ZIPMANNNNNN」
答え:ZIPMANNNNNN
2.目grepしてみる
flagの含まれるファイルを絞り込む段階で、バイナリエディタを使うと効率よく見当を付けられる場合があります。
zipファイルをバイナリエディタで開くと、
しばらくFFFFF・・・と続いていることがわかります。ビットイメージも
真っ黒ですね!色が変わるとこないかな~っとスクロールしていくと、
途中画像ファイルらしきものが見えてきます。その時のバイナリは、
となっていて、036.zipは、「臼NG」とか「Gimp」とかあるのでPNGファイルだというのがわかります。さらにビットイメージをスクロールしていくと、
下の方でごちゃごちゃが出てきます。バイナリは、
となっていて、022.zipが本物のzipだとわかります。
ここまで分かればバイナリを抽出するも良し、解凍ソフトを使うも良し、ということで楽に次のプロセスに進めます。
3.ファイルサイズの比較
この問題、Linuxやバイナリエディタがなくても、特徴を比較していけば簡単に解くことができます。
problem.zipの中身はこんな感じ。
ファイルサイズ順にソートすると、
2つだけサイズの違うファイルが有ります。残りは同じファイルサイズのファイルばっかりです。
面倒くさがりの作者は2つのファイルをコピーか何かで増やしたんでしょう。
036.zipが開けなくても、022.zipはまんまzipファイルなので解凍してみみると、
一つだけ明らかにサイズが小さいのでおかしいのに気づくはずです。
JPEGファイルとして壊れていると表示されても、メモ帳で開けばflagの鍵になる文字列が出てきます。
※JPEGファイルをクローラに適当に集めさせたため、著作権的に公開するとヤヴァいファイルが有るかもしれませんので、problem.zipは非公開とさせていただき、勉強会などでお会いした方のみ御覧いただけるようにしようかと考えています。
Web HTML Advanced [50pt]
この問題を作り始めたときは今回のCTFの基準になるぐらいの問題にしようと考えていたのですが、解いてくれた人はわずか2人と、そこまで簡単ではなかったのかもしれません。
挨拶は忘れません。
Stage1。当然、ページ上にパスワードはありません。
HTMLソースにも書いてありません。
CSSを読みに行っても書いてありません。
そこで、HTTPボディーにはおそらく答えはないだろう、と方向転換し、HTTPヘッダーを見に行きます。
Passwordという項目がありますね。またBase64かよみたいな。
Password:「VEgzX0szWQ==」をデコードしてみます。
TH3_K3Yという文字列が出てきました。答え:TH3_K3Y
※僕の環境ではFireFoxのアドオンを使いましたが、パケットをキャプチャする方法も有ります。実際に、WireSharkを使って解いていた人がいたのでその方法も書きます。
アダプタを指定してパケットをキャプチャします。
ip.addr eq <ipアドレス>で絞り、「Follow TCP Stream」してみます。
HTTPヘッダを入手することが出来ました。
さて、次に進みます。
Stage2。「パスワードを表示」という怪しいリンクが現れましたのでクリックしてみます。
ポップアップが出ますが一瞬で消えます。HTMLソースはこちら。
ポップアップのアドレスがs.htmlとなっているのでアクセスしてみます。
「H0KK4ID0_UNIV3RSITY」と書いてあります。答え:「H0KK4ID0_UNIV3RSITY」
この方法が一番楽なのですが、一応この文字レスを出すためのJSを難読化しているので、
パケットキャプチャで責めた方は難しく感じたかもしれません。最後の赤文字は気にしないでください///
Stage3。またもや同じリンクが出てきました。
嫌な予感がしつつもクリックしてみると、
ポップアップキタ~w
しかも少しずつ変化してるし。ジーっと眺めてるとウインドウのタイトルが
1→2→3→1→2→3・・・と繰り返しになっていることに気づきます。
それぞれ読んでいくと、
「U0VGVFNFOVB」
「UMDlQVDA5UF」
「QwOVBUdz09」
とりあえずくっつけてみます。
「U0VGVFNFOVBUMDlQVDA5UFQwOVBUdz09」
これでSubmitしてみます。
正解じゃなさそうです。
ちなみにこの問題は、一度間違うとトップページに戻る、という糞仕様になっております。
それはさておき。
出題者の趣味を考えて、先ほどの文字列をBase64でデコードしてみます。
「SEFTSE9PT09PT09PT09PTw==」
これでピンと来なければ過去問演習不足ですね。例のアノ問題ですw
もう一度デコードしてみます。
「HASHOOOOOOOOOOOO」となりました。答え:HASHOOOOOOOOOOOO
これをSubmitすると、
「The flag is “44Ki44Op44O844OI5Ye644GX44Gf44GE44Oe44Oz”」
答え:44Ki44Op44O844OI5Ye644GX44Gf44GE44Oe44Oz
(MD5を戻す必要はありません。)
この問題の要点は、HTTPヘッダに気づくこと、ポップアップ画面を止める方法を思いつくこと(画面のキャプチャでも何度か撮るうちに行けます。)、そしてQRコードを読み取った文字を正しくデコードできることでしたね。
The 404 error [75pt]
一番作るのに苦労した問題です。
IE、Chrome、FireFox、MacではSafariでも自然に404な画面が出ます。
IEの「詳細情報」のリンクも有効です。
こんな自然な404画面ですが、HTTPヘッダを見てみると、
やはり怪しい物が出てきます。
「Decode: aHR0cDovLzE5Mi4xNjguMTEuNzUvOTBkYjM2ZWUzNzM3NDY5YjcwMGFjYmZhZjdhNTQ4Njkv」
Base64でデコードすると、
「http://192.168.11.75/90db36ee3737469b700acbfaf7a54869/」という文字列が現れるのでアクセスしてみます。
どうやらファイル置き場のようです。flag.txtを開いてみると、
888862262268888
8888
88886622446262
888866442266442266
偶数しかありませんね。これでピンときた人は過去問演習大丈夫な人ですね。
テンキーです。
↑↑↑↑→↓↓→↓↓→↑↑↑↑
↑↑↑↑
↑↑↑↑→→↓↓←←→↓→↓
↑↑↑↑→→←←↓↓→→←←↓↓→→
これを一筆書きしてみると
NIREになります。答え:NIRE
この問題はWebと暗号とトリビアの複合問題?な感じなので配点は高めになってますがそれぞれは難しく無いと思います。
実際、問題を作ってみて
非常に偏りがありますね。特にBase64。オフラインでも解ける問題、ということでMD5は使いたくなかったし、んーって感じですかね。でも、perlでHTMLのテンプレを使ってみたり、UAで読み込むテンプレートを振り分けたりと、初めてのことに挑戦できて良かったです。