初心者向けであるCpawCTF Level 1のwriteupです。今回はかなり噛み砕いて説明していきます。
常設CTFは勉強する上で有難いですね。
- [Misc] Test Problem
- [Crypto] Classical Cipher
- [Reversing] Can you execute?
- [Misc] Can you open this file?
- [Web] HTML page
- [Forensics] River
- [Network] pcap
- [Crypto] HashHashHash!
- [PPC] 並び替えろ!
[Misc] Test Problem
この問題の答え(FLAG)は、cpaw{this_is_Cpaw_CTF} です。
下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう!
Enjoy CpawCTF!!!!
そのままです。
cpaw{this_is_Cpaw_CTF}
[Crypto] Classical Cipher
暗号には大きく分けて、古典暗号と現代暗号の2種類があります。特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
文字をずらすだけの暗号です。クイズ番組でも日本語をずらした問題とかありますよね。その英語版です。
いつもはrot13と呼ばれる13文字ずらす暗号方式がとても多いのですが、問題文をよく読まず古典暗号といえばrot13だろうとやってしまう早とちり。rot13はアルファベットは26文字あるのでちょうど反対側となる文字にシフトされます。 こちらのサイトではROT0からROT25までやってくれます。ROT23を選び出てきた文字列を提出します。
cpaw{Caesar_cipher_is_classical_cipher}
[Reversing] Can you execute?
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。
この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…
問題ファイル: exec_me
linuxではfileコマンドでファイルがどういうファイルか教えてくれます。
$ file exec_me exec_me: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=663a3e0e5a079fddd0de92474688cd6812d3b550, not stripped
どうやらELFファイルのようです。少し難しいですが、ELFファイルについてのサイトです。
[Linux] バイナリファイル(ELFファイル)の調査に使えるコマンドまとめ - Qiita
ELFファイルは"./(ファイル名)"とやると実行できます。C言語の時よく使ったなぁ。
$ ./exec_me cpaw{Do_you_know_ELF_file?}
ただこのflagの文字列を出力するだけのプログラムですね。
cpaw{Do_you_know_ELF_file?}
[Misc] Can you open this file?
このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。
どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。
問題ファイル: 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
先頭の文字列をググってみます。CTFでは知らない単語出てきたらすぐググるのが攻略への近道です。
linux - Composite Document File V2ドキュメントとは何ですか? [閉まっている] - ITツールウェブ
.docか.xlsファイルのようです。
他にも、バイナリデータの可読部分を表示してくれるstringsコマンドをよく使います。
$ strings open_me bjbj IHDR sRGB pHYs IDATx^ @<8 i^v6{ xX*4 wB/B }{q? *+KZ j4?% =/v>h^r7z] o+?` ?)fe <@6Z :_TOS okm_( v.jH :^678 Y'4z VdDd VJC; |da`D ovWTV[ D_Su _yn@ wr6N h6[. H^D[ RX00 &S?q d~~} >umG +1bW .'!# '}_Ox 4Nb1 _C47{ IEND nn0h 0j0W0 [Content_Types].xml _rels/.rels theme/theme/themeManager.xml sQ}# theme/theme/theme1.xml ?99~vr {a9A dFTl KN1a "AbG,fx 1$y8| rr|| 0j[u Kh.Pds9D oyTL &3IT-$ P+{#, Vn& A8>r pL8< sDUC u_m$# WP;M u&Ie "SoV theme/theme/_rels/themeManager.xml.rels 6?$Q K(M&$R(.1 [Content_Types].xmlPK _rels/.relsPK theme/theme/themeManager.xmlPK theme/theme/theme1.xmlPK theme/theme/_rels/themeManager.xml.relsPK <?xml version="1.0" encoding="UTF-8" standalone="yes"?> <a:clrMap xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" bg1="lt1" tx1="dk1" bg2="lt2" tx2="dk2" accent1="accent1" accent2="accent2" accent3="accent3" accent4="accent4" accent5="accent5" accent6="accent6" hlink="hlink" folHlink="folHlink"/> [c:'wc:' 0 2 3 Normal.dotm Microsoft Office Word Microsoft Word 97-2003 MSWordDoc Word.Document.8
Wordファイルのようなので、cpやmvコマンドでこのファイルに拡張子.docを付けてあげます。
$ cp open_me open_me.doc
開いてみるとワードにflagの書かれた画像を貼り付けています。今後PNG画像ファイルを扱う時によく出てくるIHDRチャンクやIDATチャンクがstringsコマンドを実行した時に出てきていますね。
cpaw{Th1s_f1le_c0uld_be_0p3n3d}
[Web] HTML page
HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。
ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。
次のWebサイトからフラグを探して下さい。
http://q9.ctf.cpaw.site
このサイトは一見するとflagがどこにも無いように見えます。しかし、このサイトのコードはどうでしょうか。F12キーを押すとこのページのソースコードが見れます。そこを色々探しているとhead部分にありました。
cpaw{9216ddf84851f15a46662eb04759d2bebacac666}
[Forensics] River
JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。
この情報から、写真に写っている川の名前を特定して欲しい。
問題ファイル: river.jpg
FLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}
この画像が撮られた川の名前を当てる問題です。問題文にある通りJPEG画像ファイルは様々な情報が付与されているのでそれを見ていきましょう。これらはexiftoolというツールで確認できます。こちらからインストールできます。
$ exiftool river.jpg ExifTool Version Number : 10.80 File Name : river.jpg (省略) GPS Latitude : 31 deg 35' 2.76" N GPS Longitude : 130 deg 32' 51.73" E GPS Position : 31 deg 35' 2.76" N, 130 deg 32' 51.73" E (省略)
このようにすることで、この写真が撮られた場所の座標が手に入りました。この座標をgoogle mapを使って検索してみましょう。
場所の座標を確認して使用する - Google Earth ヘルプ
「31°35'2.76"N, 130°32'51.73"E」と検索すればOKです。
cpaw{koutsukigawa}
[Network] pcap
ネットワークを流れているデータはパケットというデータの塊です。 それを保存したのがpcapファイルです。
pcapファイルを開いて、ネットワークにふれてみましょう!
pcapファイルはWireSharkというソフトを使って色々調べます。CTFではよく出てくるので是非インストールしてください!
WireSharkでpcapファイルを開くと通信パケットを見ることが出来ます。そのパケットをダブルクリックするとflagがありました。
他にもTCPストリームなどを使って通信した文字列を見ることなどができます。今回の問題に限って言えばstringsコマンドでもflagを入手できます。
cpaw{gochi_usa_kami}
[Crypto] HashHashHash!
ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)
e4c6bced9edff99746401bd077afa92860f83de3
フラグは
cpaw{ハッシュを戻した値}
です。
ハッシュ関数とは、あるデータをハッシュ値と呼ばれる数値に変換する関数です。どのように変換するかアルゴリズムは公表されていないので、ハッシュ値から元のデータから予測することは出来ません。しかし、誰でも(ツールなどを使うことによって)ハッシュ値を計算することはできるので、よくある文字列のハッシュ値は知られてます。それをまとめたのがレインボーテーブルです。
このサイトでは、よくある文字列や短い文字列のハッシュ値は記憶しているため、ハッシュ値で検索するとその入力データを求めてくれます。
https://hashtoolkit.com/decrypt-hash/?hash=e4c6bced9edff99746401bd077afa92860f83de3
ハッシュ値から元のデータを求めることをハッシュを破るというのですが、破られないためには元のデータに乱数を加えてハッシュ値を取るなどする必要があります。
cpaw{Shal}
[PPC] 並び替えろ!
下にある配列の中身を大きい順に並べ替えて、くっつけて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というプログラミング言語をよく使うので学んでおきましょう。
本来、ソートにはいくつものアルゴリズムがありその速さなどがよく比較されます。ただ、今回はそんなに難しい話はしません。pythonには勝手にソートしてくれる関数があります。
a = [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] b = sorted(a,reverse=True) flag = "cpaw{" for i in b: flag += str(i) print(flag+"}")
1行目にはaという変数に問題文にある数列を入れます。[]はpythonのリストを表します。他の言語だと配列などと呼ばれます。
2行目でいきなりソートしています。ソートした後のリストをbという変数に入れています。sortedについて、まずリストaを渡します。もう一つのreverse=Trueというのはリストaを降順に並べるよう指定しています。これが無いとbにはリストaを昇順に並べたものが入ります。
3行目以降は、flagを提出しやすいよう出力しています。
cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}
これら全部できたらCTF初心者は卒業と言っても過言ではありません!