CpawCTF(level 1)のwriteup

#はじめに
CTF初心者オブ初心者がCpawCTF(リンクは以下)に挑戦したのでそのwriteupを書いていきます．
CpawCTFとは初心者向けに作られたCTFで，PwnからWebまで様々なジャンルをカバーしています．
特にWebは練習する機会も少なく，終わったCTFはサーバが落ちていることも多いので，こういった常設CTFは貴重な気がします．

https://ctf.cpaw.site

#目的
writeupを書いて自分の知識をまとめるのが目的です．解くのに必要な関連知識についても書いたりするかもしれないです．
また，FLAGの中身については本記事では書かないです(他の方が書かれている記事でも書いてなかったので)．
書いている通りにやっていただければFLAGは手に入るので素直に実行してみてください．

#Writeup
#Q1.[Misc] Test Problem
>この問題の答え（FLAG）は、cpaw{this_is_Cpaw_CTF} です。 
下の入力欄にFLAGを入力してSubmitボタンを押して、答えを送信しましょう！ 
Enjoy CpawCTF!!!!

問題文の通りです．与えられたFLAGをsubmitするだけです．

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

シーザー暗号は問題文で書かれている通り，3文字ずらすと復号できる単一換字式暗号の１つです．自分の好きな言語で復号できるコードを書いて実行すればいいだけです．今回はPythonのコードを記載しておきます．

```python
#!/usr/bin/env python3
# -*- coding: utf-8 -*-

def Decryption(str, key):
    plaintext = ""

    for ch in list(str):
        if 'A' <= ch <= 'Z':
            plaintext += chr((ord(ch) - ord('A') + key) % 26 + ord('A'))
        elif 'a' <= ch <= 'z':
            plaintext += chr((ord(ch) - ord('a') + key) % 26 + ord('a'))
        else:
            plaintext += ch

    return plaintext

if __name__ == '__main__':
    ciphertext = input("暗号文を入力してください : ")
    key = input("何文字ずらしますか？ : ")
    plaintext = Decryption(ciphertext, int(key))

    print("平文 : " + plaintext)
```

暗号文を入力し，23文字ずらせば平文が得られます．流石にFLAGの中身を書くのは無粋なので書きませんが，上記のコードと暗号文を入力した後に23と指定すれば平文が得られます．

```
暗号文を入力してください :  fsdz{Fdhvdu_flskhu_lv_fodvvlfdo_flskhu}
何文字ずらしますか？ :  23
平文 : cpaw{}
```

#Q7.[Reversing] Can you execute ?
>拡張子がないファイルを貰ってこのファイルを実行しろと言われたが、どうしたら実行出来るのだろうか。 
この場合、UnixやLinuxのとあるコマンドを使ってファイルの種類を調べて、適切なOSで実行するのが一般的らしいが… 
問題ファイル： exec_me

まず与えられたファイルがどの環境で実行できるのか調べるためにファイルコマンドを使います．

```
~$ file exec_me
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ファイルで実行可能なことが分かります．こういった実行環境やファイルの種類などを調べる解析のことを表層解析と読んだりします．あとは実行すればFLAGゲットです．

```
~$ ./exec_me
cpaw{}
```

#Q8.[Misc] Can you open this file ?
>このファイルを開きたいが拡張子がないので、どのような種類のファイルで、どのアプリケーションで開けば良いかわからない。 
どうにかして、この拡張子がないこのファイルの種類を特定し、どのアプリケーションで開くか調べてくれ。 
問題ファイル： open_me

先程のQ7と同様に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
```

Documentファイルということが分かりますね．しかもWindowsと書いてあるので，Wordで開けばいいでしょう．
開くとFlagが手に入ります．

#Q9.[Web] HTML Page
>HTML(Hyper Text Markup Language)は、Webサイトを記述するための言語です。 
ページに表示されている部分以外にも、ページをより良くみせるためのデータが含まれています。 
次のWebサイトからフラグを探して下さい。 
http://q9.ctf.cpaw.site 
※この問題のサーバへの攻撃はお止めください。

飛ばされた先のサイトにFlagがあるみたいです．今回のCpawCTFではフラグの形式がcpaw{}と指定されているので，ページ内に記述されているなら検索機能を使えば一発で分かります．
Ctrl+Fで「cpaw」とサイト内検索をしてみましょう

