自分用勉強メモ5日目

# 調べた知識

## [pcap (Packet CAPture)](https://ja.wikipedia.org/wiki/Pcap)

パケットを扱うAPI．
WinPcap（for Windows）やlibpcap（for Linux）というライブラリで実装されている．
これを利用する有名なツールにtcpdumpやWireSharkがある．

## tcpdumpのオプションの違い(xとか)

紛らわしいと思ったので，書き留める．

- -x 系のオプションをつけるとパケットの中身も出力してくれる．
- 2文字連ねると，データリンク層のヘッダを含める．
- 大文字にすると，16進数表記からASCIIに変換したものも出力する．

表にまとめると下のような感じ．

|                  | リンク層ヘッダなし | あり |
|-----------------:|:-----------------:|:------------------:|
| ASCII表記なし | -x | -xx |
| あり | -X | -XX |

## ハッシュ関数

よく使われるものについて，メモ書き程度に．

- MD5
    - ビット長: 128
    - 16進表記の長さ: 32文字
    - 既知の脆弱性があるため，手元のファイルの同一性チェック程度の使用に留めたほうがいい．（パスワードのハッシュとかに使用しない．）
- SHA1
    - ビット長: 160
    - 16進表記の長さ: 40文字
    - MD5に比べれば頑健だが，これを効率解く方法はすでに存在する．
    - 多くの場面で使用されているが，今後実装するならSHA-2系を使用するほうが安全．
- SHA256
    - ビット長: 256
    - 16進表記の長さ: 64文字
    - SHA-2系の一種．xxxビット長でSHAxxxと表記する．
    - 3つの中では最もセキュア．

