マナティ

セキュリティコンテスト旗取り日記

Amazing Language(ジャンル:Web) 第1回

コンピュータセキュリティ技術の人気競技CTF(キャプチャー・ザ・フラッグ)は日本でも幅広く行われるようになってきました。実際にどんな問題が出されるのでしょうか?本連載では『CTF for ビギナーズ』で出題された問題の取り組み方や解き方について解説していきます。

55903_ext_02_0.jpg

はじめに

こんにちはこんにちは、『CTF for ビギナーズ』運営のやぎはしゅです。
最近は各地での勉強会運営には参加できていないのですが、どんどん大きな勉強会になっていく様を遠くの方で眺めています。

今回は、マナティへの連載記事ということで、『CTF for ビギナーズ』(以下ctf4b)で使ってきた問題を幾つか取り上げ、初めてその問題に触れたときにどこを見るのか、何をするのかといった、問題を解いていくときのプロセスを紹介したいと思います。
今CTFに興味があって、いろいろと情報を漁ってはいるのだけれど最初の一歩が踏み出せない、そんな初心者~初心者一歩手前の方々に読んでもらって、本格的にCTFを始めるきっかけにしてもらえれば、と考えています。
上記のような狙いがあるため、普段のWrite-upでは表に出てこない思考や、解く際の下調べのお話まで、スペースの許す限り盛り込んでいきたいと思います。 また、取り扱うのはCTF for ビギナーズで使っていた問題なので、難易度の高くない、比較的短時間で解ける問題ばかりです。気軽に読み物としてでも一読してもらえればと思います。

特に断りのない限り、筆者の普段の環境(私の場合はOS X)を使って問題を解いていきたいと思いますが、必要に応じてWindowsやLinuxを使うこともあるかもしれません。
問題を解く環境については細かく記載するとそれだけで連載が終わってしまうので、あまり言及はしません。
各種コマンド等についての情報は検索の練習も兼ねてご自身で探してみてください。

第1回と第2回は、2015年度のセキュリティキャンプ全国大会での出題をベースは変えずに、問題文等一部を連載用に変更して取り扱いたいと思います。

問題

Amazing Language

ジャンル:Web、得点:400(最高500)

とある経路で入手したこの2つのファイル(problem.zip:クリックでダウンロード)、何やら重要な情報が隠されているようなのだが、どこに隠されているのかさっぱりわからない。隠された情報を見つけ出して欲しい。

解いてみよう

さて、それでは早速ですが実際に解き進めていきたいと思います。

1. 問題ファイルを開いてみる

まずは、問題ファイルが示されているのでダウンロードしてみましょう。ダウンロードしたzipファイルを展開すると、2つの画像ファイルが含まれているのがわかります。

image01-01.png

それぞれsample.pngproblem.pngという2つのファイルがあります。赤と黒だけの無意味な画像ではありますが、通常のビューアで開けますし、一見すると何の細工もない普通の画像ですね。

image01-02.png

問題ファイルを確認したところで次のステップに進みたいと思います。

2. 問題をしっかり読む

この問題に限らず、CTFではたまに見られることなのですが、問題文や問題ファイル自体にヒントが含まれている場合があります。
実は今回の問題でもそういったさりげないヒントが問題文や問題ファイルに含まれています。
この記事では今回の問題で着目すべき箇所と、それに対してどういった推測が成り立つかを紹介したいと思います。

・FLAGはどこにある?

まずはCTF最大の目標であるFLAGが、どこに隠されているのかの目算を立てます。
今回の問題では簡単ですね。「隠された情報を見つけ出して欲しい」との記載から、この「隠された情報」がFLAGであると推測できます。
これから先の流れとして、与えられた画像ファイルからどうにかこうにかしてFLAGを取り出す、という大まかな手順が見えてきました。

・ジャンルはWebなのに…

多くのCTFでは問題のジャンル分けがされています。例えばExploitationやForensics、Web等です。
Exploitationであれば侵入先のサーバ情報が、Forensicsなら解析対象のファイルが問題として与えられます。
Webであれば攻撃する対象のWebサーバが提示されることが多いです。

さて、この問題のジャンルはWebとされていますが、サーバ情報は提示されていません。
あるのは画像ファイルが2つですが、この問題のジャンルはForensics等のファイル解析系のものではなく、あくまでWebです。
つまり、解き進めていく仮定で、何らかの形でWebに関わる要素が登場するという予想が成り立ちます。
今の時点ではどのような関わりがあるのかは不明ですが、重要な情報かもしれません。頭に留めつつ次に進みます。

・sampleとproblem…?

次に問題ファイルに着目します。すでに書いたように、sample.pngproblem.pngという2つのファイルがありました。
気になるのはsample.pngです。サンプルとはどういう意味なのでしょうか。詳細はまだわかりませんが、problem.pngが今回どうにかしなければならないファイルで、その足がかりとしてsample.pngを利用することができそうです。

