(この記事は2013/03/01に記述されたものです。
終わってからかなり経ってるので、ネタ的には古めです。。)

はじめまして、@ren_hxです。Gehirnではセキュリティ技術者という肩書きになっております。

GehirnNewsというTechBlogのようなものが始まるとのことで、記事を投稿することになりました。

よろしくお願いします。

先日、nullconというセキュリティカンファレンスがインドで開催され、そのイベントの一環で「Nullcon Battle Under Ground」というCTFも開催されていました。全体の内容としては、自分のようなCTF初心者でも楽しめるようなやさしめの問題も多く用意されており、またプログラミングの問題も含まれているので、セキュリティ以外の分野の人でも楽しめるようになっていたのではないかとおもいます。

今回は途中で離脱してしまったために、簡単そうな数問しか挑戦できなかったのですが、せっかくなので参戦ログを残しておきたいと思います。


【☓】 Programming Question 5

問題:指定されたサーバへ接続し、bulls & cowsというゲームを100回クリアせよ

どうやらこのゲームのソルバを書けば良いプログラミングの問題のようです。

ググったら過去にpythonで書かれたソルバを発見。 => http://pastebin.com/ndDYjYe1

ゲームのルールを調べるのが面倒くさそうだったので後回しにしました

=> 途中離脱のため挑戦できず


【◯】 Exploitation Question 3

問題:Lets do some PHP

スクリーンショット 2013-03-02 13.18.03

パスワードと送信ボタンしかないページが開かれます。

各種Web系の脆弱性テストしてみるものの挙動に変化なし。

問題ページに戻ってソースをみてみると、PHPのソースコードへのリンクを発見。

パスワード判定が以下のようなロジックとなっていました。

if(“0” == substr(md5($pass),0,10)) {

PHPは弱い動的型付け言語のため、==を使ってチェックした場合には”0″と”000″は同一と判定されます。

スクリーンショット 2013-04-02 14.26.04

そのためmd5ハッシュ値の先頭10字がPHP的に0と解釈される値を見つければ認証を突破出来ます。

ソルバは以下

https://gist.github.com/anonymous/5284028

最初は判定箇所を0が10個続くもの/^0{10}/を探索しようとしましたが、計算量的に見つけるのは困難です。

途中から浮動小数点/^0e\d{8}/を探索すれば組み合わせが増えて探索難易度が下がると気付き、コードを上記のように書き換えました。

実行結果は以下のようになります。

スクリーンショット 2013-03-02 13.30.30

この値をpasswordとして送信したらflagが得られました。

参考サイト:「PHP、文字列比較で「==」は禁止!(2007/10/06)」


【◯】Misc Question 1

問題:Who wrote the private key on whiteboard just by looking at the public certificate?

問題文を元にググるとそれっぽい文章を見つかります。

https://plus.google.com/118187272963262049674/posts/TSDhe5CvaFe

そこに書かれている人名を送信することでflagが得られました。


【☓】Misc Question 3

ファイルm2.gzが与えられ、keyを探す問題。

展開してみると.binファイルが得られます。バイナリエディタで開いてみると、雰囲気がキャプチャデータっぽいです。

使用されているプロトコルから、どうやらVoIPで会話してるところのキャプチャっぽいと推測しました。

スクリーンショット 2013-03-02 13.38.05

RTPで転送されてるデータだけを抜き出し、音声を再生。

スクリーンショット 2013-04-02 15.33.42

英語で何か言ってます!!・・・が聞き取れません・・・orz

聞き取れる範囲だと

「the key is ? 1 (z|2) 3 (d|z) 0 h 3 4 (a|r)」

って言ってるように聞こえるんですが、色々試してみてもだめ….。

諦めずに色々なパターン試すべきだったのかもですが、時間がなく後回しに。

最終的に時間内にflagを得られませんでした。

今思えば誰かに音声ファイル送りつけて聞いてもらえばよかったですね。

追記:答えは「n1c3t0h24r」のようです


【◯】Programming Question 2

問題:(指定されたサーバ)へ接続しろ

つないでみたところ、以下の様な正規表現で表せる質問に100回答えることで認証を通過できるようでした。

/What is the (\d+)(?:th|rd|st|nd) positive integer whose cube ends with the digits (\d+)?/

意味は「3乗した整数の末尾がxxxになるものの中で、n番目となる値を探せ。」

サーバへ接続し、 問題文を切り出し、答えを返すプログラムを記述すればflagが得られそうです。

ソルバは以下のようになりました。

https://gist.github.com/anonymous/5290100

最初はすべての整数の3乗について、全探索で答えを探していたのですが、

質問の回数が増えるごとに問題文nの値が大きくなり計算量が爆発してしまいました。

そのため上記コードのように答えとしてあり得るパターンを手動で探して、O(1)になるように変更しました。

後は回し続ければそのうち100問解いてくれます。

認証を通過すると、以下のように出力されます。

p2s

 最後にこの問題を計算し、送信すればflagを得られます。


【◯】Misc Question 2

問題:「Here you go. (File)」

指定されたURLからファイルダウンロードし、展開すると「8cb94a0d097f0fc0b34fe9729c6ce11c.img」というファイルが出てきます。

バイナリエディタで開いてみると、0x00の集まりや、何らかのデータっぽい塊が各所に散財していたので、まず第一にこのimgファイルからどこかを切り出せばよいのではないかと思いました。

またずらずら眺めていると、key.tar.gzという文字列も見つけることができました。これの切り出しを試みます。

m2k

binwalkで直接埋め込まれたファイルがないか探します。

スクリーンショット 2013-04-02 15.18.11

0x400400~、gzip形式のデータがみつかりました。

binwalkは–ddオプションをつけることでファイルの切り出しが行えます。ファームウェアのリバース等に使うことが主目的のツールのようです。

また、そのままddコマンドでアドレスと差分を指定し、ファイルとして切り出すこともできます。

binwalk --dd='gzip:tar.gz' 8cb94a0d097f0fc0b34fe9729c6ce11c.img

その後、展開されたファイルを解凍したらflagが得られました。

スクリーンショット 2013-04-02 15.17.28


おわり

過去問や常設問題は暇な時に何度か挑戦してみたことはあるのですが、リアルタイムな大会は経験が少なくてで楽しかったです!

CTFゆるふわ勢としては解きやすい問題がそれなりにあったので嬉しかったですね。

難しい問題に挑戦できなかったのが残念ですが、また時間をとってCTFに参加してみたいと思います。