参考：[Hash関数まとめ(md5, sha1, sha2, crc32, PBKDF2)](https://kimihiro-n.appspot.com/show/5889981516087296)

## [f文字列](https://note.nkmk.me/python-f-strings/)

フォーマット済み文字列リテラル．
Python3.6から導入された仕組み．
formatメソッドに似ている．
今までずっとformatを使用していたので，これからは代用していく．

# cpawCTF

## [Q11.[Network]pcap](http://ctf.cpaw.site/questions.php?qnum=11)

pcapファイルにフラグが隠されている．
パケットデータも今後扱うと見込んでスクリプトを書いてみた．

```Python
from scapy.all import rdpcap
from subprocess import run
import sys

class MyPackets:

    def __init__(self, pcap_path):
        self.__packets = rdpcap(pcap_path)

    def size(self):
        return len(self.__packets)

    def raws(self):
        raw_data = ''
        for pac in self.__packets:
            raw_data += pac['Raw'].show(dump=True)
        return raw_data

    def useful_strings(self):
        us_list = []
        offset = len('load      = ')
        raw_data = self.raws()
        raw_list = raw_data.split('\n')
        for r in raw_list:
            str_index = r.find('load')
            if str_index < 0:
                continue
            us_list.append(r[str_index+offset:])
        return '\n'.join(us_list)

if __name__ == '__main__':
    packets = MyPackets(sys.argv[1])
    print('num of packets: {}'.format(packets.size()))
    print(packets.useful_strings())
```

useful_stringsメソッドでパケットの中身から有用な文字列を抽出する．
今回はstringsを実行するだけでもフラグが取れたが，Pythonに慣れるためにも手を動かしてみた．

## [Q12.[Crypto]HashHashHash!](http://ctf.cpaw.site/questions.php?qnum=12)

ヒント通り，検索すれば答えが出てくる．

## [Q14.[PPC]並べ替えろ!](http://ctf.cpaw.site/questions.php?qnum=14)

整数をソートする問題．

```Python
import sys

input_line = sys.argv[1]
num_list = input_line.split(',')
sorted_list = sorted(num_list, key=int, reverse=True)
flag = ''.join(sorted_list)
print(f'cpaw{{{flag}}}')
```

f文字列を初めて使用してみた．
載せるほどでもないが，プログラミング力向上のために．

## [Q13.[Stego]隠されたフラグ](http://ctf.cpaw.site/questions.php?qnum=13)

画像のすみに[モールス符号](https://www.wdic.org/w/WDIC/%E3%83%A2%E3%83%BC%E3%83%AB%E3%82%B9%E7%AC%A6%E5%8F%B7#xE8xA8x98xE5x8FxB7xE9xA1x9E)が書かれている．
検索して変換すればいいが，自作してみた．

```Python
import sys

MORSE_DICT = {
    '.-': 'A',
    '-...': 'B',
    '-.-.': 'C',
    '-..': 'D',
    '.': 'E',
    '..-.': 'F',
    '--.': 'G',
    '....': 'H',
    '..': 'I',
    '.---': 'J',
    '-.-': 'K',
    '.-..': 'L',
    '--': 'M',
    '-.': 'N',
    '---': 'O',
    '.--.': 'P',
    '--.-': 'Q',
    '.-.': 'R',
    '...': 'S',
    '-': 'T',
    '..-': 'U',
    '...-': 'V',
    '.--': 'W',
    '-..-': 'X',
    '-.--': 'Y',
    '--..': 'Z',

    '-----': '0',
    '.----': '1',
    '..---': '2',
    '...--': '3',
    '....-': '4',
    '.....': '5',
    '-....': '6',
    '--...': '7',
    '---..': '8',
    '----.': '9',

    '.-.-.-': '.',
    '--..--': ',',
    '..--..': '?',
    '-.-.--': '!',
    '-....-': '-',
    '-..-.': '/',
    '.--.-.': '@',
    '-.--.': '(',
    '-.--.-': ')',
    '.-..-. ': '"',
    '..--.-': '_',
    '---...': ':',
    '.----.': "'",
    '.-.-.': '+',
    '-...-': '=',
    '-.-.-.': ';',
    '...-..-': '$',
}

input_code = sys.argv
ans = ''
for index, hyphen_dot in enumerate(input_code):
    if index == 0:
        continue
    try:
        ans += MORSE_DICT[hyphen_dot]
    except:
        ans += ' '
print(f'cpaw{{{ans.lower()}}}')
```

{}の中にも"cpaw"という文字列が出てくるので，それを削除して入力すれば通る．

## [Q15.[Web] Redirect](http://ctf.cpaw.site/questions.php?qnum=15)

与えられたURLをクリックすると別のサイトにリダイレクトされる．
ブラウザ上で右クリック→「要素を調査」→「ネットワーク」を開いた状態で，先のURLをクリックすると，HTTPヘッダを読むことができる．
ヘッダ内にフラグが隠されている．

参考：[CTF初心者によるCpawCTF Lv2のWriteUp](https://www.htmllifehack.xyz/entry/2018/06/14/203000#Q13Stego%E9%9A%A0%E3%81%95%E3%82%8C%E3%81%9F%E3%83%95%E3%83%A9%E3%82%B0)

## [Q16.[Network+Forensic]HTTP Traffic](http://ctf.cpaw.site/questions.php?qnum=16)

[write-up](https://github.com/caffeinhack/CpawCTF-writeup/blob/master/Level2/HTTP-Traffic.md)を参考にして解いた．

Wiresharkを使えば，HTTPオブジェクトを取り出すことができる．
手順としては以下の通り，

1. pcapファイルをWiresharkで開く．
2. HTTPオブジェクトを取り出して保存する．
3. 拡張子のないファイルが2つあるので，fileコマンドで調べるとHTMLドキュメントであることがわかる．
4. ブラウザで開く．
5. ボタン機能がうまく動作していないので，HTMLを見てみると，`./js/button2.js`に配置しなければならないことがわかるので，jsディレクトリをHTMLソースと同じ階層に作成し，button2.js を配置すればうまく動作する．
6. フラグを取得．