3. ファイルが与えられたら

ここまでの手順で問題に付随する周辺情報を集めました。そろそろ問題ファイル自体に目を向けていきたいと思います。
CTFで実体のよくわからない画像ファイルが与えられたら、まず試しておきたい簡単な手順があります。
本来であればもっといろいろと試してみるべきかもしれませんが、今回はジャンルがWebであるため、画像ファイル自体の詳細な解析は不要と判断し、とりあえず簡単に実施できる以下の手順を試してみます。

・fileコマンドでファイル種別を確認する

今回与えられた画像ファイルは、本当に画像ファイルなのでしょうか。巧妙に偽装された画像ファイル以外の何か別のファイルだったりしないでしょうか。
そんな疑問を解消するためにfileコマンドを使ってファイル種別を判別します。

image03-01.png

以下の結果が得られました。
どうやら本当にPNG形式の画像ファイルのようです。










 

output:      directory
problem.png: PNG image data, 59 x 58, 8-bit colormap, non-interlaced
sample.png:  PNG image data, 291 x 290, 8-bit colormap, non-interlaced
・foremostでファイルの中に何か隠されていないか確認する

ForensicsやSteganographyジャンルの問題では、ファイルの中に別のファイルを隠すといった手法が用いられることがあります。
そういったファイルを抽出するツールは多数ありますが、ここではforemostというツールを使って、今回の問題ファイルの中に別のファイルが隠されていないかを確認してみます。
この問題がForensicsやSteganographyの問題であれば、foremostだけでは不十分と思われますが、今回はWebの問題であるため、一旦foremostで解析して様子を見ることにします。

image03-02.png

以下の結果が得られました。
何も隠されていない場合はこんな結果になります。
もし何か別のファイルが隠されていた場合は、outputディレクトリに検出されたファイルが格納されます。







 

Processing: problem.png
|*|
Processing: sample.png
|*|

4. Webに頼る

はてさて、とりあえず思いつく手順は試してみましたが、新たなヒントは得られませんでした。
このまま深掘りするのは一度やめて、別の視点で取り組んでみましょう。

今回与えられた画像ファイル、赤と黒だけで構成された比較的特徴的な画像です。
一体何に使われる画像ファイルなのかさっぱりわかりませんし、類似の画像等から何かヒントが得られないか確認してみたいと思います。
そんなときに使うツールはこれ↓です。

image04-01.png

ある画像と関連のある画像や情報を探すのであればこれ以上のツールはありませんよね。
ありとあらゆる情報が氾濫しているWeb上から、今回与えられた画像に関係する情報を洗い出してみましょう。

ここで今までの手順を思い出してください。最初にファイル名もヒントになるかもしれない、と考えたのを覚えているでしょうか。
今回の問題ではsample.pngというファイルが与えられていますね。この画像が何らかのサンプルだとすると、同じサンプルを何か別の用途でも使っているかもしれません。
とりあえずsample.pngでGoogle画像検索をしてみます。

何だか気になる検索結果が表示されました。

image04-02.png

赤枠で囲われた記事:JavaScriptをPNGに圧縮する
http://yomotsu.net/blog/2015/03/01/js2png.html
が非常に興味深いですね。

詳細は元記事に譲りますが、簡単に要約してしまうと、
JavaScriptのソースコードを色情報に変換し、PNGファイルにすることが可能で、自己解凍機能を持たせてそのままJavaScriptとして実行させることもできる、
といった内容になります。

自己解凍機能を持たせるために、PNGファイルの中にHTMLを埋め込むといった工夫をしているようです。
この自己解凍機能については次のステップで確認していきたいと思います。

今回与えられていたsample.pngはjQuery-2.1.3.min.jsを変換したもののようですね。
どうやらこのサンプルファイルは、この記事に辿り着くためのヒントだったようです。
ここまでの情報で、残るもう一つのproblem.pngもJavaScriptのソースコードをPNGファイルに変換したものである可能性が高くなりました。
おそらく元のソースコードにFLAGそのもの、あるいはFLAGに繋がる情報が含まれているとみてよいでしょう。

まとめ

ここまでの手順で謎の画像ファイルの正体がわかりました。次回の連載では画像ファイルから実際にFLAGを取り出すプロセスを紹介します。

著者プロフィール

CTF for ビギナーズ(著者)
コンピュータセキュリティ技術を競う競技であるCTF (Capture The Flag) の初心者を対象とした勉強会。CTFに必要な知識を学ぶ専門講義と実際に問題に挑戦してCTFを体験してもらう演習を行っている。
やぎはしゅ(著者)
主にセキュリティ診断業務に携わるセキュリティコンサルタント。セキュリティ・キャンプ全国大会2013に参加。2015年、同キャンプ講師。ごくありふれた脆弱性であるXSSに魅せられたのがセキュリティとの出会い。