CpawCTF Level1

CpawCTF の Level1 についてまとめています。

[Misc] Test Problem


Q. この問題の答え(FLAG)は、cpaw{this_is_Cpaw_CTF} です。下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう!

この問題は解答が問題文に書かれているので、そのまま入力すればOKです。
Answer -> cpaw{this_is_Cpaw_CTF}

[Crypto] Classical Cipher


Q. 暗号には大きく分けて、古典暗号と現代暗号の2種類があります。特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。

暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}

シーザー暗号は、問題文にあるように文字をずらして暗号文を作るものです。例えば1文字後ろにずらすと、a -> b, c -> d というように変換されるので Fika という文字列は、Gjlb になります。
問題文にある暗号文を3文字ずらせば暗号する前の文が得られます。しかし、3文字を前か後ろかどちらにずらすべきかわからないので、最初に何文字か復号してみます。

最初の4文字を前後にずらすと上のように変換されます。この結果から前にずらす方が適切だと考えられます。残った部分を同じようにずらすと答えが得られる。
Answer -> cpaw{Caesar_cipher_is_classical_cipher}

[Reversing] Can you execute ?


Q. 拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが… (exec_me)

ファイルに含まれるデータの種別を認識するために使用する file コマンドがある。ただし、このコマンドは、ファイルの実際の内容ではなく、ファイルの内容が「どのように見えるか」のみを示す。本来のファイル種別とは異なるマジックナンバーを紛れ込ませることで、file プログラムは簡単に騙すことができるようだ。よって、file コマンドは特定の状況以外ではセキュリティツールとして使用できない。
exec_me というファイルをローカルにダウンロードし、実際に file コマンドを実行してみる。(改行しています)

$ file exec_me
ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked,
interpreter /lib64/l, for GNU/Linux 2.6.24,
BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped

ちょっと細かくみていきます。

まとめると、Linux 向けの実行可能ファイルであるため、Ubuntu を OS とした仮想マシンを用意し、exec_me ファイルを転送した。Ubuntu 上でこのファイルを実行すると答えが画面に出力される。

Answer -> cpaw{Do_you_know_ELF_file?}

[Misc] Can you open this file ?


Q. このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。(open_me)

さっきの問題と同様に file コマンドを実行してみる。

$ file open_me
open_me: Composite Document File V2 Document, Little Endian, Os: Windows,
Version 10.0, Code page: 932, Author: ?v??, Template: Normal.dotm,
Last Saved By: ?v??, Revision Number: 1,
Name of Creating Application: Microsoft Office Word, Total Editing Time: 28:00,
Create Time/Date: Mon Oct 12 04:27:00 2015,
Last Saved Time/Date: Mon Oct 12 04:55:00 2015, Number of Pages: 1,
Number of Words: 3, Number of Characters: 23, Security: 0

さっきの問題よりもだいぶ見やすく感じました。この出力によると、Microsoft Office Word で作られたドキュメントファイルであるので、Word でファイルを開いてみると答えが見えてきます。
Answer -> cpaw{Th1s_f1le_c0uld_be_0p3n3d}

[Web] HTML Page


Q. HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。次のWebサイトからフラグを探して下さい。http://q9.ctf.cpaw.site

Web サイトに飛んで、fn + F12 でこのページの HTML, CSS 等の情報を見てみる。すると、<head> の中の <meta> タグに答えが書かれています。

Answer -> cpaw{9216ddf84851f15a46662eb04759d2bebacac666}
何かのハッシュ値みたいですね。

私は最初、ページの中に見えないように色を変えて答えが隠されていると思っていましたが、答えはタグの中でした。ちなみにページの最下部 @ 2015 takahoyo の下に白文字で書かれたヒントが隠されていました。

Do you read description of this page?

まぁこれを見つけなくても、HTML 等を触ったことのある人は F12 は思いつくと思いますが。

[Forensics] River


Q. JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。この情報から、写真に写っている川の名前を特定して欲しい。問題ファイル: river.jpg

写真の詳細を確認します。Mac の場合は「詳細を見る」です。Windows は「プロパティ」ですかね?Mac の場合以下のようなものが表示されます。

私が着目したのは、下の方に書かれている緯度・経度です。この写真は、緯度:31° 35' 2.76" N、経度:130° 32' 51.726" Eのようです。これを Google マップに入力すれば撮影場所にピンをさしてくれます。(私は、31° 35' 2.76" N 130° 32' 51.726" E と入力しました。)どうやらこの川は甲突川という九州にある川のようです。

Answer -> cpaw{koutsukigawa}

[Network]pcap


Q. ネットワークを流れているデータはパケットというデータの塊です。それを保存したのがpcapファイルです。pcapファイルを開いて、ネットワークにふれてみましょう!pcapファイル

pcap ファイルを Wireshark で開きます。すると以下のような画面が出てきます。

パケットが2つのみ確認できます。中央下はパケットの詳細が書かれています。最下にはパケットの生データです。生データの右段に注目すると答えが書いてあります。

Answer -> cpaw{gochi_usa_kami}
どうやら、この問題の作者はアニメ好きのようです。Python では Scapy というライブラリを使用すれば簡単にパケットを作れるので、そのようなライブラリを使えば、何やらメッセージを込めたものが意図的に作れるようですね。今度やってみます。

[Crypto]HashHashHash!


Q. ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)e4c6bced9edff99746401bd077afa92860f83de3

ハッシュ値がわかっているので、それを使ってハッシュされた元の文字列を特定したいらしい。SHA-1 のレインボーテーブルを提供しているサービスがあった。https://sha1.gromweb.com/
これに上記のハッシュ値を使って検索するとハッシュ元がわかる。

Answer -> cpaw{Shal}

[PPC]並べ替えろ!


Q. 下にある配列の中身を大きい順に並べ替えて、くっつけてcpaw{並べ替えた後の値}をフラグとして提出してください。例:もし配列{1,5,3,2}っていう配列があったら、大きい順に並べ替えると{5,3,2,1}となります。そして、フラグはcpaw{5321}となります。同じようにやってみましょう(ただし量が多いので、ソートするプログラムを書いたほうがいいですよ!)

[15,1,93,52,66,31,87,0,42,77,46,24,99,10,19,36,27,4,58,76,2,81,50,102,33,94,20,14,80,82,49,41,12,143,121,7,111,100,60,55,108,34,150,103,109,130,25,54,57,159,136,110,3,167,119,72,18,151,105,171,160,144,85,201,193,188,190,146,210,211,63,207]

Python を使った。

>>> a = [15,1,93,66,...] ← 省略
>>> a.sort( )
>>> a.reverse( )
>>> b = ""
>>> for i in a:
>>>     b += str(i)
>>> print(b)

もともと数字たちがカギカッコで囲われていたのでそのままコピペすればOK。1行目を実行すると a はリスト型になっている。2行目はリストを昇べきの順(小さい順)に並び替えてくれる。3行目はそれを逆順に並べてくれるので、これで降べきの順(大きい順)になる。その後、for 文でリストの各要素を文字列にして b に連結していく。

Answer -> cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}