![Screenshot from 2019-04-27 22-47-05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367060/23231224-a622-823f-4f9b-326d7b7cc314.png)

フラグとは関係なさそうですね...そこでソースコードを見てみましょう．
Ctrl+UでそのサイトのHTMLコードが見れます．今度はこのソースコード内でもう一度「cpaw」と検索してみましょう．

![Screenshot from 2019-04-27 22-50-15.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367060/dc63f2bc-541a-cabf-8537-cdb6fe0104c3.png)

するとflag is cpaw{}という部分がヒットします．これをsubmitすればポイントゲットです．

#Q10.[Forensics] River
>JPEGという画像ファイルのフォーマットでは、撮影時の日時、使われたカメラ、位置情報など様々な情報(Exif情報)が付加されることがあるらしい。 
この情報から、写真に写っている川の名前を特定して欲しい。 
問題ファイル： river.jpg 
FLAGの形式は、"cpaw{river_name}" 
例：隅田川 → cpaw{sumidagawa}

与えられた画像から川の名前を特定します．特定厨が得意なジャンルの問題ですね．
画像から頑張って特定しても良いのですが，今回はidentifyコマンドを使っていきます．オプションで-verboseと指定することで緯度や経度なんかもみれたりします．

```
~$ identify -verbose river.jpg
Image: river.jpg
  Format: JPEG (Joint Photographic Experts Group JFIF format)
  Mime type: image/jpeg
  Class: DirectClass
  Geometry: 3840x2160+0+0
  Resolution: 72x72
  Print size: 53.3333x30
  Units: PixelsPerInch
  Type: TrueColor
  Endianess: Undefined
  Colorspace: sRGB
  Depth: 8-bit
  Channel depth:
~~~~~~~~~略~~~~~~~~~~~~
　exif:GPSInfo: 638
　exif:GPSLatitude: 31/1, 35/1, 69/25
　exif:GPSLatitudeRef: N
　exif:GPSLongitude: 130/1, 32/1, 64659/1250
　exif:GPSLongitudeRef: E
　exif:GPSVersionID: 2, 3, 0, 0
```

GPSLatitudeとGPSLongitudeに着目します．これは緯度と経度を指しており，経度や緯度はDMS(度分秒)で表記されているので，今回の画像は緯度31度35分2.76秒かつ経度130度32分51.7272秒の座標を指しています．Google mapで検索しやすい様度数のみの表記に変換しましょう．

31+35/60+2.76/3600=緯度31.5841
130+32/60+51.7272/3600=経度130.547702

あとはこの情報をGoogle　mapに入力するだけです．

![]()


甲突川という名前の川を指していることが分かりました．これがFlagです．

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

pcapファイルはWireSharkというパケットの解析を行うソフトウェアで開くことが出来ます．早速ひらいてみましょう．

![Screenshot from 2019-04-28 09-49-40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/367060/0d2ed2ee-3a4b-1d21-8d00-2190de6da6e8.png)

開いたらすぐにわかりますね．下部の16進数でダンプされた箇所にFlagがあります．

#Q12.[Crypto]HashHashHash!
>ハッシュ関数とは、値を入れたら絶対にもとに戻せないハッシュ値と呼ばれる値が返ってくる関数です。 
ですが、レインボーテーブルなどでいくつかのハッシュ関数は元に戻せてしまう時代になってしまいました。 
以下のSHA1というハッシュ関数で作られたハッシュ値を元に戻してみてください！（ヒント：googleで検索） 
e4c6bced9edff99746401bd077afa92860f83de3 
フラグは 
cpaw{ハッシュを戻した値} 
です。

レインボーテーブルとはハッシュから平文を得るためのテーブルです．今回与えられたハッシュ値を検索すれば，SHA-1によってハッシュ化されたことがわかります．あとは復号した値をcpaw{}の中に入れるだけです．

#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
wordlist = [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]
list.sort(wordlist,reverse =True)
for i in range (len(wordlist)):
	print (wordlist[i],end=’’)
```

後は並び替えた値をcpaw{}でくくってsubmitするだけです．

#おわりに
いかがでしたでしょうか．以上がCpawCTFのlevel1 のwriteupになります．CTF自体始めて間もない弱小者なので，強い人からのご指摘お待ちしております．