CTF初心者によるCpawCTF Write Up　～Level 1～

# 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の設定でリモートディスプレイの有効化をしたら良いらしい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/c4776452-6f97-c975-d75c-fbf084153b87.png)

サーバーの有効化にチェックをいれた。
そしてkali linuxをシャットダウンして起動しなおす
```
$ sudo poweroff
```
そのあと無事にLibreofficeがうまく起動でき、open_meを開いた。
そこにはflagがあった。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/f4a34439-a3d4-d7a4-c5b7-3224b446df9c.png)



# 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で緯度経度を調べる。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/ccc7e6fc-865f-dd03-3357-32922b0d9606.png)

近くにぽい川が流れていた。
どうやら甲突は "こうつきがわ" と読むらしい 
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がプリインストールされているので、即座にファイルを開ける。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/65e6dd9d-e1b3-bad7-1d8e-246ae881e9ea.png)

開いてみると、図の右下あたりにflagが埋め込まれていた。
cpaw{gochi_usa_kami}

# Q12.[Crypto]HashHashHash!
ハッシュ値をレインボーテーブル攻撃で復号する問題。e4c6bced9edff99746401bd077afa92860f83de3 をdecryptしてみる。
Googleで適当に検索したサイトでチャレンジした(https://hashes.com/en/decrypt/hash)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3674199/0b8dd949-ac3c-7d8f-d436-4fd75b140092.png)

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やろ。