CTFをやってみる
CTFとは、Capture The Flag の略でサイバーセキュリティのコンテストみたいなもの。プログラムやサーバの脆弱性を突いて、flagと呼ばれる回答を盗むことが目的。常設型CTFもあって、今回はCTF登竜門とも呼ばれるCpawCTFをやってみた。
Write Upってなに?
Write Upは自分が行った解法などを紹介することの総称。本稿では初心者が書いてみた。
今回はCpawCTFのLevel 1 まで
Q6.[Crypto] Classical Cipher
シーザー暗号を解読する問題。
適当にシーザー暗号の変換サイトを使ったらできた(https://dencode.com/ja/cipher/caesar)
暗号文: fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
解読文: cpaw{Caesar_cipher_is_classical_cipher}
シフトは -3だったみたい
Q7.[Reversing] Can you execute ?
拡張子がないファイルの実行問題。
問題ファイル: exec_me をkali linuxでファイル情報を見てみる
$ 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という形式らしい。しらべてみるとExecutable and Linking Formatの略称で標準バイナリ形式だということがわかった。
実行した結果がこちら
$ ./exec_me
cpaw{Do_you_know_ELF_file?}
Q8.[Misc] Can you open this file ?
またもや拡張子のないファイルの問題
問題ファイル: open_me
$ 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 05:27:00 2015, Last Saved Time/Date: Mon Oct 12 05:55:00 2015, Number of Pages: 1, Number of Words: 3, Number of Characters: 23, Security: 0
Application: Microsoft Office Word の記載が見つかった。
Wordを使ってファイルを展開したら良さそうだ。
だが、kali linuxにはWordがないので代わりにLibreofficeを使う。
$ sudo apt-get install libreiffice
だがしかし、libreofficeが起動しなかった。原因がわからないので、ChatGPTに聞いた。そしたら、Virtual Boxの設定でリモートディスプレイの有効化をしたら良いらしい。
サーバーの有効化にチェックをいれた。
そしてkali linuxをシャットダウンして起動しなおす
$ sudo poweroff
そのあと無事にLibreofficeがうまく起動でき、open_meを開いた。
そこにはflagがあった。
Q9.[Web] HTML Page
Webページにアクセスしてflagを探す問題。
Webページ: http://q9.ctf.cpaw.site
簡素なHTMLのみで記述されたWebページだった。
Chromeの機能でソースコードを見てみることにした。
右クリック→ページのソースを表示
10行目にflag is cpaw{9216ddf84851f15a46662eb04759d2bebacac666}
との記載が見つかる。
これがflagだった。
Q10.[Forensics] River
画像ファイルのExif情報から緯度経度を調べて川の名前を特定する問題
FLAGの形式は、"cpaw{river_name}"
例:隅田川 → cpaw{sumidagawa}
とのこと。
exiftoolを使って詳細なExif情報を見てみる
$ sudo apt-get install libimage-exiftool-perl
インストールが終わったら使ってみる。
$ exiftool -gpslatitude -gpslongitude river.jpg
GPS Latitude : 31 deg 35' 2.76" N
GPS Longitude : 130 deg 32' 51.73" E
調べた情報をもとにGoogle Mapで緯度経度を調べる。
近くにぽい川が流れていた。
どうやら甲突は "こうつきがわ" と読むらしい
wikipedia参照 (https://ja.wikipedia.org/wiki/%E7%94%B2%E7%AA%81%E5%B7%9D)
つまりflagは cpaw{koutsukigawa} となった。(ヘボン式ローマ字)
Q11.[Network]pcap
pcapファイルを開いて調べる問題。
kali linuxではWire Sharkがプリインストールされているので、即座にファイルを開ける。
開いてみると、図の右下あたりにflagが埋め込まれていた。
cpaw{gochi_usa_kami}
Q12.[Crypto]HashHashHash!
ハッシュ値をレインボーテーブル攻撃で復号する問題。e4c6bced9edff99746401bd077afa92860f83de3 をdecryptしてみる。
Googleで適当に検索したサイトでチャレンジした(https://hashes.com/en/decrypt/hash)
FLAGの形式は、"cpaw{ハッシュを戻した値}" なので
cpaw{Shal}
Q14.[PPC]並べ替えろ!
与えられた配列の中身を降順にソートして、カンマ区切りを消して、そのまま連結させてflagにする問題。
pythonでコードを書く
original = [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]
original.sort(reverse=True)
#print(original)
ans = "".join(map(str, original))
print(f"cpaw{{{ans}}}")
map関数でリスト内をすべてstrに変更するとjoin関数で結合できるようになる。
おわりに
きちんとしたCTFを解こうと思ったのは今日が初めてだった。ついでに記事に残してみようと思って解いた次第です。
全問解いた時間は記事を書く時間と並行して4時間くらい。そのうちツールのインストールや環境構築に使った時間が大半だった。(なんせ新品のPCで取り掛かったもんで...)
拡張子のないファイルの問題が面白かった。ファイルの種類を覗くことって今までなかったな。
またCTFやろ。