学祭でCTFしてみた【運営側WriteUp編】

#同時進行で【準備編】と【反省編】も書いてるんだけど、時間がかかりそうなので先に公開。

 

僕が作った問題は4つ。

  • Web HTML Basic [10pt]
  • だ~れだ?[20pt]
  • Web HTML Advanced [50pt]
  • The 404 error [75pt]

Web HTML Basic [10pt]

一番簡単に見える問題で、一番多く解かれていました。

基礎中の基礎、かつありがちな問題をミックスして出題しました。

Welcome!!!

HTML宝探し系の問題です。

Stage0

Stage0。これは、確認問題です。答えは書いてありますね。答え:Password

Stage1

Stage1。今回は書いてありませんね。でも、Stage0でPasswordと書いてあった位置が空いているのが気になりますね。ということでクリックしたままカーソルでその辺りを擦ってみます。

02

浮かび上がってきましたね。

01

ソースからも文字を背景と同じ色するよう指定されている事がわかりますね。

答え:adminadmin

Stage2

Stage2。先ほどのようにドラッグしても浮かび上がりません。

仕方がないのでソースを覗いてみます。

03

コメントアウトで表示されないようになってますね。

「パスワードは”XXSer”です。」答え:XXSer

どうしてこんなTypoしたんでしょうかね。

さて、これを送信するとflagが出てきます。

congratulations!!

The flag is “sonodam” 答え:sonodam
この問題は気が向いたら公開します。

だ~れだ?[20pt]

この問題を作るにあたって、ZIPファイルをCGIで動的に生成しようと思って色々勉強しました。ZIPファイルって意外と簡単な構造らしく、コードをガリガリを書けば中のファイルを動的に生成しZIPとしてまとめることも難しくないようなのですが、Perlのコードのほうが複雑になってしまい、サーバーへの負荷が高まったり、同時にアクセスがあった場合の対処など、余計に考えることが多くなってしまったので動的生成は断念して作りおきのファイルをダウンロードさせることにしました。

問題ページにはZIPファイルへのリンクが貼ってあり、problem.zipがダウンロードできます。

02

自分が想定した解答のプロセスは3つ有ります。

1.Linuxでコマンドを使いながら解く

とりあえずfileコマンドを使ってファイルの中身を調べてみます。

Screenshot from 2014-06-10 00^%47^%28

拡張子通り、中身がzipファイルであることがわかりましたので、解凍してみます。

Screenshot from 2014-06-10 00^%58^%38

沢山のzipファイルが出てきました。それぞれに対してfileコマンドをかけてみます。

Screenshot from 2014-06-10 01^%03^%29

ほとんどのファイルはzipではなく、022.zipがzip、036.zipがpngファイルとわかりました。036.zipの拡張子をpngに変え開いてみます。

Screenshot from 2014-06-10 01^%15^%43

「Flagは022.zipにあるよ」ですって。親切な問題ですね。022.zipを展開してみます。同様にfileコマンドで

Screenshot from 2014-06-10 01^%29^%30

沢山のjpgファイルが出てきましたが、flag (25).jpgだけテキストファイルのようなので、stringsコマンドで文字を抜き出してみます。

「VGhlIEZMQUcgaXMgWklQTUFOTk5OTk4=」

最後に=(イコール)が付いているのでBase64でしょうか?デコードしてみます。

base64

「The FLAG is ZIPMANNNNNN」

答え:ZIPMANNNNNN

 

2.目grepしてみる

flagの含まれるファイルを絞り込む段階で、バイナリエディタを使うと効率よく見当を付けられる場合があります。

zipファイルをバイナリエディタで開くと、

meg01

しばらくFFFFF・・・と続いていることがわかります。ビットイメージも

meg02

真っ黒ですね!色が変わるとこないかな~っとスクロールしていくと、

meg03

途中画像ファイルらしきものが見えてきます。その時のバイナリは、

meg04

となっていて、036.zipは、「臼NG」とか「Gimp」とかあるのでPNGファイルだというのがわかります。さらにビットイメージをスクロールしていくと、

meg05

下の方でごちゃごちゃが出てきます。バイナリは、

meg06

となっていて、022.zipが本物のzipだとわかります。

ここまで分かればバイナリを抽出するも良し、解凍ソフトを使うも良し、ということで楽に次のプロセスに進めます。

 

3.ファイルサイズの比較

この問題、Linuxやバイナリエディタがなくても、特徴を比較していけば簡単に解くことができます。

problem.zipの中身はこんな感じ。

size0

ファイルサイズ順にソートすると、

size1

2つだけサイズの違うファイルが有ります。残りは同じファイルサイズのファイルばっかりです。

面倒くさがりの作者は2つのファイルをコピーか何かで増やしたんでしょう。

036.zipが開けなくても、022.zipはまんまzipファイルなので解凍してみみると、

size2

一つだけ明らかにサイズが小さいのでおかしいのに気づくはずです。

JPEGファイルとして壊れていると表示されても、メモ帳で開けばflagの鍵になる文字列が出てきます。

 

 

※JPEGファイルをクローラに適当に集めさせたため、著作権的に公開するとヤヴァいファイルが有るかもしれませんので、problem.zipは非公開とさせていただき、勉強会などでお会いした方のみ御覧いただけるようにしようかと考えています。

 

 Web HTML Advanced [50pt]

