CTFにチャレンジ
どうも初めましての方は初めまして。Hekunです。
学部二年の夏、「青春したーい!!」と思い立って目をつけたのがこの面白そうなゲーム、CTFなのです。メロスには青春がわからぬ。メロスはヲタクの陰キャである。2chを覗き、ネトゲに入り浸って暮らしてきた。
そもそもCTFとは?
キャプチャー・ザ・フラッグ(CTF)は、コンピュータセキュリティ技術の競技である。CTFは通常、参加者に対しコンピュータを守る経験に加え、現実の世界で発見されたサイバー攻撃への対処を学ぶ教育手法として企画されている。「ハッカーコンテスト」「ハッキング大会」「ハッキング技術コンテスト」「ハッカー大会」などとも訳される。
(Wikipediaより引用)
語彙力が皆無なので"世界の広辞苑"であるウィキ様を引用しました。これを読んだ私は一言、"Cool..." 圧巻です。漫画でいうところだと「シュタインズなんとか」や「ブラッディなんとか」みたいな作品を読んでコンピュータに興味を持ち始めた人だとこの説明文で脳汁ドピュドピュになりそうですね。
具体的にどうやるの?
CpawCTFというサイトにお邪魔させていただきます。こちらはたくさんの問題が常設してあるのでこの問題を解いていきたいと思います。
ルール
以下のルールに従ってください。
問題からflagの文字列を探し、各問題のページでflagをsubmitすれば得点が入ります。
スコアサーバーは攻撃しないでください。
このCTFは常に開催されています。解き方を公開するのはマナー違反です。解き終わった方同士で盛り上がりましょう!
ジャンルは以下の11種類に分類され出題されます.
1.Crypto
2.Web
3.Reversing
4.Pwn
5.Forensic
6.Network
7.PPC
8.Steganography
9.Recon
10.Trivia
11.Misc
各々の詳しい説明はこちらから
それでは...
「対戦よろしくお願いします」
Lv.1
まずはLv.1から!
目次
Q1.[Misc] Test Problem
Q6.[Crypto] Classical Cipher
Q7.[Reversing] Can you execute ?
Q8.[Misc] Can you open this file ?
Q9.[Web] HTML Page
Q10.[Forensics] River
Q11.[Network]pcap
Q12.[Crypto]HashHashHash!
Q14.[PPC]並べ替えろ!
1.Q1.[Misc] Test Problem
この問題の答え(FLAG)は、cpaw{this_is_Cpaw_CTF} です。
下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう!
Enjoy CpawCTF!!!!
これは操作方法説明ですね!脳死で通していきます
Q6.[Crypto] Classical Cipher
暗号には大きく分けて、古典暗号と現代暗号の2種類があります。特に古典暗号では、古代ローマの軍事的指導者ガイウス・ユリウス・カエサル(英語読みでシーザー)が初めて使ったことから、名称がついたシーザー暗号が有名です。これは3文字分アルファベットをずらすという単一換字式暗号の一つです。次の暗号文は、このシーザー暗号を用いて暗号化しました。暗号文を解読してフラグを手にいれましょう。
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
ブルータス、お前もか...
Pythonでやっていきます
# 複号したいコードを変数に入れる
code_data = "fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}"
# 26(Alphabetの数)回ループさせて全通りの文字列を出力
for dist in range(26):
#文字列を作成するための空のString変数を作成
res = ""
#コードの文字列分ループ!
for dec in list(code_data):
#decが大文字だったときの処理
if ord('A') <= ord(dec) <= ord('Z'):
#変更前がAからどれくらい離れているか?
num_Alpha = ord(dec) - ord('A')
#差の分引く
num_Alpha -= dist
#すると何番目のアルファベット?
num_Alpha %= 26
#アルファベットに戻してあげる
res_char = num_Alpha + ord('A')
#できた文字をresに追加
res += chr(res_char)
#decが小文字だったときの処理(大文字と同じ)
elif ord('a') <= ord(dec) <= ord('z'):
num_Alpha = ord(dec) - ord('a')
num_Alpha -= dist
num_Alpha %= 26
res_char = num_Alpha + ord('a')
res += chr(res_char)
#それ以外だったときの処理
else:
#そのまま返します
res += dec
#表示
print(res)
出力結果
fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
ercy{Ecguct_ekrjgt_ku_encuukecn_ekrjgt}
dqbx{Dbftbs_djqifs_jt_dmbttjdbm_djqifs}
cpaw{Caesar_cipher_is_classical_cipher}
bozv{Bzdrzq_bhogdq_hr_bkzrrhbzk_bhogdq}
anyu{Aycqyp_agnfcp_gq_ajyqqgayj_agnfcp}
zmxt{Zxbpxo_zfmebo_fp_zixppfzxi_zfmebo}
ylws{Ywaown_yeldan_eo_yhwooeywh_yeldan}
xkvr{Xvznvm_xdkczm_dn_xgvnndxvg_xdkczm}
wjuq{Wuymul_wcjbyl_cm_wfummcwuf_wcjbyl}
vitp{Vtxltk_vbiaxk_bl_vetllbvte_vbiaxk}
uhso{Uswksj_uahzwj_ak_udskkausd_uahzwj}
tgrn{Trvjri_tzgyvi_zj_tcrjjztrc_tzgyvi}
sfqm{Squiqh_syfxuh_yi_sbqiiysqb_syfxuh}
repl{Rpthpg_rxewtg_xh_raphhxrpa_rxewtg}
qdok{Qosgof_qwdvsf_wg_qzoggwqoz_qwdvsf}
pcnj{Pnrfne_pvcure_vf_pynffvpny_pvcure}
obmi{Omqemd_oubtqd_ue_oxmeeuomx_oubtqd}
nalh{Nlpdlc_ntaspc_td_nwlddtnlw_ntaspc}
mzkg{Mkockb_mszrob_sc_mvkccsmkv_mszrob}
lyjf{Ljnbja_lryqna_rb_lujbbrlju_lryqna}
kxie{Kimaiz_kqxpmz_qa_ktiaaqkit_kqxpmz}
jwhd{Jhlzhy_jpwoly_pz_jshzzpjhs_jpwoly}
ivgc{Igkygx_iovnkx_oy_irgyyoigr_iovnkx}
hufb{Hfjxfw_hnumjw_nx_hqfxxnhfq_hnumjw}
gtea{Geiwev_gmtliv_mw_gpewwmgep_gmtliv}
発見しましたね。。。これでQ6は討伐成功です。3乙しなくてよかったぁ
Q7.[Reversing] Can you execute ?
拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。
この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが…
問題ファイル: exec_me(問題文ページに移動)
筆者「メモ帳で開いて中のコードからファイル形式を特定!人生はゴリ押しや!!!」
(...ドラッグでも始めちゃったかな??)
と、とりあえず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
なんだ...これはぁ
ですが、この文字列を私は見逃しませんでした。
executable
実行できるならしてしまえ~うりゃ~~~!!!
$ ./exec_me
cpaw{Do_you_know_ELF_file?}
チョン↑パァ!!(勝利)
(。´・ω・)ん?よく見るとなにやら聞かれてます。
「E L F フ ァ イ ル っ て 知 っ て る ?」
知らないです。でもさっき出てきてましたよね
exec_me: ELF 64-bit LSB executable
ということで調べてみました。
このELFとは「Executable and Linking Format」の略であり,Red Hatを始めとするLinuxディストリビューションの多くでは標準バイナリ形式として採用されているものだ。
(引用元:実行ファイル形式のELFって何?)
そしてreadelfコマンドでヘッダ情報を取得できるという内容が後述されていたのでやってみます
$ readelf -h ./exec_me
ELF Header:
Magic: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Class: ELF64
Data: 2's complement, little endian
Version: 1 (current)
OS/ABI: UNIX - System V
ABI Version: 0
Type: EXEC (Executable file)
Machine: Advanced Micro Devices X86-64
Version: 0x1
Entry point address: 0x400440
Start of program headers: 64 (bytes into file)
Start of section headers: 4504 (bytes into file)
Flags: 0x0
Size of this header: 64 (bytes)
Size of program headers: 56 (bytes)
Number of program headers: 9
Size of section headers: 64 (bytes)
Number of section headers: 30
Section header string table index: 27
(。´・ω・)?「...はい!!?!?!?」
次、行きます
Q8.[Misc] Can you open this file ?
このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。
どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。
問題ファイル: open_me(クリックすると問題文サイトが開きます)
筆者「前問と一緒で実行すればなんとかなるんじゃね??」
$ ./open_me
bash: ./open_me: cannot execute binary file: Exec format error
と思っていた時代が懐かしいです(遠い目)
まあ読んでみると「実行できないよ~><実行形式が違うよ~><」
はい。
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
open_me: Composite Document File V2 Document
これは、Microsoftのドキュメント形式です。
引用元
調べてみたらWordファイルっぽいですね...
わーお...
Q9.[Web] HTML Page
HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。
ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。
次のWebサイトからフラグを探して下さい。
問題文のサイトに移動します
※この問題のサーバへの攻撃はお止めください。
F12ですね...本当にありがとうございました。
<meta name="description" content="flag is cpaw{9216ddf84851f15a46662eb04759d2bebacac666}">
ありました。
Q10.[Forensics] River
JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。
この情報から、写真に写っている川の名前を特定して欲しい。
問題ファイル: river.jpg(リンクは問題文ページ)
FLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}
鹿児島...というか川あったけど読めない(漢弱すぎる)
"甲突川(こうつきがわ)"らしいです。勉強になりました。
あとは**cpaw{koutsukigawa}**で提出完了です。
Q11.[Network]pcap
ネットワークを流れているデータはパケットというデータの塊です。
それを保存したのがpcapファイルです。
pcapファイルを開いて、ネットワークにふれてみましょう!
pcapファイル
「鍵みーつけた!」
鍵「ミツカッチャッタァ(裏声)」
というかこの鍵、**cpaw{gochi_usa_kami}**って
「ごちうさはいいゾ^~」
Q12.[Crypto]HashHashHash!
ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください!(ヒント:googleで検索)
e4c6bced9edff99746401bd077afa92860f83de3
フラグは
cpaw{ハッシュを戻した値}
です。
Hashtoolkitを利用して一発で出しました(仕組みわからない...><)
はい。。。でたけど悔しい...
Q14.[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で実装します
# 与えられたリストを変数に入れる
Array_num ={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}
# 降順ソート
correctArray = sorted(Array_num,reverse=True)
# 返す文字列の変数を作成
res = "cpaw{"
for num in correctArray:
#文字列に変換して加えていく
res += str(num)
res += "}"
# 表示
print(res)
cpaw{2112102072011931901881711671601591511501461441431361301211191111101091081051031021009994938785828180777672666360585755545250494642413634333127252420191815141210743210}
Lv.1全問完了しましたー!!(パチパチ
最後に
まだ全部チュートリアルみたいな感じでしたので第二回というものを前向きに考えていこうかなって思いました。
それでは、また会う日まで
ぶっ通しで全部やったから言うこと思いつかないのは内緒