この問題を作り始めたときは今回のCTFの基準になるぐらいの問題にしようと考えていたのですが、解いてくれた人はわずか2人と、そこまで簡単ではなかったのかもしれません。

Welcome!!!

挨拶は忘れません。

Stage1

Stage1。当然、ページ上にパスワードはありません。

001

HTMLソースにも書いてありません。

002

CSSを読みに行っても書いてありません。

そこで、HTTPボディーにはおそらく答えはないだろう、と方向転換し、HTTPヘッダーを見に行きます。

003

Passwordという項目がありますね。またBase64かよみたいな。

Password:「VEgzX0szWQ==」をデコードしてみます。

004

TH3_K3Yという文字列が出てきました。答え:TH3_K3Y

※僕の環境ではFireFoxのアドオンを使いましたが、パケットをキャプチャする方法も有ります。実際に、WireSharkを使って解いていた人がいたのでその方法も書きます。

アダプタを指定してパケットをキャプチャします。

016

ip.addr eq <ipアドレス>で絞り、「Follow TCP Stream」してみます。

017

HTTPヘッダを入手することが出来ました。

 

さて、次に進みます。

Stage2

Stage2。「パスワードを表示」という怪しいリンクが現れましたのでクリックしてみます。

006

ポップアップが出ますが一瞬で消えます。HTMLソースはこちら。

007

ポップアップのアドレスがs.htmlとなっているのでアクセスしてみます。

008

「H0KK4ID0_UNIV3RSITY」と書いてあります。答え:「H0KK4ID0_UNIV3RSITY」

この方法が一番楽なのですが、一応この文字レスを出すためのJSを難読化しているので、

009

パケットキャプチャで責めた方は難しく感じたかもしれません。最後の赤文字は気にしないでください///

Stage3

Stage3。またもや同じリンクが出てきました。

嫌な予感がしつつもクリックしてみると、

010

ポップアップキタ~w

しかも少しずつ変化してるし。ジーっと眺めてるとウインドウのタイトルが

1→2→3→1→2→3・・・と繰り返しになっていることに気づきます。

それぞれ読んでいくと、

012

「U0VGVFNFOVB」

011

「UMDlQVDA5UF」

010

「QwOVBUdz09」

とりあえずくっつけてみます。

「U0VGVFNFOVBUMDlQVDA5UFQwOVBUdz09」

これでSubmitしてみます。

013

正解じゃなさそうです。

ちなみにこの問題は、一度間違うとトップページに戻る、という糞仕様になっております。

それはさておき。

出題者の趣味を考えて、先ほどの文字列をBase64でデコードしてみます。

014

「SEFTSE9PT09PT09PT09PTw==」

これでピンと来なければ過去問演習不足ですね。例のアノ問題ですw

もう一度デコードしてみます。

015

「HASHOOOOOOOOOOOO」となりました。答え:HASHOOOOOOOOOOOO

これをSubmitすると、

congratulations!!

「The flag is “44Ki44Op44O844OI5Ye644GX44Gf44GE44Oe44Oz”」

答え:44Ki44Op44O844OI5Ye644GX44Gf44GE44Oe44Oz

(MD5を戻す必要はありません。)

 

この問題の要点は、HTTPヘッダに気づくこと、ポップアップ画面を止める方法を思いつくこと(画面のキャプチャでも何度か撮るうちに行けます。)、そしてQRコードを読み取った文字を正しくデコードできることでしたね。

 

 

The 404 error [75pt]

一番作るのに苦労した問題です。

10443073_241773166012552_6296903985306991657_o

IE、Chrome、FireFox、MacではSafariでも自然に404な画面が出ます。

IEの「詳細情報」のリンクも有効です。

021

こんな自然な404画面ですが、HTTPヘッダを見てみると、

022

やはり怪しい物が出てきます。

「Decode: aHR0cDovLzE5Mi4xNjguMTEuNzUvOTBkYjM2ZWUzNzM3NDY5YjcwMGFjYmZhZjdhNTQ4Njkv」

Base64でデコードすると、

「http://192.168.11.75/90db36ee3737469b700acbfaf7a54869/」という文字列が現れるのでアクセスしてみます。

023

どうやらファイル置き場のようです。flag.txtを開いてみると、
888862262268888
8888
88886622446262
888866442266442266
偶数しかありませんね。これでピンときた人は過去問演習大丈夫な人ですね。

テンキーです。

↑↑↑↑→↓↓→↓↓→↑↑↑↑
↑↑↑↑
↑↑↑↑→→↓↓←←→↓→↓
↑↑↑↑→→←←↓↓→→←←↓↓→→

これを一筆書きしてみると

nire

NIREになります。答え:NIRE

この問題はWebと暗号とトリビアの複合問題?な感じなので配点は高めになってますがそれぞれは難しく無いと思います。

 

実際、問題を作ってみて

非常に偏りがありますね。特にBase64。オフラインでも解ける問題、ということでMD5は使いたくなかったし、んーって感じですかね。でも、perlでHTMLのテンプレを使ってみたり、UAで読み込むテンプレートを振り分けたりと、初めてのことに挑戦できて良かったです。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

*